Windows设备使用C ++卸载

时间:2012-10-06 04:25:07

标签: c++ windows winapi device

我需要以编程方式卸载所有Com端口设备。问题是这些Com端口设备不存在,因此完全隐藏。这意味着,即使您要使用设备管理器卸载它们,首先必须将devmgr_show_nonpresent_devices = 1添加到环境变量中,然后在设备管理器中显示隐藏的设备。然后,您可以右键单击每个设备并卸载。我不想卸载相关的驱动程序。我在高级系统设置下添加该变量,创建并保存新的用户变量。

我尝试使用devcon执行此操作。可以使用devcon findall找到它们,但我无法删除它们,因为command to remove它们无法说明没有卸载任何设备。此外,没有标志让它寻找不存在的设备。如果我执行标准devcon find,则找不到任何设备(感兴趣)。

所以,我回到被迫使用我自己的代码弄清楚如何做到这一点,这就是我被卡住的地方。以下是我到目前为止的情况:

// Get all of the devices
PCTSTR enumType = "PORTS";
HDEVINFO devs = NULL;
devs = SetupDiGetClassDevs(NULL,enumType,0,DIGCF_PRESENT | DIGCF_ALLCLASSES);

// Loop through the devices
DWORD devCount = 0;
SP_DEVINFO_DATA devInfo;
int enumeratingDevices = 1;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
while(enumeratingDevices){
    enumeratingDevices = SetupDiEnumDeviceInfo (devs,devCount,&devInfo);
    // Uninstall each device
    cout << SetupDiRemoveDevice(devs,&devInfo);
    cout << SetupDiCallClassInstaller(DIF_REMOVE,&devInfo,NULL);
    devCount++;
}
cout << devCount;
SetupDiDestroyDeviceInfoList(devs);
return 0;

现在我的输出为001。因此,基本上SetupDiEnumDeviceInfo()SetupDiRemoveDevice无法正常运行。我知道枚举是有效的,因为如果我输入enumType = "USB";,我会得到十个devCount。

任何帮助或建议都会很棒。

2 个答案:

答案 0 :(得分:1)

所以,经过大量的修补和阅读后,我想出来了。

// Get all of the devices
   //This enumeration does not work in general, instead passing
   //complete id of the device is probably best. 
   //It is helpful to know the vendor and device ID
PCTSTR enumType = "PORTS"; 
HDEVINFO devs = NULL;
devs = SetupDiGetClassDevs(NULL,enumType,0,DIGCF_ALLCLASSES);

// Loop through the devices
DWORD devCount = 0;
SP_DEVINFO_DATA devInfo;
int enumeratingDevices = 1;
/*This line is essential*/
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
while(enumeratingDevices){
        enumeratingDevices = SetupDiEnumDeviceInfo (devs,devCount,&devInfo);
        // Uninstall each device
        if(enumeratingDevices){
           SetupDiRemoveDevice(devs,&devInfo);
           devCount++;
        }
}
    //Clean up
SetupDiDestroyDeviceInfoList(devs);

当我带着我正在谈论的确切枚举进入实验室时,明天我会更新。但是,使用此方法,您几乎可以卸载任何设备,即使它不存在,只是注册表中的“幽灵”。

答案 1 :(得分:0)

我能够使用您的代码成功禁用 USB 设备,但是 我无法使用 SetupDiunremoveDevice 功能启用 USB 可以请举例说明此 API 以重新启用设备 WINSETUPAPI BOOL SetupDiUnremoveDevice( HDEVINFO 设备信息集, PSP_DEVINFO_DATA 设备信息数据 );