亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? filtject.cpp

?? 一本在講述USB驅動程式的書 及其范例原碼
?? CPP
字號:
// FILTJECT.CPP -- Inject or remove filter driver for a specified device
// Copyright (C) 1999 by Walter Oney
// All rights reserved


#include "stdafx.h"

LPTSTR* CommandLineToArgv(LPTSTR cmdline, int* pargc);

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
	{							// DllMain
    return TRUE;
	}							// DllMain

///////////////////////////////////////////////////////////////////////////////

extern "C" void WINAPI InjectFilter(HWND hwnd, HINSTANCE hInst, LPCTSTR rawline, int nshow)
	{							// InjectFilter
	HDEVINFO hinfoset = INVALID_HANDLE_VALUE;

	// Determine which platform we're running on. You'll see why a bit later...

	OSVERSIONINFO vi = {sizeof(OSVERSIONINFO)};
	GetVersionEx(&vi);
	BOOL win98 = vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS;

	// Parse arguments. We expect to be called this way:
	// rundll32 filtject,InjectFilter devname filtname [-Add | -Remove] [-Upper | -Lower] [-First | -LAst | -Before name | -AFter name]
	// Default is to inject 1st upper filter

	int argc;
	LPTSTR cmdline = _tcsdup(rawline);
	LPTSTR* argv = CommandLineToArgv(cmdline, &argc);
	if (!argv)
		{
		free(cmdline);
		return;
		}

	LPTSTR devname = NULL;
	LPTSTR filtname = NULL;
	LPTSTR existing = NULL;
	BOOL upper = TRUE;
	BOOL add = TRUE;
	
	enum POSITION {FIRST, LAST, BEFORE, AFTER, REMOVE} pos = FIRST;

	for (int iarg = 0; iarg < argc; ++iarg)
		{						// inspect arguments
		LPTSTR arg = argv[iarg];
		if (arg[0] == _T('-') || arg[0] == _T('/'))
			{					// parse option
			++arg;
			_tcslwr(arg);
			int len = _tcslen(arg);
			if (memcmp(arg, _T("upper"), min(len, 5) * sizeof(TCHAR)) == 0)
				upper = TRUE;
			else if (memcmp(arg, _T("lower"), min(len, 5) * sizeof(TCHAR)) == 0)
				upper = FALSE;
			else if (memcmp(arg, _T("first"), min(len, 5) * sizeof(TCHAR)) == 0)
				pos = FIRST;
			else if (memcmp(arg, _T("last"), min(len, 4) * sizeof(TCHAR)) == 0)
				pos = LAST;
			else if (memcmp(arg, _T("add"), min(len, 3 * sizeof(TCHAR))) == 0)
				pos = FIRST;
			else if (memcmp(arg, _T("remove"), min(len, 6) * sizeof(TCHAR)) == 0)
				pos = REMOVE;
			else
				{				// before or after something
				if (iarg == argc - 1)
					goto badargs;
				existing = argv[++iarg];
				if (memcmp(arg, _T("before"), min(len, 6) * sizeof(TCHAR)) == 0)
					pos = BEFORE;
				else if (memcmp(arg, _T("after"), min(len, 5) * sizeof(TCHAR)) == 0)
					pos = AFTER;
				else
					goto badargs;
				}				// before or after something
			}					// parse option

		else if (!devname)
			devname = arg;
		else if (!filtname)
			filtname = arg;
		else
			goto badargs;
		}						// inspect arguments

	if (!devname || !filtname)
		goto badargs;			// didn't get both required parameters

	if (pos == REMOVE)
		existing = filtname;	// so we'll search for it later on

	// Use SetupDi functions to locate each instance of the specified device

	hinfoset = SetupDiGetClassDevs(NULL, NULL, hwnd, DIGCF_PRESENT | DIGCF_ALLCLASSES);
	if (hinfoset == INVALID_HANDLE_VALUE)
		goto error;

	{							// local scope
	DWORD propcode = upper ? SPDRP_UPPERFILTERS : SPDRP_LOWERFILTERS;
	LPTSTR valname = upper ? _T("UpperFilters") : _T("LowerFilters");
	SP_DEVINFO_DATA devinfo = {sizeof(SP_DEVINFO_DATA)};

	for (DWORD devindex = 0; SetupDiEnumDeviceInfo(hinfoset, devindex, &devinfo); ++devindex)
		{						// for each device
		DWORD junk;
		TCHAR value[512];
		BOOL found = FALSE;
		if (SetupDiGetDeviceRegistryProperty(hinfoset, &devinfo, SPDRP_FRIENDLYNAME, &junk, (PBYTE) value, sizeof(value), NULL)
			&& _tcsicmp((LPCTSTR) value, devname) == 0)
			found = TRUE;
		if (!found
			&& SetupDiGetDeviceRegistryProperty(hinfoset, &devinfo, SPDRP_DEVICEDESC, &junk, (PBYTE) value, sizeof(value), NULL)
			&& _tcsicmp((LPCTSTR) value, devname) == 0)
			found = TRUE;
		if (!found)
			continue;			// not this device

		DWORD len;				// length of existing value
		HKEY hkey;				// (Win98) registry key handle
		DWORD regtype;			// (Win98) registry data type

		// If running in Win98, open the hardware key and use regular registry functions to get and store
		// the Upper/Lower Filters value. This is necessary because SetupDiSetDeviceRegistryProperty doesn't
		// store a correctly terminated MULTI_SZ value.

		if (win98)
			{					// open registry key
			hkey = SetupDiOpenDevRegKey(hinfoset, &devinfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_ALL_ACCESS);
			if (hkey == INVALID_HANDLE_VALUE)
				continue;		// can't open hardware key
			len = sizeof(value);
			if (RegQueryValueEx(hkey, valname, NULL, &regtype, (PBYTE) value, &len) != 0 || len == 0)
				{				// no existing list
				len = sizeof(TCHAR);
				value[0] = 0;
				regtype = REG_BINARY;
				}				// no existing list
			}					// open registry key

		// If running in Win2K, SetupDiSetDeviceRegistryProperty works correctly

		else
			{					// use setup function
			if (!SetupDiGetDeviceRegistryProperty(hinfoset, &devinfo, propcode, &junk, (PBYTE) value, sizeof(value), &len) || len == 0)
				len = sizeof(TCHAR), value[0] = 0;		// empty filter list
			}					// use setup function

		// Locate the spot in the existing list of filters where we should insert the new one (or remove the old one)

		LPTSTR insert = value;
		if (pos == LAST)
			{					// put this filter last
			while (*insert)
				insert += _tcslen(insert) + 1;
			}					// put this filter last
		else if (pos != FIRST)
			{					// before or after something
			while (*insert && _tcsicmp(existing, insert) != 0)
				insert += _tcslen(insert) + 1;
			if (*insert && pos == AFTER)
				insert += _tcslen(insert) + 1;
			if (!*insert && pos == BEFORE)
				insert = value;	// default if "before" filter not found
			}					// before or after something

		// Calculate the number of existing bytes preceding the insertion/deletion spot

		int ncopy = (insert - value) * sizeof(TCHAR);

		// If removing a filter, construct a smaller filter string

		if (pos == REMOVE)
			{					// remove filter
			if (*insert)
				{				// filter was actually in the list
				LPTSTR remove = insert + _tcslen(insert) + 1;
				len -= (_tcslen(existing) + 1) * sizeof(TCHAR);
				ncopy = len - ncopy;
				memcpy(insert, remove, ncopy);
				if (len == sizeof(TCHAR))
					len = 0;	// nothing left

				// Rewrite the filter list

				if (win98)
					{			// remove via registry call
					if (len)
						RegSetValueEx(hkey, valname, 0, regtype, (PBYTE) value, len);
					else
						RegDeleteValue(hkey, valname);
					}			// remove via registry call
				else
					SetupDiSetDeviceRegistryProperty(hinfoset, &devinfo, propcode, (PBYTE) value, len);
				}				// filter was actually in the list
			}					// remove filter

		// Construct a new list of filter drivers

		else
			{					// add filter
			DWORD newlen;
			newlen = len + (_tcslen(filtname) + 1) * sizeof(TCHAR);

			LPTSTR newvalue = (LPTSTR) malloc(newlen);
			if (!newvalue)
				{					// can't get memory
				if (win98)
					RegCloseKey(hkey);
				continue;			// can't get this tiny bit of memory??
				}					// can't get memory

			PBYTE pcopy = (PBYTE) newvalue;
			if (ncopy)
				memcpy(pcopy, value, ncopy);
			pcopy += ncopy;

			if (add)
				{					// insert new name
				_tcscpy((LPTSTR) pcopy, filtname);
				pcopy += (_tcslen(filtname) + 1) * sizeof(TCHAR);

				ncopy = len - ncopy;
				memcpy(pcopy, insert, ncopy);
				}					// insert new name
			else
				{					// remove name
				}					// remove name

			// Install the new filter list

			if (win98)
				RegSetValueEx(hkey, valname, 0, regtype, (PBYTE) newvalue, newlen);
			else
				SetupDiSetDeviceRegistryProperty(hinfoset, &devinfo, propcode, (PBYTE) newvalue, newlen);

			free(newvalue);
			}						// add filter

		if (win98)
			RegCloseKey(hkey);
		}						// for each device
	}							// local scope

cleanup:
	if (hinfoset != INVALID_HANDLE_VALUE)
		SetupDiDestroyDeviceInfoList(hinfoset);
	free(argv);
	free(cmdline);
	return;

badargs:
	OutputDebugString(_T("InjectFilter - invalid arguments\n"));
	goto cleanup;

error:
	OutputDebugString(_T("InjectFilter - error trying to inject filter\n"));
	goto cleanup;
	}							// InjectFilter

