Удаление устройства Windows с помощью переполнения стека

Мне нужно программно удалить все устройства 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.

Любая помощь или совет будут великолепны.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]