首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

100分:USB HID类设备开发中用CreateFile无法得到设备句柄,怎么解决

2012-02-19 
100分紧急求助:USB HID类设备开发中用CreateFile无法得到设备句柄,如何解决?利用开发板的资源做了一个USB

100分紧急求助:USB HID类设备开发中用CreateFile无法得到设备句柄,如何解决?
利用开发板的资源做了一个USB接口的鼠标,就是用开发板上的一个摇杆作为鼠标方向的移动,另外用两个按键分别模拟鼠标的左键和右键。

现在想写上位机程序(VC6.0)对它进行读写,在得到了设备路径名之后,调用CreateFile总是失败,用GetLastError看到ErrorCode为ERROR_ACCESS_DENIED。通过单步调试可以看到已经可以获得正确的设备路径名了。(我使用的是XP系统自带的驱动程序。)

看到有人说过,CreateFile如果想打开系统独占型的设备(比如鼠标键盘这种标准输入输出设备),只会返回无效的句柄。如果是这样,我想请问:一个设备是否是系统独占型设备是由什么决定的?是该设备所对应的驱动程序中吗?还是USB设备的Firmware?

回答任何问题都有分给,谢谢各位了。


[解决办法]
我想可能在驱动程序里面
[解决办法]
Hidclass.sys设备类驱动程序
hidusb.sys小驱动程序
[解决办法]
具体的我也不清楚,如果是通用的话,则直接可以使用系统的驱动,如果想在系统驱动上面做什么话,则可以做过滤驱动程序吧,具体要去找相关的资料.
[解决办法]
你调用CreateFile的参数是什么?尤其是dwDesiredAccess(第二个)参数,如果是GENERIC_WRITE的话,那恭喜你,可能只要改为GENERIC_READ | GENERIC_WRITE就OK了。

http://support.microsoft.com/kb/842792

[解决办法]
看看你的驱动里的IRP_MJ_CREATE是怎么处理的,肯定是处理这个消息的函数里面没有成功返回,把代码贴出来吧
[解决办法]
HANDLE connectToIthUSBHIDDevice (DWORD deviceIndex)
{
// GUID hidGUID;

HDEVINFO hardwareDeviceInfoSet;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_INTERFACE_DEVICE_DETAIL_DATA deviceDetail;
ULONG requiredSize;
HANDLE deviceHandle = INVALID_HANDLE_VALUE;
DWORD result;

//Get the HID GUID value - used as mask to get list of devices //获GUID
HidD_GetHidGuid (&hidGUID);

//Get a list of devices matching the criteria (hid interface, present)
hardwareDeviceInfoSet = SetupDiGetClassDevs (&hidGUID,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_DEVICEINTERFACE)); // Function class devices.

deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

//Go through the list and get the interface data//枚举设备
result = SetupDiEnumDeviceInterfaces (hardwareDeviceInfoSet,
NULL, //infoData,
&hidGUID, //interfaceClassGuid,
deviceIndex, 
&deviceInterfaceData);

/* Failed to get a device - possibly the index is larger than the number of devices */
if (result == FALSE)
{
SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
return INVALID_HANDLE_VALUE; //未找到任何可用USB设备
}

//Get the details with null values to get the required size of the buffer//获detaildata结构数组的长度
SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
&deviceInterfaceData,
NULL, //interfaceDetail,
0, //interfaceDetailSize,
&requiredSize,
0); //infoData))

//Allocate the buffer
deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);


//Fill the buffer with the device details //获detailData
if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
&deviceInterfaceData,


deviceDetail,
requiredSize,
&requiredSize,
NULL)) 
{
SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
free (deviceDetail);
return INVALID_HANDLE_VALUE;
}

for(unsigned int i=0; i < requiredSize-sizeof(DWORD); i++)
DevicePath[i]=*((CHAR*)(deviceDetail->DevicePath+i));

//Open file on the device
deviceHandle = CreateFile (deviceDetail->DevicePath,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, // no SECURITY_ATTRIBUTES structure
OPEN_EXISTING, // No special create flags
0, 
NULL); // No template file

SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
free (deviceDetail);
return deviceHandle;
}
可以参考.

热点排行