///////////////////////////////////////////////////////////////////////////////
// Note -- CommandLineToArgvW exists already, but not the ANSI equivalent @&*%!

LPTSTR* CommandLineToArgv(LPTSTR cmdline, int* pargc)
	{							// CommandLineToArgv
	int argc = 0;
	while (*cmdline == _T(' ') || *cmdline == _T('\t'))
		++cmdline;				// skip leading blanks

	LPTSTR arg = cmdline;
	while (*arg)
		{						// count arguments
		TCHAR ch;
		while ((ch = *arg) == _T(' ') || ch == _T('\t'))
			*arg++ = _T(' ');	// skip leading blanks, replace tabs with blanks
		if (!ch)
			break;				// end of command line
		
		++argc;
		
		if (ch == _T('\"'))
			{					// quoted arg
			*arg++ = _T(' ');	// replace leading quote with space
			while ((ch = *arg) && ch != _T('\"'))
				++arg;			// find trailing quote
			}					// quoted arg
		else
			{					// unquoted arg
			while ((ch = *arg) && ch != _T(' ') && ch != _T('\t'))
				++arg;			// find space after arg
			}					// unquoted arg

		if (ch)
			*arg++ = 0;			// change ending delimiter to nul
		}						// count arguments

	if (!argc)
		return NULL;			// no arguments

	LPTSTR* argv = (LPTSTR*) malloc(argc * sizeof(LPTSTR));
	if (!argv)
		return NULL;			// can't allocate memory

	arg = cmdline;
	for (int iarg = 0; iarg < argc; ++iarg)
		{						// fill in argv array
		TCHAR ch;
		while ((ch = *arg) == _T(' '))
			++arg;				// skip to start of arg
		argv[iarg] = arg;
		arg += _tcslen(arg) + 1;	// skip to end of arg
		}						// fill in argv array

	*pargc = argc;
	return argv;
	}							// CommandLineToArgv

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人精品一区| 亚洲美女淫视频| 午夜精品久久久久| 丁香婷婷综合五月| 欧美一区二区三区在线观看视频| 中文字幕免费观看一区| 免费在线观看日韩欧美| 日本精品视频一区二区| 亚洲国产精品激情在线观看| 午夜精品aaa| 大尺度一区二区| 日韩欧美一级精品久久| 午夜视黄欧洲亚洲| 91蝌蚪国产九色| 国产精品国产三级国产普通话99 | 亚洲与欧洲av电影| 东方aⅴ免费观看久久av| 日韩欧美中文字幕精品| 亚洲国产精品嫩草影院| bt欧美亚洲午夜电影天堂| 337p粉嫩大胆色噜噜噜噜亚洲| 天堂资源在线中文精品| 一本一本久久a久久精品综合麻豆| 国产亚洲精品久| 国产一区二区精品久久91| 日韩一区二区三区电影 | 国产精品久久99| 国产另类ts人妖一区二区| 日韩欧美亚洲另类制服综合在线| 视频一区二区欧美| 欧美网站一区二区| 亚洲激情五月婷婷| 色婷婷香蕉在线一区二区| 综合久久久久久| 91麻豆国产自产在线观看| 亚洲视频你懂的| 色香色香欲天天天影视综合网| 国产精品久久久久久福利一牛影视| 国产成人亚洲精品狼色在线| 国产欧美一区二区精品性色| 国产精品自拍网站| 国产日韩欧美一区二区三区乱码 | 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 亚洲高清不卡在线| 欧美亚洲动漫精品| 亚洲一二三区不卡| 欧美美女网站色| 日韩av中文在线观看| 日韩一区二区三区四区| 激情综合色播五月| 久久久蜜臀国产一区二区| 国产成人午夜精品5599| 欧美激情综合五月色丁香小说| 处破女av一区二区| 亚洲同性同志一二三专区| 色伊人久久综合中文字幕| 玉足女爽爽91| 欧美精品xxxxbbbb| 狠狠色伊人亚洲综合成人| 国产日产欧美精品一区二区三区| 不卡av在线免费观看| 夜夜精品浪潮av一区二区三区 | 国产精品一二一区| 国产精品午夜久久| 色综合天天综合狠狠| 亚洲一级片在线观看| 日韩一区二区在线看| 狠狠色狠狠色综合系列| 国产精品美女久久久久aⅴ国产馆| 91玉足脚交白嫩脚丫在线播放| 一区二区三区久久| 欧美一区二区久久| 国产成人av电影在线| 亚洲男人的天堂av| 制服丝袜一区二区三区| 极品美女销魂一区二区三区免费| 中文乱码免费一区二区| 欧美亚洲高清一区二区三区不卡| 日韩精品福利网| 久久久久久久久久久99999| 97se亚洲国产综合自在线不卡| 亚洲一级片在线观看| 26uuu精品一区二区| 97精品超碰一区二区三区| 日韩电影一区二区三区四区| 久久新电视剧免费观看| 91理论电影在线观看| 蜜桃av噜噜一区二区三区小说| 欧美国产一区在线| 欧美性猛交xxxx乱大交退制版| 裸体健美xxxx欧美裸体表演| 国产精品久久久久影院亚瑟| 欧美久久久久免费| 成人免费视频网站在线观看| 亚洲第一福利一区| 久久久99精品免费观看| 欧美性大战久久久| 国产乱码精品1区2区3区| 一区二区三区欧美在线观看| 精品国产自在久精品国产| 一本一道综合狠狠老| 国内成+人亚洲+欧美+综合在线| 亚洲日本一区二区三区| 日韩精品一区在线观看| 91麻豆免费在线观看| 激情综合五月天| 亚洲综合色视频| 亚洲国产经典视频| 欧美一区二区视频免费观看| 99久久国产综合色|国产精品| 麻豆91免费看| 亚洲综合色区另类av| 久久久精品蜜桃| 欧美卡1卡2卡| 91麻豆高清视频| 国产成人午夜精品5599| 蜜臀va亚洲va欧美va天堂| 亚洲美女视频在线观看| 中文字幕欧美国产| 日韩欧美另类在线| 欧美日韩国产123区| 99久久99久久免费精品蜜臀| 一区二区三区在线观看动漫| 激情久久久久久久久久久久久久久久| 亚洲欧美国产毛片在线| 国产亲近乱来精品视频| 日韩午夜电影av| 欧美性受xxxx黑人xyx性爽| 国产经典欧美精品| 免费久久99精品国产| 亚洲一区二区三区爽爽爽爽爽| 国产精品三级在线观看| 精品国产一区二区三区四区四| 欧美日韩在线观看一区二区| 色哟哟在线观看一区二区三区| 国产成人aaa| 国产麻豆精品theporn| 精品一区二区三区欧美| 奇米777欧美一区二区| 亚洲bdsm女犯bdsm网站| 一区二区三区在线视频播放| 中文字幕第一区第二区| 国产欧美日韩精品一区| 久久亚洲综合色一区二区三区| 日韩免费高清av| 制服视频三区第一页精品| 欧美视频一二三区| 欧美性xxxxx极品少妇| 国产在线看一区| 亚洲精品免费视频| 1区2区3区精品视频| 国产精品久久久久一区二区三区共| 69成人精品免费视频| 在线观看视频欧美| 欧美亚洲国产bt| 欧美日韩中文一区| 欧美另类z0zxhd电影| 欧美精品高清视频| 欧美精品在线一区二区| 欧美人牲a欧美精品| 欧美久久久久久久久久| 欧美精品九九99久久| 欧美一区二区三区四区五区| 884aa四虎影成人精品一区| 制服视频三区第一页精品| 91精品一区二区三区在线观看| 91麻豆精品国产无毒不卡在线观看| 欧美久久高跟鞋激| 日韩欧美你懂的| 久久综合色鬼综合色| 国产亚洲精品aa| 国产精品美女久久久久aⅴ| 亚洲日本电影在线| 亚洲一区二区在线观看视频| 午夜久久久久久电影| 老色鬼精品视频在线观看播放| 久久精品国产99| 国产精品一区二区黑丝| 不卡视频一二三四| 91国在线观看| 欧美一级在线免费| 久久亚洲一级片| 中文字幕亚洲区| 亚洲图片自拍偷拍| 美美哒免费高清在线观看视频一区二区 | www久久精品| 日韩精品一区二| 日韩精品一区二区三区在线播放| 欧美tk—视频vk| 国产精品丝袜黑色高跟| 亚洲摸摸操操av| 丝袜美腿高跟呻吟高潮一区| 国产在线视频精品一区| 成av人片一区二区| 欧美日本国产视频| 欧美精品一区视频| 亚洲免费观看高清完整| 日日夜夜免费精品| 国产成人8x视频一区二区| 欧美最猛性xxxxx直播|