summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnon Gilboa <agilboa@redhat.com>2012-07-23 11:14:36 +0300
committerArnon Gilboa <agilboa@redhat.com>2012-07-23 11:14:36 +0300
commit54da3bd0fd30978f49bc23dea8fb82ec266c68cc (patch)
tree792ff44ddf6ad1ed639f7eee2a492c47a8179e1b
parent67cd0e1cd3cf3373891f140188c8e4732eab2f93 (diff)
usbclerk: refactor device lookup
-rw-r--r--usbclerk.cpp33
1 files changed, 20 insertions, 13 deletions
diff --git a/usbclerk.cpp b/usbclerk.cpp
index e01489b..09f1e66 100644
--- a/usbclerk.cpp
+++ b/usbclerk.cpp
@@ -39,6 +39,7 @@ private:
bool remove_winusb_driver(int vid, int pid);
bool remove_dev(HDEVINFO devs, PSP_DEVINFO_DATA dev_info);
bool rescan();
+ bool get_dev_info(HDEVINFO devs, int vid, int pid, SP_DEVINFO_DATA *dev_info);
static DWORD WINAPI control_handler(DWORD control, DWORD event_type,
LPVOID event_data, LPVOID context);
static VOID WINAPI main(DWORD argc, TCHAR * argv[]);
@@ -435,10 +436,7 @@ cleanup:
bool USBClerk::remove_winusb_driver(int vid, int pid)
{
HDEVINFO devs;
- DWORD dev_index;
SP_DEVINFO_DATA dev_info;
- TCHAR dev_prefix[MAX_DEVICE_ID_LEN];
- TCHAR dev_id[MAX_DEVICE_ID_LEN];
bool ret = false;
devs = SetupDiGetClassDevs(NULL, L"USB", NULL, DIGCF_ALLCLASSES);
@@ -446,16 +444,9 @@ bool USBClerk::remove_winusb_driver(int vid, int pid)
vd_printf("SetupDiGetClassDevsEx failed: %u", GetLastError());
return false;
}
-
- swprintf(dev_prefix, MAX_DEVICE_ID_LEN, L"USB\\VID_%04x&PID_%04x", vid, pid);
- dev_info.cbSize = sizeof(dev_info);
- for (dev_index = 0; SetupDiEnumDeviceInfo(devs, dev_index, &dev_info); dev_index++) {
- if (SetupDiGetDeviceInstanceId(devs, &dev_info, dev_id, MAX_DEVICE_ID_LEN, NULL) &&
- wcsstr(dev_id, dev_prefix)) {
- vd_printf("Removing %S", dev_id);
- ret = remove_dev(devs, &dev_info);
- break;
- }
+ if (get_dev_info(devs, vid, pid, &dev_info)) {
+ vd_printf("Removing %04x:%04x", vid, pid);
+ ret = remove_dev(devs, &dev_info);
}
SetupDiDestroyDeviceInfoList(devs);
ret = ret && rescan();
@@ -497,6 +488,22 @@ bool USBClerk::rescan()
return true;
}
+bool USBClerk::get_dev_info(HDEVINFO devs, int vid, int pid, SP_DEVINFO_DATA *dev_info)
+{
+ TCHAR dev_prefix[MAX_DEVICE_ID_LEN];
+ TCHAR dev_id[MAX_DEVICE_ID_LEN];
+
+ swprintf(dev_prefix, MAX_DEVICE_ID_LEN, L"USB\\VID_%04x&PID_%04x", vid, pid);
+ dev_info->cbSize = sizeof(*dev_info);
+ for (DWORD dev_index = 0; SetupDiEnumDeviceInfo(devs, dev_index, dev_info); dev_index++) {
+ if (SetupDiGetDeviceInstanceId(devs, dev_info, dev_id, MAX_DEVICE_ID_LEN, NULL) &&
+ wcsstr(dev_id, dev_prefix)) {
+ return true;
+ }
+ }
+ return false;
+}
+
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
bool success = false;