1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| bool UsbHID::open(int venderID, int productID)
{
close();
GUID guid;
fprintf(stdlog, "Appel à HidD_GetHidGuid\n");
HidD_GetHidGuid(&guid);
fprintf(stdlog, "Appel à SetupDiGetClassDevs\n");
HDEVINFO devInfoSet = SetupDiGetClassDevs(&guid, 0, 0, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ));
if (devInfoSet == INVALID_HANDLE_VALUE)
return false;
SP_DEVICE_INTERFACE_DATA devIf;
devIf.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
fprintf(stdlog, "Début de la boucle for\n");
for (int i=0; SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &guid, i, &devIf); i++) {
fprintf(stdlog, "Itération\n");
DWORD devIfDetailSize = 0;
SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, NULL, 0, &devIfDetailSize, 0);
if (devIfDetailSize <=0)
continue;
SP_DEVICE_INTERFACE_DETAIL_DATA *devIfDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(devIfDetailSize);
devIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(devInfoSet, &devIf, devIfDetail, devIfDetailSize, &devIfDetailSize, 0) != 0) {
HANDLE devHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(devHandle == INVALID_HANDLE_VALUE) {
free(devIfDetail);
continue;
}
HIDD_ATTRIBUTES devAttr;
if (!HidD_GetAttributes(devHandle, &devAttr)) {
free(devIfDetail);
CloseHandle(devHandle);
continue;
}
PHIDP_PREPARSED_DATA devPreData;
if (!HidD_GetPreparsedData(devHandle, &devPreData )) {
free(devIfDetail);
CloseHandle(devHandle);
continue;
}
HIDP_CAPS devCaps;
if (HidP_GetCaps(devPreData, &devCaps ) != HIDP_STATUS_SUCCESS ) {
free(devIfDetail);
CloseHandle(devHandle);
continue;
}
CloseHandle(devHandle);
if (devAttr.VendorID == venderID && devAttr.ProductID == productID) {
mDevHandle = CreateFile(devIfDetail->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
SetupDiDestroyDeviceInfoList(devInfoSet);
memcpy(&mDevAttr, &devAttr, sizeof(HIDD_ATTRIBUTES));
memcpy(&mDevCaps, &devCaps, sizeof(HIDP_CAPS));
mInputBuf = (unsigned char *)malloc(mDevCaps.InputReportByteLength);
mOutputBuf = (unsigned char *)malloc(mDevCaps.OutputReportByteLength);
return true;
}
}
free(devIfDetail);
}
SetupDiDestroyDeviceInfoList(devInfoSet);
return false;
} |
Partager