C++ : Disabling a device driver in Windows

标签 c++ windows driver wmi

谁能帮我解释一下为什么这段代码没有禁用 cdrom 驱动程序?它构建正确。我调试了每一行,一切正常。我删除了错误处理代码和清理代码。

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 驱动程序都接受“停止”控制请求,即使他们说接受。您甚至无法从以管理员身份运行的命令行中停止 cdrom 驱动程序,例如:“sc stop cdrom”。

要禁用 Windows 驱动程序,必须将其设置为 SERVICE_DEMAND_START 并重新启动。同样,您可能无法禁用所有驱动程序。某些驱动程序的错误控件为 0x3,这意味着如果这些驱动程序无法启动,Windows 将回退到最后一个已知的良好控件集。

使用可以从管理命令提示符停止的服务/驱动程序来尝试您的代码可能是个好主意。 此外,您可能希望在执行“StopService”方法之前检查“AcceptStop”属性。

您可能还需要 CoSetProxyBlanket,如示例 here 中所述.

关于C++ : Disabling a device driver in Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29338553/

相关文章:

c++ - 数据类型问题

c++ - 遇到某个词时停止文件输入

windows - 无法在 Eclipse 中运行 junit 测试

oracle - SSIS 包访问 Oracle DB。如何知道您使用的是 32 位还是 64 位 Oracle 驱动程序?

linux-kernel - 使用简单的字符驱动程序作为控制台启动Linux内核?

Android waveshare 触摸屏

c++ - 在不复制数据的情况下拆分 OpenCV Mat

c++ - 如何编写编译器后端以从 C 代码为用户定义的硬件架构生成程序集

c++ - Windows - SDL_PumpEvents 重置为系统光标

windows - 如何使用设备实例句柄获取 USB 设备句柄?