allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
阅读:11306回复:18

调用CreateFile失败,错误代码为ERROR_ACCESS_DENIED,怎么办?

楼主#
更多 发布于:2007-09-22 15:44
利用开发板的资源做了一个USB接口的鼠标
就是用开发板上的一个摇杆作为鼠标方向的移动
另外用两个按键分别模拟鼠标的左键和右键

现在想写上位机程序对它进行读写
在得到了设备路径名之后
调用CreateFile总是失败
用GetLastError看到ErrorCode为ERROR_ACCESS_DENIED

烦请大虾解释一下
通常遇到这种问题会是什么原因
跟设备的Firmware有关系吗
还是驱动的问题(因为是HID类设备,用的是系统自带的驱动)?

又是一天过去了
这个问题没有解决
着急啊!
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-22 16:28
我在CSDN的“驱动开发/核心开发”版上看到一个帖子
跟我一样的问题
楼主问题解决了
但是没有告诉怎么解决的
郁闷啊

时间紧啊,有经验的帮帮忙啊!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-23 19:35
基本上确定为你的软件问题
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-23 22:22
引用第2楼AllenZh于2007-09-23 19:35发表的  :
基本上确定为你的软件问题


楼上的说详细点好吗?
我的软件是指Firmware还是指我的上位机程序?

非常感谢你的回复!
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-24 10:20
我运行在这个坛子里面下载的USBPort程序
点击“查找”,
出现了“无法打开通信端口”这个对话框。
看了一下他的代码,同样实在CreateFile的时候返回了无效的句柄。
现在把这个USBPort例程共享在这里
大家帮忙找找原因
拜托了,各位高手。
附件名称/大小 下载次数 最后更新
USBPort.rar (3598KB)  78 2007-09-24 10:20
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-24 13:13
你这个问题是因为:鼠标作为系统的重要输入设备,在连接到系统后,会被系统以Exclusive方式打开。所以你想使用CreateFile获取鼠标设备的句柄,是不能办到的。
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-09-24 14:30
引用第5楼ytwei于2007-09-24 13:13发表的  :
你这个问题是因为:鼠标作为系统的重要输入设备,在连接到系统后,会被系统以Exclusive方式打开。所以你想使用CreateFile获取鼠标设备的句柄,是不能办到的。


非常感谢楼上的回复!
除了鼠标以外,还有什么设备是会被系统独占的方式打开?键盘会吗?

另外如果鼠标是被系统独占的,无法获得鼠标设备的句柄的话,肯定也就不能通过也就不能调用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。
附件名称/大小 下载次数 最后更新
USBView.rar (2263KB)  52 2007-09-24 14:30
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-09-26 16:34
键盘也是独占的,但也是可以访问的,要不键盘测试软件(不使用驱动的那种)就不可能正常运行。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
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中的这种得到所有设备句柄的方式,可以给大家讲一下子啊。

另外:怎么给分给大家呀?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-07 22:18
具体参考USBView等的代码
一句话给你说清楚几乎不可能,既变是说清楚了也未必能理解真正内涵,自己研究下代码要了解应该不是难事。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-10-07 22:20
有到是“师傅领进门,修行在个人”,我的回答通常都只能给一个方向,具体还要靠你自己去实现。
原因很简单,上天只给了我一天24小时,而不是48小时。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-10-08 10:26
我测试了一下,HIDClient确实不能得到KBD的设备句柄(注意是键盘,不是其它HID设备), 不知AllenZH如何访问系统独占设备的.如果上键盘测试软件能测试按键,它并不需要得到设备句柄. 记得早期的DDK中有USBVIEW这个工具, 在WIN98中能读到键盘, 但在WIN98中的键盘并不是独占的. 另外, 记得它在安装时,使用它自己的一套测试驱动.
一起交流,共同提高!
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-10-15 11:33
有关USB VIEW能获取所有USB设备的信息,我曾经用过USB VIEW,所以对它的原理略知一二。它是先枚举主机控制器,再通过主机控制器的设备名(HCD**)来向HC驱动发送DeviceIoControl来获得一些信息,比如IOCTL_USB_GET_NODE_INFORMATION。
通过HID设备类枚举到的设备名,再使用CreateFile来访问是肯定不可行的。可以考虑使用DirectInput 方式来完成你的测试工作,有个DIQUICK.EXE你可以参考。
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-10-25 11:36
To ytwei:
使用DirectInput 方式来进行通信,能否告知的更详细些
或者提供一些资料。谢谢!
andylione
驱动牛犊
驱动牛犊
  • 注册日期2007-10-24
  • 最后登录2007-11-21
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望25点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-10-30 12:10
USBView的代码我没看,但看过其他类似的程序代码,此程序我执行过。得到USB设备的信息时,并没用到CreateFile();首先是用Createfile()得到USB控制器,再用CreatFile()得到HUB,然后就可以得到HUB下的USB设备的信息。
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-10-31 13:55
楼上说的对,USB View也是这么做的,是通过向HUB发送IOCTL来获取连接到HUB上的设备信息。至于allanzhou9527想要了解DirectInput ,你可以参考http://www.programfan.com/article/showarticle.asp?id=815。还有DIQUICK.EXE作为你的示例程序,这是一个很久前的程序了,你在网上搜搜吧。
canjob
驱动牛犊
驱动牛犊
  • 注册日期2007-09-10
  • 最后登录2008-01-22
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-11-09 17:42
Re:调用CreateFile失败,错误代码为ERROR_ACCESS_DENIED,怎么
据说usbview是通过HUB枚举获得设备信息的。
allanzhou9527
驱动牛犊
驱动牛犊
  • 注册日期2006-03-01
  • 最后登录2008-01-17
  • 粉丝0
  • 关注0
  • 积分710分
  • 威望72点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-11-12 08:51
引用第15楼ytwei于2007-10-31 13:55发表的  :
楼上说的对,USB View也是这么做的,是通过向HUB发送IOCTL来获取连接到HUB上的设备信息。至于allanzhou9527想要了解DirectInput ,你可以参考http://www.programfan.com/article/showarticle.asp?id=815。还有DIQUICK.EXE作为你的示例程序,这是一个很久前的程序了,你在网上搜搜吧。


多谢大虾指点,感激不尽!
WF1120034357
驱动牛犊
驱动牛犊
  • 注册日期2009-06-05
  • 最后登录2009-07-03
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2009-06-10 17:57
回 17楼(allanzhou9527) 的帖子
请问楼主对USB鼠标进行读写的问题解决了吗?我现在也遇到同样的问题 就是CreateFile进行读访问被拒绝啊 楼主如果解决了可否指点一下,十分感谢
游客

返回顶部