From 0cc06e1f02a4b78e07ff106a3bc8cb774af18ccf Mon Sep 17 00:00:00 2001 From: Alan Ott Date: Thu, 1 Jul 2010 16:56:15 -0400 Subject: [PATCH] Added the hidapi_enumerate() interface to the Windows implementation. --- hidapi/hid.cpp | 232 ++++++++++++++++++-------- hidapi/hidapi.def | 2 + hidapi/hidapi.h | 4 +- hidapi/objfre_wxp_x86/i386/hidapi.dll | Bin 10752 -> 11264 bytes hidapi/objfre_wxp_x86/i386/hidapi.lib | Bin 3790 -> 4446 bytes hidtest/Debug/hidtest.exe | Bin 29696 -> 30208 bytes hidtest/hidtest.cpp | 3 +- 7 files changed, 167 insertions(+), 74 deletions(-) diff --git a/hidapi/hid.cpp b/hidapi/hid.cpp index b14c1b3..b17835d 100644 --- a/hidapi/hid.cpp +++ b/hidapi/hid.cpp @@ -56,14 +56,14 @@ static void register_error(Device *device, const char *op) device->last_error_str = msg; } - - -int HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, wchar_t *serial_number) +struct hid_device HID_API_EXPORT * hid_enumerate(unsigned short vendor_id, unsigned short product_id) { - int i; + int i; int handle = -1; - Device *dev = NULL; BOOL res; + struct hid_device *root = NULL; // return object + struct hid_device *cur_dev = NULL; + // Windows objects for interacting with the driver. GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}; @@ -76,32 +76,6 @@ int HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - // Initialize the Device array if it hasn't been done. - if (!devices_initialized) { - int i; - for (i = 0; i < MAX_DEVICES; i++) { - devices[i].valid = 0; - devices[i].device_handle = INVALID_HANDLE_VALUE; - devices[i].blocking = true; - devices[i].last_error_str = NULL; - devices[i].last_error_num = 0; - } - devices_initialized = true; - } - - // Find an available handle to use; - for (i = 0; i < MAX_DEVICES; i++) { - if (!devices[i].valid) { - devices[i].valid = 1; - handle = i; - dev = &devices[i]; - break; - } - } - - if (handle < 0) { - return -1; - } // Get information for all the devices belonging to the HID class. device_info_set = SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); @@ -147,8 +121,7 @@ int HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, NULL); if (!res) { - register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); - free(device_interface_detail_data); + //register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); // Continue to the next device. goto cont; } @@ -164,13 +137,10 @@ int HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL, 0); - // We no longer need the detail data. It can be freed - free(device_interface_detail_data); - // Check validity of write_handle. if (write_handle == INVALID_HANDLE_VALUE) { // Unable to open the device. - register_error(dev, "CreateFile"); + //register_error(dev, "CreateFile"); CloseHandle(write_handle); goto cont; } @@ -182,58 +152,178 @@ int HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, HidD_GetAttributes(write_handle, &attrib); //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); - // Check if this is our device. - if (attrib.VendorID == vendor_id && - attrib.ProductID == product_id) { + // Check the VID/PID to see if we should add this + // device to the enumeration list. + if ((vendor_id == 0x0 && product_id == 0x0) || + (attrib.VendorID == vendor_id && attrib.ProductID == product_id)) { - // Check the serial number (if one was provided) - if (serial_number) { - wchar_t ser[256]; - memset(ser, 0, sizeof(ser)); + const char *str; + struct hid_device *tmp; + wchar_t ser[512]; // TODO: Determine Size + size_t len; - res = HidD_GetSerialNumberString(write_handle, ser, sizeof(ser)); - if (!res) { - register_error(dev, "HidD_GetSerialNumberString"); - // Can't get a serial and one was specified, continue. - goto cont; - } - else { - // Compare the serial number - if (::wcscmp(ser, serial_number) == 0) { - // Serial is good. This is our device. - dev->device_handle = write_handle; - break; - } - } + /* VID/PID match. Create the record. */ + tmp = (hid_device*) malloc(sizeof(struct hid_device)); + if (cur_dev) { + cur_dev->next = tmp; } else { - // This is our device. Break out of this loop and return it. - dev->device_handle = write_handle; - break; + root = tmp; } - } - else { - CloseHandle(write_handle); - goto cont; + cur_dev = tmp; + + /* Fill out the record */ + cur_dev->next = NULL; + str = device_interface_detail_data->DevicePath; + if (str) { + len = strlen(str); + cur_dev->path = (char*) calloc(len+1, sizeof(char)); + strncpy(cur_dev->path, str, len+1); + cur_dev->path[len] = '\0'; + } + else + cur_dev->path = NULL; + + /* Serial Number */ + res = HidD_GetSerialNumberString(write_handle, ser, sizeof(ser)); + if (!res) { + cur_dev->serial_number = NULL; + } + else { + len = wcslen(ser); + if (len == 0) + cur_dev->serial_number = NULL; + else { + cur_dev->serial_number = (wchar_t*) calloc(len+1, sizeof(wchar_t)); + wcsncpy(cur_dev->serial_number, ser, len+1); + cur_dev->serial_number[len] = 0x0000; + } + } + + /* VID/PID */ + cur_dev->vendor_id = attrib.VendorID; + cur_dev->product_id = attrib.ProductID; } - cont: +cont: + CloseHandle(write_handle); + + // We no longer need the detail data. It can be freed + free(device_interface_detail_data); + device_index++; + } // Close the device information handle. SetupDiDestroyDeviceInfoList(device_info_set); - // If we have a good handle, return it. - if (dev->device_handle != INVALID_HANDLE_VALUE) { - return handle; + return root; + +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device *devs) +{ + // TODO: Merge this with the Linux version. This function is platform-independent. + struct hid_device *d = devs; + while (d) { + struct hid_device *next = d->next; + free(d->path); + free(d->serial_number); + free(d); + d = next; } - else { - // Unable to open any devices. +} + + +int HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, wchar_t *serial_number) +{ + // TODO: Merge this functions with the Linux version. This function should be platform independent. + struct hid_device *devs, *cur_dev; + const char *path_to_open = NULL; + int handle = -1; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +int HID_API_EXPORT hid_open_path(const char *path) +{ + int i; + int handle = -1; + struct Device *dev = NULL; + + // Initialize the Device array if it hasn't been done. + if (!devices_initialized) { + int i; + for (i = 0; i < MAX_DEVICES; i++) { + devices[i].valid = 0; + devices[i].device_handle = INVALID_HANDLE_VALUE; + devices[i].blocking = true; + devices[i].last_error_str = NULL; + devices[i].last_error_num = 0; + } + devices_initialized = true; + } + + // Find an available handle to use; + for (i = 0; i < MAX_DEVICES; i++) { + if (!devices[i].valid) { + devices[i].valid = 1; + handle = i; + dev = &devices[i]; + break; + } + } + + if (handle < 0) { + return -1; + } + + // Open a handle to the device + dev->device_handle = CreateFile(path, + GENERIC_WRITE |GENERIC_READ, + 0x0, /*share mode*/ + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL, + 0); + + // Check validity of write_handle. + if (dev->device_handle == INVALID_HANDLE_VALUE) { + // Unable to open the device. + register_error(dev, "CreateFile"); + CloseHandle(dev->device_handle); dev->valid = 0; return -1; } + return handle; } int HID_API_EXPORT hid_write(int device, const unsigned char *data, size_t length) diff --git a/hidapi/hidapi.def b/hidapi/hidapi.def index edecf23..088ff7c 100644 --- a/hidapi/hidapi.def +++ b/hidapi/hidapi.def @@ -10,3 +10,5 @@ EXPORTS hid_get_indexed_string @8 hid_error @9 hid_set_nonblocking @10 + hid_enumerate @11 + hid_open_path @12 diff --git a/hidapi/hidapi.h b/hidapi/hidapi.h index 3c7cb53..dfa97a3 100644 --- a/hidapi/hidapi.h +++ b/hidapi/hidapi.h @@ -14,7 +14,7 @@ #include -#ifdef WIN32 +#ifdef _WIN32 #define HID_API_EXPORT __declspec(dllexport) #define HID_API_CALL _stdcall #else @@ -58,7 +58,7 @@ extern "C" { attached to the system, or NULL in the case of failure. Free this linked list by calling hid_free_enumeration(). */ - struct hid_device HID_API_EXPORT HID_API_CALL *hid_enumerate(unsigned short vendor_id, unsigned short product_id); + struct hid_device HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); /** Free an enumeration Linked List This function frees a linked list created by hid_enumerate(). diff --git a/hidapi/objfre_wxp_x86/i386/hidapi.dll b/hidapi/objfre_wxp_x86/i386/hidapi.dll index 4513f49d5ee57e4d558268af6574038f947ad70f..b90466e43923eb97868e52de133da044703ae8e8 100644 GIT binary patch delta 3064 zcmc&$eNC#&00$LVpKNAQfUA16fwsjhaevwoZ^f4CZl>%kti2()*qxYX5yj$oDvl5X6iE?fo6AS(hcrm*0b!_M&Fa-PsH~}034gp=jx7&h+;o!fao;?Evw57md?DrrYNq(9s?t}5bp2LsBs%&GUp(WauMITa zMW9J;o|~AKq=5^V)d}Hq2+ja^2c(Se835sX`q7VsRVOzZN{6|7kUNLD`yl5!dmexc zb6=pJH_T1Sq_gKCNN3Mf*fNdY=o{fa1eH%$(s$^HE)bCAa%UhQFIDa=I`cC)9wv2I(9)?;wnxZ~44NlN6tf(MLRX#R)+iQK=T*n!Oo z69OkExtcxgQSr^%@mT(pochSNuo?c8Z02jVa9{(i)JtlI{haqlG>VHpJUdG2t`Xf*av3}oBa%b9{aRqN^AgF`@Hv=c6PL3;-k4^6jdQv0W zK$*fVs2vVBd(QhHckpkM!lYNl*Q&?!V7NaSW9>`QWSndp@!hEkkGIg!!It6a{zpOG$Fo zMo(YgDKB3-BXDxw=)Z0b#m5mcI;bY+T+Y zwfP-mUd?@C}7sk70<(`Oq549S$SIBaPcq4w1=IX3YE2_1{zH)!*jN}w*)JU4P z(i!?<67^TC<$@kph1*u8^saK-T4TL7VWW<_=wXF5YPVo=v-w_wn|t8VyM-2on|)T{ zP4o{cQH)S}uhXOBs?<^c6^R@5#0d^e=ItL(6bL4bD+_&q0P$(6#U%^z*${-{8Q12~ zLG2?4F;KUA*O;wX?M;xcVyIrM(K@I@;%~HXSYDk&$hfUx2zAi#Ho6hjI+o~gOGzje znX9hGUFV($*DxTv^rH(^itPzG)H~v_1PAp{yp@ng9T)X;t+8WEU_2tOpZgItBrZ*S znriE7O3b3D--}(k%%vl^KsC2{lwY{E*aZ2r>WvvBT>&sqfi1EoOnthyK$|XduHC(hX)Q}5-W`J3M zzmF6`jsm@p5n`H;N(FrmGze&5e-?5HeyV(WP~guP*A2W5`~kQCd9 z3QQ?b0qg*@B!*~+n#{q&rwsoW#fxXs7cXn{?y7Iu;;APM+qb#uTUwf0h)ZVWkX`jr z>-MHbhgtkrx;L(=xxUfWyv5Vdx5;pf5}OrsPi82UzK;-E&^TedXY9&sQv|g8c=5FG#a3v1Qn^?YZ`Hd$rH* zve(-MdzbyF{T=&7`^WZA?Dy?c_EnUAFjb6)X=Sjx+1A&##HaiZf3PUF delta 2482 zcmc(gZEzFE8OQg|XQRk6l8t3Nw&WK^1d|t6TAgH_Y=TST;AtQch}gz7jd`)+I(DFr z)VL0f+{)LnDl|2@NeU@$oQ5VDPZAgmvC@)OAprw1l;)KX>bf06M9l!nq(F$s^?xTh zrTx}V-I?D$`~3IW-FtTL_IjIoR}J(&uzFo&wK?OAc7_REOj`^;|M5+#HD^p|>s9}U z+7i|Jv}LM&Olwl@TJ0QI_rYJKeZOi~et&(NdFx+_=Y8-dyNsmEBw@?5nVSePLC8yq z!zQVSsboi=mA=E2wkW`dmVw{kx#!Wpw0K z`dhpGkbhc)3L-H{*O*%umZ5b+sl`;4U9BA(*Ar62p#uWR0+x|`**#3~yEhXu0A2-$ zKo3yLPz51B2R)z#tO8C@2@1h$Ai02$v)~js4q{*!>;PLp4|oKeKQ zW_4D#nULmk>2hXc(1Xb5G*)7;9}L$eV;ess#D2tU|HKy-FI|`A*q<=Lx5vcuXz#hd zWI5!|(L5x6fx7>Y_)nO3`Ufwo+7;Bfhs3Lj=^y+Orho97+Vd4^>zH@~MtK1QbD4`6 z0+yI1XeWk{Mh-V6!}VOaNfU0;h2r^(Ea=|+X*fp-3lAQ~uvi%)g+jkk78O?sQaU%E zKUazjBC7asJYP_QqrFOWSR6-WSfk&P#B0=^=k-R_JUp^-vw;|*Q9MpiUg3>KmF!k{ zJz?=}Wx(KmwT`2fjlGBzK&VviF8wPDz@>PU@;yjj0E>7&zP`%Ez6Cvai=ow+*~Z>ZNs?Q_6)Duh)0)lcxn&2 z8zYy}aiOo}Kwcy@{xeL{E}#1dgQDVY<&hf3RI7uM;P6fOBH~`?zUn%SUVIfQgx8e( zq3HDDAQa&NgTM2S1l!pd6_W_|dJ<1)2noHdOADTc#4CD2`r?6{^uj+v*mQejxgj;e z7cuy%a|0#5>i7IcU&O=us#mZ9eJIX_-sB(#ChYO)%;I?Hq+I=0fJVfidPJMJ2fvrz zLt{UZjHo9U>gHts-KnFUzOz9#u0oeADyQ?!zNZ}J{5;;&4B^55I5=?`wsv|bTo^hm zN0uk;$JQjCo<+!!13EH}BF)!&*@u!+kM^(Z&%Tn@WWS!R$w_6HIB-oW)zxGl!yYOb zCmv7v>t=jj@yn!Rx>9ZZjP?)dvaZe$TmNY1q)?{`Gqe?VCsjpz-(n5VLla$)^w=+AXZThOL77O}bls?eE&x}dK zhNVn!p7jB|R~(vp#1 z&bgmuCoR$i<1biz{lS7x_MmCxLcu16nH+hra67Z^8B^*e87?A*KLETGvgFgUbz=?mU%Sgy5_+0@Zcg-c_I&1{?U0^E2_Y40c z#QqIT1NIjDPk;lg1Z%(s&qo_8hZk9>)bw z;6Y;6N$Zrg&(?37O-*z@T|)QL-_v*LDSC!pp>yoizQ+EreZW3uKWo2eKf+J(xsH1s ze#aAz-#XrNeCp6S3!E0G-MPqlk8_>#Dd!8$W6n>U38$f|vFg`VXR0b)RjxtT^RAa% z$6X(~PP_i@(g?Z2Ji#s87Zg?r%|e&(m=F>qVY@ISj0$fEM}!-(BP`ci-lA zx|g|I-5cEz_cnLDdQr{NnjJM`HK%K?*W9$oct^!z>*D&wM;9ZLGW@1tI;=g`)7FIb zy0ysGVf%qCYTIpl!*;~>XWPfNGqx)>j_T;m^fpRqn~UB-@1pn6m2@?2p%2kVXn_8h ziZn{M)8Eh+=__=U#_2osV>&^n=tX*&?y|@1Ccc8_`C5J%-^6$Gy?h_Pg&*Lz@jLjP j{7d|9elNeDkMoE5asGY&B>x3}l^^-Zf*>btV(0z~ivv4B diff --git a/hidapi/objfre_wxp_x86/i386/hidapi.lib b/hidapi/objfre_wxp_x86/i386/hidapi.lib index dbd21687ddbf2f78e372871916c6ad06d3e9f3e3..c597aeb2f0119e7449ec814a4c38e382b7d2b1a9 100644 GIT binary patch literal 4446 zcmcIn&u(^UZtv-n{28f3p3~ z{?Epb#KsXV*vOZn41L(%Ye}amTrZ;^co2I1sbW(KMVU} z3*f%+GVF^lXia^A_Hr*i4twbl?W10#z1)|chP`-1>m$qBxU+S4yJg+{<=&0$jjh(* zZEN4{+5;DswRykUJkG~&p+LxP{d#}%wsrGb>l$rv4+a)*x4ePVZ>&|2TqyoS-yJzp zK&_O7@7P@_AQy_?>3Kt^VTK5Dq4;~w$Qt-wcib6S!;$ay_vC3QtmNJUyFcEwJEO7h z___nq_{md-j_=w%t3N(y>yJqlNS@>NyUwB0l^3andb1`PmfGw1zUK=o$%Wz%>43i1 zZ}+^;12$1TJXb?jdmPfn@ooBkk#vHfhmy@5qLxW zl_1dAK>2x|#Oo7l1I^My6u39+!18?67INrgH@0N$qxB&#W-4~QVH^!L}6q99$ z04Y;d6sCW{KT+e;fqJy!A&)Kk{Xg%}X?aP-yeePtW-cFi$zQ?E_?I%K>u33=DKsw_op{Ywbp7uH*CLTpuqq1X>Ow&E=o zTc)71+&^Lwji+hdEEeT_e_CE>iZY_il{&{|Gso}MdBR{_gECiShgdkPX}0fX*2O=C zBo6CBB}#}BPdo}B_KIZ0nxGRuZh=msGMECVTGi|HHDR#z0vt`cj6t5*|Eno>{Du%Y zzXX{2R2+j<(`**4UD0d$Jt5AYizEQhbSHlJk0?W4zp)25Ul0a$XOxM71^rPBjJRE5e`$ cF2p%r2u^`$rn~~55gKQuKr>lm#(<3f0792A=Kufz delta 633 zcmZXRze@sP9LAs1^M2oXQYj>97zMecVwwaFP6Y?84GslP5k~(*lMn>ov4&_6qAi7H z-3n?dr-*_E*KP=E>OIf%JbK~b%lmns_x(Qa`@UtK7S595dZAd!=PI-)#t%!yjYW6t zDF6~cqz{NgKu!UA#+A_k9O*4rN)vFT(H=rB>OTNg24(ZMM&*cggBV+$%S~ zHty+_e4#uQs#dD_p;#jHBfwAuQZkUyfrbIJSZ%V%ISuHlK%3Pns{_VtoxZ}WS?4z3 z5P}E|Dr87dz(atJNRZJEU#E+ZL=U_|Hh)Do5sM^2qdPrLHK9p8VR!1;R>Cj6P-k2G z=B8kr>asanIFg0H!d#(Tnmn?_g~4`P&vY!O=|D`*?q60{tf K8RgrIE&TzDvx|HH diff --git a/hidtest/Debug/hidtest.exe b/hidtest/Debug/hidtest.exe index cf98842fb8a9649ba3199318849ce33a3b543480..ad7392ac2414d7d9e85c1250252b59a99b5c098c 100644 GIT binary patch delta 5556 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 F{s(2tT;~7) delta 5313 zcmd^DjbBt{zJJbPz~OxmM&3pkg%MQLd7nAMIcJ=eDRLnP1fdkfgzk~hD8X!#00E7i zxPgyt-mY7U*3#CewL5k*uWsYYB6}Ch&6WIYUZW!Rkd&H}QJLrdp2Lge{S)qdKHuMY zelO4W`Td@^Gc!$NRFg<`veZx)=e}px^#!ZM?kOy@J<@FioodJ3>F``;d#XE4_K$Wy zB4>;iEx3O<1lI)k@;d64Bd8bT?^c60w%#b(q+` zBLnXvwiiexZ;;j!!s;Q#mJyLeY$hVQNsnOC+Cp02lH5W_u#?z!#enD{6R@AmWisj8 zmjMEj4n?Cc&V%OGB%dloMPq$PFxD!A8`&U)R<9}PIN5tklHUCQA#`j2J~v)Jh-zKP z^yhZ>t!h^_>TvgXL?eW>^hWf#d#FD5Yt7ZD+9_Ow-6mFoqrGkKPvAaDBx=a^287xN zTu4&uTU@B6SCJhM{~Myba+F7W^+#w2JVH#79AuV*lo0eP&JWc(e@zJ8ftH2He%X7cGA($ksi{dU z`T?{UvNYZfGVKLoI9Pyva)p|H?mYFqBsETrO%|x^*{qZ?U!0lJ-W2N2#99`7uI$jLnF$?DeJ6}%9Frit}kEf&A(+j zD;hv;?j@%qdrYh(9AA{3_DXQRkrKkyJ(483K+%Ch7X3C{xLV(DBcdsMInubS6$X-Y zWH?DjmQT`=jVI}{K$7z{FpwQd4p=>XhSOgd{Emqe|j{*I4E_0f?x@s4N@ zbsV3KPNrVMqtTB?e*7(LcJV%tExif&dPV|nQiW5m<7ZVF5fQ)(r>t6%)GGX*Dt>Jo z7`%~r^)A$|l++1CQ|A&*bx=bTWqahapo-x@Cmy;1oLoBOgX*J%!5GL?t({;Lcgj93 z_@w%9!k>-}F)QhRyMY^GvQiatRNSGW$6$PpNYoHktrXh>BufP@NJ+p$F(I_-1{Pzq z^tl=wHrtU}3!L8Nigx$V8TT+uBC1B-{GkG&4l+E_9{8g{uS`RUc8E zD!zqZoV|eh1fQC{e0|Y3gkO0kn7GNJOa#((^9ALDF5nZ!VL^mWxHqb4NzG2A*)mSm zQv)px!>B$ILMDc*gMnJOeZYh2<_hE~eu^t%lfrt5qgUaL^yAi8?UD+4$cRJhBrO@M$A39W1;*Vd; zvsDenuLH9nKnaq%LgpkPs6Gs$E=)uTp$g=e)Ro|cfdzPADt#4P=(B<(btyK*Tj*;w zxH`UwD#Fdl1z433ui0A$DSR*0MHhO!Ze@W-%pp_Ot13HvybiBO*qoL&CTGyzcJ8_) zwfXC#SBsy1HEHSxlh=}q&nMhNkC)@*#8m1HoSo>PO7XVDWy!nct_f{7>y~&s21u+- zQcxoFU_Zp>;i1HIsuKq%>8b75nv|a5DR-eYp4A1?^MtykS3}kXX3Yb&!0B6GZaTYG z%>EKLC%r(aaANYm$d#O;d&_W+#!e5F;iol5Y6pHxlSYsH6T((v?Ob#6wF)w8EReMM zqg($96$-;(f=ODAADx@J@FFM$!eNjtU#1rd`=HVBw6;We1{#8%XdV9Bk|ZSHcjl&Q z$vx6he6&!ABObTt5tP#*1(G@k-<)eo?;4r77=$D1VIdW(OGFpByLwgAWjs0p`K`tW zQdkP%|4Dg;4#-7N3f!PEQA&J0RZG7%3^Dn*LaU|XaI^LuDibsF%BUmwg?W}0WJ8$z zWv3@@4M~>{yU8mRd&l7Qn<`v;2y#D0#Bw4K3L=7n10Y5XlT0E!;@dcS{)+eupA$81 zib$rDbXvS={$kCEhk>(?^9wGtHP#!_=C7lrb1i*}=G%S&ADJKL?%yN_3_S9G0*LAH zugWLWBdn5++%}Sq+(1O1NcOg%$DwJ41%aLNp=x&z!!eZVXM6LNFq_vVtfMcGyFe+v zk1NvVthp0Qfj8tOJ4O?!+k{uHlEPl_c$l8)S!U);*U*j=rS31wKjFFUu3M?A_`6qizvJdGP20 zC%yGDUX)>==U&ET86QWIyGqgx$Z_YeJ99BLjvvcZ!+T+Ork+Z`$1*jP24BeZDw{S= z?rveB2adzL3qMe5p&Lv{I__N5I;CX#G>gNi#=RFO_Ub`1+~sS$7IIKLXM!tWYT&9w z(jc6gw(ZaqG?kFSp!Zta&HCu_iPvGtWari1xyzxS5CI`;r1R}MViyQIpvyx$B_hl`m_Tq1|JahKSHGJglxCTT8-f`*t8c7|8 z*DlFhND^E>#T)X`ME1l>>?Z%ji@IDK8-&xdV~M1@2zE(#NtQ#h9G0ah%Q0D!9VF?- zaof`T#2mRz%8_(rEO=kbay!1VbV)dDV_AdId@&)>v`@c`iS#|dyD93NFD565^40R8 zG_+!aQl@_Ckrxr%)<~$Lkgyt|+70zvtB}ue?@HSD_xqFz^)u^SNWa#FA^-z$$?pTy z`L5?bqKFA>a3Me7FrXHY>)Tv-Z&1v<6$w|>`8!q|Vy;H*ir(;Gp6}1aPMR9=#jKr0 zLkbFt`Uu*|bTF6dLZ#SHmK>a(=0b~bL0PhHWPuBf0mujDS0c}W$>)^r#$C`S)Z{{G zzPHL&(R+e&_f(jJYBsuj8~DFa+5Tp-JtjUETPV~D7;m~`i)f|LiJcVk%&-marV#wB z?V6{q>WAhrKsTTh&4gA0RI5=0^S510Q@W9SAcbZ<$x?e0^o-> z3Vj2(1elMTD_1m*Kq6lQegIqoXu*>OZ~#1jNeQn2fIh!z~nzqOhy#Uffw#^#8JGqp+!RL+z%el{Ga8 z{ULbklUwVmHY4<9@DsIy_vSCmSIj|{P)m+wrR5=uU^!%Y&GHw^2bKuyZ0jPc-n!e`VSU~Dmi05M zXq{)vu<^DWTf6N!Teq#p_O9(c+Xb7#uCi>&F&E3#j)H`wpl+iVaQ z%EfT;oWO178o3kPpSXW=S2+bA$~>I6g2NYxS(*7lvHJ z{e~jLgN6+T!SJYIo1wwbYVaDc;ol9141X{jGn_P>Hk>tlWcb{0)eta*7{iS*#(3j0 zqt&>_*l#>*{KS}IYBKFMb(_XaM)Q;A7tI&UsTQZD((=6JxaC93c58$6IqOiPHP2Q8 z(|5_Hva9XS+V|Oy+K=1M*x$FGw|{L9*nhHzFyYJ`#>zOET&9@W$n0TQ#|p=O$L}1U zIW*ax?BeX9>>xIbUC1tDEii-Y*($b~?PB+_3%D$fZ^2nJ8)3exVat=B#IX`oXPNb)hA0|hskJW4SnR=T( zPhYC9)Ys{c=}+qwhA@N5Fvp-Vy6uu`%EvH4x9Q+e>IJm;>~6=Ht#pTX7-u? z%j`FwF(+6=%T-IA^(kwO?Fra7ziG7n)^^19zU{p2rcG(r*^BJ2K>c6XXECYFo6J$> zIOAvfm;vTP<|1>M8D_p@t}!>6TMX?`I-(qLjwFZHvA~h#FgolG-jU;2>F_w#IMz8H zatMwsjyeZq4*%n6;h`|7%yAaMQRCRl?c?@y2e`vr4+sB3p$ZDYA2}$_m|)ZxwZ?Sg e30uEo7&f1RQ*!BCCYQ@qa)NL1)(do(Uh%(@Kk3H+ diff --git a/hidtest/hidtest.cpp b/hidtest/hidtest.cpp index ee35250..5f2dcc2 100644 --- a/hidtest/hidtest.cpp +++ b/hidtest/hidtest.cpp @@ -38,7 +38,8 @@ int main(int argc, char* argv[]) devs = hid_enumerate(0x0, 0x0); cur_dev = devs; while (cur_dev) { - printf("Device type %04hx %04hx at %s, ser: %ls\n", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number); + printf("Device Found\n type: %04hx %04hx\n path: %s\n serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number); + printf("\n\n"); cur_dev = cur_dev->next; } hid_free_enumeration(devs);