CreateFile bei HID kommunikation schlägt fehl
-
Hi ich habe bereits versucht in einem alten Thread eine die selbe Frage zu stellen leider bis jetzt ohne erfolg. Deshalb vesuch ich hier nochmal mein glück da ich echt nicht weiterkomme zu zeit.
ich habe ein HID gerät welches auch von Windows richtig erkannt wird.
nun hab ich mich bei der progamierung an das buch von Jan Axelson und einen Thread hier aus dem Forum gehalten und es funktioniert auch alles so wie es soll bis ich an die stelle kommen wo ich mit CreateFile einen Handle auf das Device aufmachen will. Dabei bekommen ich immer ein ERROR_ACCESS_DENIEDHier mal der C-Code vielleicht kann mir jemand helfen.
danke
#include <windows.h> #include <winerror.h> #include <stdio.h> #include <stdlib.h> #include <ddk/hidsdi.h> #include <ddk/hidpi.h> #include <ddk/hidusage.h> #include <setupapi.h> int main() { PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd; SP_DEVICE_INTERFACE_DATA spdid; SP_DEVINFO_DATA spdd; HDEVINFO hDevInfo; DWORD dwIndex, dwSize, dwType; TCHAR szProperty[256]; GUID guid; HANDLE DeviceHandle; HIDD_ATTRIBUTES Attributes; PHIDP_PREPARSED_DATA PreparsedData; HIDP_CAPS Capabilities; char InputReport[800]; unsigned long numBytesReturned; dwIndex = 0; spdid.cbSize = sizeof(spdid); HidD_GetHidGuid(&guid); printf("\n1. %d",GetLastError()); hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); printf("\n2. %d",GetLastError()); if(hDevInfo == INVALID_HANDLE_VALUE) { printf("SetupDiGetClassDevs failed, Error %u\n", GetLastError()); return(FALSE); } SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guid,dwIndex,&spdid); printf("\n3. %d",GetLastError()); dwSize = 0; SetupDiGetDeviceInterfaceDetail(hDevInfo,&spdid,NULL,0,&dwSize,NULL); printf("\n4. %d",GetLastError()); if(dwSize) { pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwSize); pspdidd->cbSize = sizeof(*pspdidd); spdd.cbSize = sizeof(spdd); if(SetupDiGetDeviceInterfaceDetail(hDevInfo,&spdid,pspdidd,dwSize,&dwSize,&spdd)) { printf("\n5. %d",GetLastError()); printf("Name fuer CreateFile(): %s", pspdidd->DevicePath); if(SetupDiGetDeviceRegistryProperty(hDevInfo,&spdd,SPDRP_FRIENDLYNAME,&dwType,(PBYTE)szProperty,sizeof(szProperty),NULL)) { printf("\n6. %d",GetLastError()); if(dwType == REG_SZ) printf("FriendlyName: %s\n", szProperty); } if(SetupDiGetDeviceRegistryProperty(hDevInfo,&spdd,SPDRP_DEVICEDESC,&dwType,(PBYTE)szProperty,sizeof(szProperty),NULL)) { printf("\n7. %d",GetLastError()); if(dwType == REG_SZ) printf("DeviceDescription: %s", szProperty); } } } SetupDiDestroyDeviceInfoList(hDevInfo); DeviceHandle = CreateFile((LPCTSTR)pspdidd->DevicePath,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); printf("\n8. %d",GetLastError()); HidD_GetAttributes(DeviceHandle,&Attributes); printf("\n9. %d",GetLastError()); // printf(" %d",GetLastError()); // printf("\nVendorID : %X",Attributes.VendorID); // printf("\nProductID: %X",Attributes.ProductID); // printf("\nVersion : %X",Attributes.VersionNumber); // HidD_GetPreparsedData(DeviceHandle,&PreparsedData); // printf(" %d",GetLastError()); // HidP_GetCaps(PreparsedData,&Capabilities); // ReadFile(DeviceHandle,InputReport,Capabilities.InputReportByteLength,&numBytesReturned,NULL);*/ return(0); }gruß
-
Bist du dir sicher das er alles vorher Korrekt ausgeführt hat (wenn dwSize = 0 ist bekommst du keine Ausgabe)
Ach habe spdd noch auf 0 gestetzt bevor ich SetupDiGEtDeviceInterfaceDetail aufrufe
pspdidd->cbSize = sizeof(*pspdidd); ZeroMemory((PVOID)&spdd, sizeof(spdd)); spdd.cbSize = sizeof(spdd); if(SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwSize, &dwSize, &spdd)) { //get the name of the device for CreateFile h = CreateFile(pspdidd->DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); HIDAttributes.Size = sizeof(HIDD_ATTRIBUTES); HidD_GetAttributes(h, &HIDAttributes); ...
-
Ha die Lösung des Problems mitlerweile raus. Unter win2000/XP ist der zugriff auf HID Tastaturen und Mäuse nicht erlaubt und da ich anfänglich mein Gerät als Tastatur enumeriert habe ging das nicht..
jetzt hängt sich mitlerweile allerdings leider der ReadFile aufruf auf (blockiert) bzw. beendet mit einem Fehler weil er keine Daten bekommt.
Komisch ist wenn ich mir einen USB sniffer nehme werden in kontinuierlich in einem interrupt-transfer 4 Byte daten zum Host übertragen (die daten stimmen auch die übertragen werden.)
ich dachte der Host speichter die Daten einfach in seinem Puffer und ich als nutzer muss die dann nur noch mittels Readfile aus dem Puffer lesen.
HidD_FreePreparsedData(PreparsedData); printf("\n12. %d",GetLastError()); InputReport = (DWORD*) malloc(Capabilities.InputReportByteLength); hEventObject = CreateEvent(NULL,TRUE,TRUE,""); printf("\n13. %d",GetLastError()); s_overlapped.hEvent = hEventObject; s_overlapped.Offset = 0; s_overlapped.OffsetHigh = 0; ReadFile(DeviceHandle,InputReport,Capabilities.InputReportByteLength,&numBytesReturned,(LPOVERLAPPED)&s_overlapped);gruß
-
du solltest beim event manual reset ausschalten.
Dann in einer schleife:
- auf das event mit WaitForSingleObject warten
- die Daten mit GetOverlappedResult holen
- ReadFile aufrufenbeim ersten mal sind noch keine Daten vorhanden aber das event ist gestzt. D.h. es wird nur readfile gestartet.
MfG