| 
			 
					阅读:11752回复: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进行读访问被拒绝啊 楼主如果解决了可否指点一下,十分感谢				 | 
	|