#pragma once
#include <Windows.h>
#pragma option push -a1
#include <SetupAPI.h>
#pragma option pop
#include <assert.h>
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
GUID classGuid;
HMODULE hHidLib;
DWORD memberIndex = 0;
DWORD deviceInterfaceDetailDataSize;
HDEVINFO deviceInfoSet;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL;
HANDLE hidDeviceObject = INVALID_HANDLE_VALUE, hidDeviceObject2 = INVALID_HANDLE_VALUE;
template<class T>
void releaseMemory(T &x)
{
assert(x != NULL);
delete[] x;
x = NULL;
};
typedef struct _HIDD_ATTRIBUTES
{
ULONG Size;
USHORT VendorID;
USHORT ProductID;
USHORT VersionNumber;
} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
HIDD_ATTRIBUTES hiddAttributes;
int main(char* c, int i){
void(__stdcall *HidD_GetHidGuid)(OUT LPGUID HidGuid);
bool(__stdcall*HidD_GetAttributes)(IN HANDLE HidDeviceObject,
OUT PHIDD_ATTRIBUTES Attributes);
bool(__stdcall*HidD_GetNumInputBuffers)(IN HANDLE HidDeviceObject,
OUT PULONG NumberBuffers);
bool(__stdcall *HidD_GetProductString)(IN HANDLE HidDeviceObject,
OUT PVOID Buffer,
IN ULONG BufferLength);
bool(__stdcall *HidD_GetManufacturerString)(IN HANDLE HidDeviceObject,
OUT PVOID Buffer,
IN ULONG BufferLength);
bool(__stdcall *HidD_GetPhysicalDescriptor)(IN HANDLE HidDeviceObject,
OUT PVOID Buffer, IN ULONG BufferLength);
bool(__stdcall *HidD_GetMsGenreDescriptor)(IN HANDLE HidDeviceObject,
OUT PVOID Buffer, IN ULONG BufferLength);
hHidLib = LoadLibrary(L"C:\\Windows\\System32\\HID.DLL");
if (!hHidLib)
MessageBox(0, L"Brak biblioteki HID.DLL do obsługi urządzeń usb!", L"Błąd", MB_OK);
(FARPROC&)HidD_GetHidGuid = GetProcAddress(hHidLib, "HidD_GetHidGuid");
(FARPROC&)HidD_GetAttributes = GetProcAddress(hHidLib, "HidD_GetAttributes");
(FARPROC&)HidD_GetNumInputBuffers = GetProcAddress(hHidLib,
"HidD_GetNumInputBuffers");
(FARPROC&)HidD_GetProductString = GetProcAddress(hHidLib,
"HidD_GetProductString");
(FARPROC&)HidD_GetManufacturerString = GetProcAddress(hHidLib,
"HidD_GetManufacturerString");
(FARPROC&)HidD_GetPhysicalDescriptor = GetProcAddress(hHidLib,
"HidD_GetPhysicalDescriptor");
(FARPROC&)HidD_GetMsGenreDescriptor = GetProcAddress(hHidLib,
"HidD_GetMsGenreDescriptor");
if (!HidD_GetHidGuid || !HidD_GetAttributes || !HidD_GetProductString ||
!HidD_GetManufacturerString || !HidD_GetPhysicalDescriptor ||
!HidD_GetMsGenreDescriptor)
{
FreeLibrary(hHidLib);
MessageBox(0, L"Nie znaleziono jednej lub więcej funkcji eksportowych.\n", L"Błąd", MB_OK);
}
HidD_GetHidGuid(&classGuid);
deviceInfoSet = SetupDiGetClassDevs(&classGuid, NULL, NULL,
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if (deviceInfoSet == INVALID_HANDLE_VALUE)
{
FreeLibrary(hHidLib);
MessageBox(0, L"Nie zidentyfikowano podłączonych urządzeń.\n", L"Błąd", MB_OK);
}
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
hiddAttributes.Size = sizeof(HIDD_ATTRIBUTES);
while (SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &classGuid,
memberIndex, &deviceInterfaceData))
{
memberIndex++; //inkrementacja numeru interfejsu
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData,
NULL, 0, &deviceInterfaceDetailDataSize, NULL);
deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
new DWORD[deviceInterfaceDetailDataSize];
deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData,
deviceInterfaceDetailData, deviceInterfaceDetailDataSize,
NULL, NULL))
{
releaseMemory(deviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(deviceInfoSet);
MessageBox(0, L"Nie można pobrać informacji o interfejsie.\n", L"Błąd", MB_OK);
}
MessageBox(0, deviceInterfaceDetailData->DevicePath, L"error", MB_OK);
hidDeviceObject = CreateFile(deviceInterfaceDetailData->DevicePath,
GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
MessageBox(0, to_wstring(GetLastError()).c_str(), L"error", MB_OK);
if (hidDeviceObject != INVALID_HANDLE_VALUE)
{
cout << "\n" << deviceInterfaceDetailData->DevicePath << "\n";
HidD_GetAttributes(hidDeviceObject, &hiddAttributes);
printf("VID/PID/wersja = %x/%x/%x\n", hiddAttributes.VendorID,
hiddAttributes.ProductID,
hiddAttributes.VersionNumber);
if (hiddAttributes.VendorID == 1133 && hiddAttributes.ProductID == 51921)
{
break;
}
if (hiddAttributes.VendorID == 1133 && hiddAttributes.ProductID == 51922)
{
break;
}
CloseHandle(hidDeviceObject);
}
releaseMemory(deviceInterfaceDetailData);
};//koniec while
SetupDiDestroyDeviceInfoList(deviceInfoSet);
BYTE inputReportBuffer[32];
DWORD numberOfBytesRead = 0;
HIDD_ATTRIBUTES hiddAttributes;
wchar_t buffer[32];
return 0;
}
Na innych komputerach działa ok tylko na moim lapku (Windows 10) wywala błąd 32. Pewnie jakiś proces dobiera się do tego samego interfejsu i tworzy plik uniemożliwiając odczyt innym procesom (w tym mojemu). Jak mogę sprawdzić co to za proces (id) ? Programem process explorer szukam procesów korzystających z Setupapi.dll, ale nie ma nic podejrzanego. Inne urządzenia usb HID też skutkują błędem 32 (o dziwo nie dotyczy to myszy aczkolwiek myszy chyba nie da się bezpośrednio odczytać w Windows i tak czy siak jest inny błąd).