Удаление устройства Windows с использованием C++

Мне нужно программно удалить все устройства Com порта. Проблема в том, что эти устройства Com Port отсутствуют и поэтому полностью скрыты. Это означает, что даже если вы хотите удалить их с помощью диспетчера устройств, сначала вы должны добавить devmgr_show_nonpresent_devices = 1 переменные среды, а затем показать скрытые устройства в диспетчере устройств. Затем вы можете щелкнуть правой кнопкой мыши каждое устройство и удалить. Я не хочу, чтобы удалить связанный драйвер, хотя. Я добавляю эту переменную в дополнительных системных настройках, создавая и сохраняя новую пользовательскую переменную.

Я пытаюсь сделать это с devcon. Их можно найти с devcon findall но я не могу удалить их, потому что команда удалить их не показывает, что ни одно устройство не было удалено. Кроме того, нет флага, чтобы он смотрел на отсутствующие устройства. Если я сделаю стандарт 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 ответа

Решение

Итак, я разобрался с этим после долгих экспериментов и чтения.

// 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);

Я обновлю это завтра, когда доберусь до лаборатории с точным перечислением, о котором я говорил. Однако с помощью этого метода вы можете удалить практически любое устройство, даже если оно отсутствует и является просто "призраком" в реестре.

Мне удалось успешно отключить USB-устройство с помощью вашего кода, но я не могу включить USB-устройство с помощью функции SetupDiunremoveDevice, пожалуйста, приведите пример этого API для повторного включения устройства WINSETUPAPI BOOL SetupDiUnremoveDevice(HDEVINFO DeviceInfoSet,PSP_DEVINFO_DATA DeviceInfoData);

Другие вопросы по тегам