return (status & DN_NO_SHOW_IN_DM) != 0;
SetupDiDestroyDeviceInfoList(hDevInfo); std::wcout << L"Removed " << removed << L" non-present device(s).\n"; return 0;
void PrintUsage() std::wcout << L"DeviceCleanup.exe - Remove non-present (ghost) devices\n\n"; std::wcout << L"Usage:\n"; std::wcout << L" DeviceCleanup.exe [/list] - List all non-present devices\n"; std::wcout << L" DeviceCleanup.exe /remove <id> - Remove device by instance ID or hardware ID\n"; std::wcout << L" DeviceCleanup.exe /remove-all - Remove all non-present devices\n"; std::wcout << L" DeviceCleanup.exe /force - Bypass pending restart flag (use with /remove or /remove-all)\n"; std::wcout << L" DeviceCleanup.exe /verbose - Show detailed info\n"; std::wcout << L"\nExample:\n"; std::wcout << L" DeviceCleanup.exe /list\n"; std::wcout << L" DeviceCleanup.exe /remove "USB\VID_1234" /force\n"; std::wcout << L" DeviceCleanup.exe /remove-all /verbose\n"; DeviceCleanup.exe
void ListDevices() DIGCF_PRESENT); if (hDevInfo == INVALID_HANDLE_VALUE) std::wcerr << L"Failed to get device list. Error: " << GetLastError() << std::endl; return;
if (matches && IsNonPresentDevice(devInst)) std::wcout << L"Removing: " << instanceId << std::endl; if (RemoveDevice(devInst)) removed++; return (status & DN_NO_SHOW_IN_DM)
// Get device description WCHAR desc[256]; if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)desc, sizeof(desc), NULL)) std::wcout << L" Description: " << desc << std::endl;
SP_DEVINFO_DATA devInfoData; devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); DWORD idx = 0; int count = 0; return (status & DN_NO_SHOW_IN_DM) != 0
int wmain(int argc, wchar_t* argv[]) for (int i = 1; i < argc; i++)
bool RemoveDevice(DEVINST devInst) CONFIGRET cr = CM_Request_Device_Eject(devInst, NULL, NULL, 0, 0); if (cr == CR_SUCCESS) if (g_verbose) std::wcout << L" -> Eject request succeeded.\n"; cr = CM_Remove_SubTree(devInst, g_force ? CM_REMOVE_NO_RESTART : 0); if (cr == CR_SUCCESS) if (g_verbose) std::wcout << L" -> Device removed.\n"; return true;