C++:在 Windows 中禁用设备驱动程序
C++ : Disabling a device driver in Windows
谁能帮我解释一下为什么这段代码没有禁用 cdrom driver
?它构建 correctly.I 调试每一行,一切正常。我已经删除了错误处理代码和清理代码。
int main(int argc, char* argv[])
{
IWbemServices *pSvc = NULL;
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
hres = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,LPVOID *)&pLoc);
hres = pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),NULL,NULL,0,NULL,0,0,&pSvc);
BSTR MethodName = SysAllocString(L"StopService");
BSTR ClassName = SysAllocString(L"Win32_SystemDriver");
IWbemClassObject* pClass = NULL;
hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, NULL);
VARIANT varCommand;
IWbemClassObject* pOutParams = NULL;
hres = pSvc->ExecMethod(L"Win32_SystemDriver.Name=\"cdrom\"", MethodName, 0,
NULL,NULL, &pOutParams, NULL);
VARIANT varReturnValue;
hres = pOutParams->Get(L"ReturnValue", 0, &varReturnValue, NULL, 0);
if (!FAILED(hres))
wcout << "ReturnValue " << varReturnValue.intVal << endl;
VariantClear(&varReturnValue);
// Clean up
SysFreeString(ClassName);
SysFreeString(MethodName);
return 0;
}
请帮忙..
并非所有 windows driver 都接受 'stop' 控制请求,即使他们说他们接受。即使是 command-line 运行 管理员也无法停止 cdrom driver,例如:"sc stop cdrom"。
要禁用 windows driver,必须将其设置为 SERVICE_DEMAND_START 并重新启动。同样,您可能无法禁用所有 driver。一些 driver 的错误控制为 0x3,这意味着如果那些 driver 无法启动,windows 将回退到最后一个已知的良好控制集。
尝试使用可以从管理命令提示符停止的 service/driver 代码可能是个好主意。
此外,您可能需要在执行 "StopService" 方法之前检查 "AcceptStop" 属性。
您可能还需要 CoSetProxyBlanket,如示例中所述 here。
谁能帮我解释一下为什么这段代码没有禁用 cdrom driver
?它构建 correctly.I 调试每一行,一切正常。我已经删除了错误处理代码和清理代码。
int main(int argc, char* argv[])
{
IWbemServices *pSvc = NULL;
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
hres = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,LPVOID *)&pLoc);
hres = pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),NULL,NULL,0,NULL,0,0,&pSvc);
BSTR MethodName = SysAllocString(L"StopService");
BSTR ClassName = SysAllocString(L"Win32_SystemDriver");
IWbemClassObject* pClass = NULL;
hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod(MethodName, 0, &pInParamsDefinition, NULL);
VARIANT varCommand;
IWbemClassObject* pOutParams = NULL;
hres = pSvc->ExecMethod(L"Win32_SystemDriver.Name=\"cdrom\"", MethodName, 0,
NULL,NULL, &pOutParams, NULL);
VARIANT varReturnValue;
hres = pOutParams->Get(L"ReturnValue", 0, &varReturnValue, NULL, 0);
if (!FAILED(hres))
wcout << "ReturnValue " << varReturnValue.intVal << endl;
VariantClear(&varReturnValue);
// Clean up
SysFreeString(ClassName);
SysFreeString(MethodName);
return 0;
}
请帮忙..
并非所有 windows driver 都接受 'stop' 控制请求,即使他们说他们接受。即使是 command-line 运行 管理员也无法停止 cdrom driver,例如:"sc stop cdrom"。
要禁用 windows driver,必须将其设置为 SERVICE_DEMAND_START 并重新启动。同样,您可能无法禁用所有 driver。一些 driver 的错误控制为 0x3,这意味着如果那些 driver 无法启动,windows 将回退到最后一个已知的良好控制集。
尝试使用可以从管理命令提示符停止的 service/driver 代码可能是个好主意。 此外,您可能需要在执行 "StopService" 方法之前检查 "AcceptStop" 属性。
您可能还需要 CoSetProxyBlanket,如示例中所述 here。