#include #include "debug.h" #include "stringutils.h" #include "service.h" /* [HKLM\drivers\Active\22] BusName="BuiltInPhase1_0_12_0" BusParent=dword:000323d0 Hnd=dword:0044d390 InterfaceType=dword:00000000 Key="Drivers\BuiltIn\Thunkdev" Name="RDO2:" [HKLM\drivers\Active\14] BusName="BuiltInPhase1_0_11_0" BusParent=dword:000323d0 Hnd=dword:0003d3c0 InterfaceType=dword:00000000 Key="Drivers\BuiltIn\QRADIO" Name="RDO1:" [HKLM\drivers\BuiltIn\QRADIO] Dll="logdev.dll" Index=dword:00000001 Order=dword:00000002 Prefix="RDO" Priority256=dword:00000093 target="RDO2:" [HKLM\drivers\BuiltIn\Thunkdev] Dll="radio.dll" Index=dword:00000002 Order=dword:00000003 Prefix="RDO" Priority256=dword:00000093 */ 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; } HANDLE FindDevHandle(const TCHAR *devname) { DWORD devhnd=0; HKEY hActive; LONG rc= RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Drivers\\Active"), 0, 0, &hActive); if (rc) { error("RegOpenKeyEx"); return NULL; } int i=0; while (true) { TCHAR keyname[16]; DWORD keylen=15; rc=RegEnumKeyEx(hActive, i++, keyname, &keylen, NULL, NULL, NULL, NULL); if (rc==ERROR_NO_MORE_ITEMS) break; else if (rc) { error("RegEnumKeyEx"); continue; } TCHAR regdev[16]; if (ReadRegistryString(hActive, keyname, _T("Name"), regdev, 16) && _tcscmp(regdev, devname)==0 && ReadRegistryDword(hActive, keyname, _T("Hnd"), &devhnd)) break; } RegCloseKey(hActive); return (HANDLE)devhnd; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DebugSetLogfile("unloaddev.log"); StringList args; if (!SplitString(ToString(lpCmdLine), args, false)) { error("Error in commandline"); return false; } bool bService= false; std::string devname; for (StringList::iterator i= args.begin() ; i!=args.end() ; ++i) { std::string& arg= *i; if (arg[0]=='-') switch(arg[1]) { case 's': bService= true; break; } else { devname= arg; } } if (!bService) { HANDLE hDev= FindDevHandle(ToTString(devname).c_str()); if (hDev==NULL) { debug("error finding dev handle for %hs\n", devname.c_str()); return 1; } if (!DeactivateDevice(hDev)) { error("DeactivateDevice(%08lx - %hs)", hDev, devname.c_str()); return 1; } } else { HANDLE hDev= GetServiceHandle(const_cast(ToTString(devname).c_str()), NULL, NULL); if (hDev==NULL || hDev==INVALID_HANDLE_VALUE) { error("error finding svc handle for %hs\n", devname.c_str()); return 1; } if (!DeregisterService(hDev)) { error("DeregisterService(%08lx - %hs)", hDev, devname.c_str()); return 1; } } return 0; }