阅读:11306回复:18
调用CreateFile失败,错误代码为ERROR_ACCESS_DENIED,怎么办?
利用开发板的资源做了一个USB接口的鼠标
就是用开发板上的一个摇杆作为鼠标方向的移动 另外用两个按键分别模拟鼠标的左键和右键 现在想写上位机程序对它进行读写 在得到了设备路径名之后 调用CreateFile总是失败 用GetLastError看到ErrorCode为ERROR_ACCESS_DENIED 烦请大虾解释一下 通常遇到这种问题会是什么原因 跟设备的Firmware有关系吗 还是驱动的问题(因为是HID类设备,用的是系统自带的驱动)? 又是一天过去了 这个问题没有解决 着急啊! |
|
沙发#
发布于:2007-09-22 16:28
我在CSDN的“驱动开发/核心开发”版上看到一个帖子
跟我一样的问题 楼主问题解决了 但是没有告诉怎么解决的 郁闷啊 时间紧啊,有经验的帮帮忙啊! |
|
板凳#
发布于:2007-09-23 19:35
基本上确定为你的软件问题
|
|
|
地板#
发布于:2007-09-23 22:22
引用第2楼AllenZh于2007-09-23 19:35发表的 : 楼上的说详细点好吗? 我的软件是指Firmware还是指我的上位机程序? 非常感谢你的回复! |
|
地下室#
发布于:2007-09-24 10:20
我运行在这个坛子里面下载的USBPort程序
点击“查找”, 出现了“无法打开通信端口”这个对话框。 看了一下他的代码,同样实在CreateFile的时候返回了无效的句柄。 现在把这个USBPort例程共享在这里 大家帮忙找找原因 拜托了,各位高手。 |
|
|
5楼#
发布于:2007-09-24 13:13
你这个问题是因为:鼠标作为系统的重要输入设备,在连接到系统后,会被系统以Exclusive方式打开。所以你想使用CreateFile获取鼠标设备的句柄,是不能办到的。
|
|
6楼#
发布于:2007-09-24 14:30
引用第5楼ytwei于2007-09-24 13:13发表的 : 非常感谢楼上的回复! 除了鼠标以外,还有什么设备是会被系统独占的方式打开?键盘会吗? 另外如果鼠标是被系统独占的,无法获得鼠标设备的句柄的话,肯定也就不能通过也就不能调用HidD_GetAttributes();得到设备的属性.。但是USB View的例程为什么可以读取所有设备的属性(包括鼠标设备)?它又是通过什么方式得到这些属性的呢? 后面我会把编译好的USB View的程序附上。 以下是我HID设备的报告描述符: const u8 Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] = { 0x05, /*Usage Page(Generic Desktop)*/ 0x01, 0x09, /*Usage(Mouse)*/ 0x02, 0xA1, /*Collection(Application)*/ 0x01, 0x09, /*Usage(Pointer)*/ 0x01, /* 8 */ 0xA1, /*Collection(Physical)*/ /*not Collection(Linked)*/ 0x00, 0x05, /*Usage Page(Buttons)*/ 0x09, 0x19, /*Usage Minimum(1)*/ 0x01, 0x29, /*Usage Maximum(3)*/ 0x03, /* 16 */ 0x15, /*Logical Minimum(0)*/ 0x00, 0x25, /*Logical Maximum(1)*/ 0x01, 0x95, /*Report Count(3)*/ 0x03, 0x75, /*Report Size(1)*/ 0x01, /* 24 */ 0x81, /*Input(Variable)*/ 0x02, 0x95, /*Report Count(1)*/ 0x01, 0x75, /*Report Size(5)*/ 0x05, 0x81, /*Input(Constant,Array)*/ 0x01, /* 32 */ 0x05, /*Usage Page(Generic Desktop)*/ 0x01, 0x09, /*Usage(X axis)*/ 0x30, 0x09, /*Usage(Y axis)*/ 0x31, 0x09, /*Usage(Wheel)*/ 0x38, /* 40 */ 0x15, /*Logical Minimum(-127)*/ 0x81, 0x25, /*Logical Maximum(127)*/ 0x7F, 0x75, /*Report Size(8)*/ 0x08, 0x95, /*Report Count(3)*/ 0x03, /* 48 */ 0x81, /*Input(Variable, Relative)*/ 0x06, 0xC0, /*End Collection*/ 0xC0 /*End Collection*/ } ; /* Joystick_ReportDescriptor */ 我是把这个设备作为Mouse使用的,可能就是你说的问题,被系统独占了。我现在再去详细看看HID类设备中其他类型的设备,最终是要通过应用程序给设备发送命令,点亮电路板上的4个LED。 |
|
|
7楼#
发布于:2007-09-26 16:34
键盘也是独占的,但也是可以访问的,要不键盘测试软件(不使用驱动的那种)就不可能正常运行。
|
|
|
8楼#
发布于:2007-09-27 08:29
引用第7楼AllenZh于2007-09-26 16:34发表的 : 始终还是不明白在USBView里面是怎么可以得到所有设备(包括鼠标键盘)的句柄的。 它在EnumerateHub()函数里面是这样调用的: hHubDevice = CreateFile(deviceName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 其中deviceName是这样得到的 PCHAR deviceName; deviceName = (PCHAR)ALLOC(strlen(HubName) + sizeof("\\\\.\\")); strcpy(deviceName, "\\\\.\\"); strcpy(deviceName + sizeof("\\\\.\\") - 1, info->HubName); 这样又牵涉到了info,它是PUSBDEVICEINFO info;这样声明的 这种使用方法不是很了解,有没有人明白USBView中的这种得到所有设备句柄的方式,可以给大家讲一下子啊。 另外:怎么给分给大家呀? |
|
9楼#
发布于:2007-10-07 22:18
具体参考USBView等的代码
一句话给你说清楚几乎不可能,既变是说清楚了也未必能理解真正内涵,自己研究下代码要了解应该不是难事。 |
|
|
10楼#
发布于:2007-10-07 22:20
有到是“师傅领进门,修行在个人”,我的回答通常都只能给一个方向,具体还要靠你自己去实现。
原因很简单,上天只给了我一天24小时,而不是48小时。 |
|
|
11楼#
发布于:2007-10-08 10:26
我测试了一下,HIDClient确实不能得到KBD的设备句柄(注意是键盘,不是其它HID设备), 不知AllenZH如何访问系统独占设备的.如果上键盘测试软件能测试按键,它并不需要得到设备句柄. 记得早期的DDK中有USBVIEW这个工具, 在WIN98中能读到键盘, 但在WIN98中的键盘并不是独占的. 另外, 记得它在安装时,使用它自己的一套测试驱动.
|
|
|
12楼#
发布于:2007-10-15 11:33
有关USB VIEW能获取所有USB设备的信息,我曾经用过USB VIEW,所以对它的原理略知一二。它是先枚举主机控制器,再通过主机控制器的设备名(HCD**)来向HC驱动发送DeviceIoControl来获得一些信息,比如IOCTL_USB_GET_NODE_INFORMATION。
通过HID设备类枚举到的设备名,再使用CreateFile来访问是肯定不可行的。可以考虑使用DirectInput 方式来完成你的测试工作,有个DIQUICK.EXE你可以参考。 |
|
13楼#
发布于:2007-10-25 11:36
To ytwei:
使用DirectInput 方式来进行通信,能否告知的更详细些 或者提供一些资料。谢谢! |
|
14楼#
发布于:2007-10-30 12:10
USBView的代码我没看,但看过其他类似的程序代码,此程序我执行过。得到USB设备的信息时,并没用到CreateFile();首先是用Createfile()得到USB控制器,再用CreatFile()得到HUB,然后就可以得到HUB下的USB设备的信息。
|
|
15楼#
发布于:2007-10-31 13:55
楼上说的对,USB View也是这么做的,是通过向HUB发送IOCTL来获取连接到HUB上的设备信息。至于allanzhou9527想要了解DirectInput ,你可以参考http://www.programfan.com/article/showarticle.asp?id=815。还有DIQUICK.EXE作为你的示例程序,这是一个很久前的程序了,你在网上搜搜吧。
|
|
16楼#
发布于:2007-11-09 17:42
Re:调用CreateFile失败,错误代码为ERROR_ACCESS_DENIED,怎么
据说usbview是通过HUB枚举获得设备信息的。 |
|
17楼#
发布于:2007-11-12 08:51
引用第15楼ytwei于2007-10-31 13:55发表的 : 多谢大虾指点,感激不尽! |
|
18楼#
发布于:2009-06-10 17:57
回 17楼(allanzhou9527) 的帖子
请问楼主对USB鼠标进行读写的问题解决了吗?我现在也遇到同样的问题 就是CreateFile进行读访问被拒绝啊 楼主如果解决了可否指点一下,十分感谢 |
|