#include #include "debug.h" #include "kernelmisc.h" BOOL ReadRegistryString(HKEY hRoot, LPTSTR devicekey, LPTSTR valname, TCHAR *strval, int maxlen) { HKEY hDevkey; DWORD rc= RegOpenKeyEx(hRoot, devicekey, 0, 0, &hDevkey); if (rc) { debug("RegOpenKeyEx(%ls): ERROR %08lx\n", devicekey, rc); return FALSE; } DWORD valtype=0; DWORD maxsize= sizeof(TCHAR)*(maxlen-1); rc= RegQueryValueEx(hDevkey, valname, NULL, &valtype, (LPBYTE)strval, &maxsize); if (rc) { debug("RegQueryValueEx('%ls', '%ls', string(%d)): ERROR %08lx\n", devicekey, valname, maxlen, rc); RegCloseKey(hDevkey); return FALSE; } strval[maxlen-1]=0; RegCloseKey(hDevkey); return TRUE; } BOOL ReadRegistryDword(HKEY hRoot, LPTSTR devicekey, LPTSTR valname, DWORD *pvalue) { HKEY hDevkey; DWORD rc= RegOpenKeyEx(hRoot, devicekey, 0, 0, &hDevkey); if (rc) { debug("RegOpenKeyEx(%ls): ERROR %08lx\n", devicekey, rc); return FALSE; } DWORD valtype=0; DWORD maxsize= sizeof(DWORD); rc= RegQueryValueEx(hDevkey, valname, NULL, &valtype, (LPBYTE)pvalue, &maxsize); if (rc) { debug("RegQueryValueEx('%ls', '%ls', DWORD): ERROR %08lx\n", devicekey, valname, rc); RegCloseKey(hDevkey); return FALSE; } RegCloseKey(hDevkey); return TRUE; } bool FindDevKey(const TCHAR *devname, TCHAR *devkey) { HKEY hBuiltIn; LONG rc= RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Drivers\\BuiltIn"), 0, 0, &hBuiltIn); if (rc) { error("RegOpenKeyEx"); return NULL; } bool bRes= false; devkey[0]=0; int i=0; while (true) { TCHAR keyname[16]; DWORD keylen=15; rc=RegEnumKeyEx(hBuiltIn, i++, keyname, &keylen, NULL, NULL, NULL, NULL); if (rc==ERROR_NO_MORE_ITEMS) break; else if (rc) { error("RegEnumKeyEx"); continue; } debug("testing %d - %ls\n", i, keyname); TCHAR prefix[16]; DWORD devidx=0; if (ReadRegistryString(hBuiltIn, keyname, _T("Prefix"), prefix, 16) && _tcsncmp(prefix, devname, _tcslen(prefix))==0 && ReadRegistryDword(hBuiltIn, keyname, _T("Index"), &devidx) && devidx == _tcstoul(devname+_tcslen(prefix),0,10)) { debug("FOUND\n"); _tcscpy(devkey, _T("Drivers\\BuiltIn\\")); _tcscat(devkey, keyname); bRes= true; break; } } RegCloseKey(hBuiltIn); return bRes; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DebugSetLogfile("loaddev.log"); TCHAR devkey[260]; if (!FindDevKey(lpCmdLine, devkey)) { debug("error finding dev handle for %ls\n", lpCmdLine); return 1; } KernelMode _km; debug("activating dev %ls\n", devkey); HANDLE hDev= ActivateDevice(devkey, 0); if (hDev==NULL) { error("ActivateDevice(%08lx - %ls)", hDev, devkey); return 1; } debug("dev=%08lx\n", hDev); return 0; }