Programowanie USB w WinApi - funkcja CreateFile i błąd numer 32

0

Próbuję utworzyć uchwyt do urządzenia usb (Gamepad) za pomocą funkcji CreateFile. Niestety funkcja zwraca błędny uchwyt (0xFFFFF..), a getLastError błąd numer 32 (ERROR_SHARING_VIOLATION - proces nie może użyć pliku bo jest on wykorzystywany przez inny proces). Jest to typowy gamepad i nie uruchomiłem na komputerze żadnych innych aplikacji, które mogły by dobrać się do tego pliku. Co więcej sprawdzałem działanie kodu na innym komputerze i wszystko działało jak należy (na tamtym komputerze miałem Windowsa 7, na tym mam 10).

Czy jest to wina systemu operacyjnego (W10), który jakoś wykorzystuje plik? Jak mogę sprawdzić, który proces korzysta z pliku sterownika HID ?

Pobrałem program process explorer ale wynika z niego, że tylko explorer.exe wykorzystuje ddlkę HID.dll i nie ma innego procesu. Pomocy :(

0

No ale pokaż kod...

0
#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).

0

może Process Monitor ci pomoże.

1 użytkowników online, w tym zalogowanych: 0, gości: 1