阅读:3734回复:27
用Createfile成功返回的句柄却不能读写,请教
我用Createfile()成功返回读写句柄,然而用writefile,readfile却不行,请各位赐教
|
|
沙发#
发布于:2004-07-31 14:58
U盘是不是不能用ReadFile和WriteFile?它是不是应该响应SCSI命令集呀? u盘的好像没有这么简单 |
|
|
板凳#
发布于:2004-07-31 08:40
U盘是不是不能用ReadFile和WriteFile?它是不是应该响应SCSI命令集呀?
|
|
地板#
发布于:2004-07-30 21:53
接上面(不知为什么我的文字不能全部显示)
CString Pname=\.USB#ROOT_HUB#4&28dab860&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}; Pname=Pname+"\0002"; 将Pname传递给createfile,可以成功返回一个HANDLE。但是我使用这个返回的HANDLE来获得DCB 数据不能成功。 DCB dcb; bool fSuccess = GetCommState(hub_port_n, &dcb); 使用下面的调用也不成功 COMMPROP COMMPROP_data; BOOL comb=GetCommProperties(hub_port_n, &COMMPROP_data); 请问我这样做的方法是否正确? |
|
地下室#
发布于:2004-07-30 21:50
在我的机器上可以看到有二个Standard Universal PCI to USB Host Controller,每个USB Host Controller 下面有一个Root Hub。
每个Root Hub下有二个port,port1和port2。 其中通过usb 电缆连接了我的 motorola v600手机的Root Hub的信息如下: Root Hub: USB#ROOT_HUB#4&28dab860&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} Hub Power: Self Power Number of Ports: 2 Power switching: None Compound device: No No Over-current Protection (Bus Power Only) 现在可以看到连接了 v600 的port是port2,请问我如何来构造createfile中的文件名(请注意不是在系统内核模式下,而是在普通的应用程序中,另外v600 的驱动是虚拟modem)? 我使用 CString Pname=\.USB#ROOT_HUB#4&28dab860&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}; Pname=Pname+"\0002"; 将Pname传递给createfile,可以成功返回一个HANDLE。但是我使用这个返回的HANDLE来获得DCB 数据不能成功。 DCB dcb; bool fSuccess = GetCommState(hub_port_n, &dcb); 使用下面的调用也不成功 COMMPROP COMMPROP_data; BOOL comb=GetCommProperties(hub_port_n, &COMMPROP_data); 请问我这样做的方法是否正确? |
|
5楼#
发布于:2004-07-30 21:48
我的情况是这样的:
在我的机器上可以看到有二个Standard Universal PCI to USB Host Controller,每个USB Host Controller 下面有一个Root Hub。 每个Root Hub下有二个port,port1和port2。 其中通过usb 电缆连接了我的 motorola v600手机的Root Hub的信息如下: Root Hub: USB#ROOT_HUB#4&28dab860&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} Hub Power: Self Power Number of Ports: 2 Power switching: None Compound device: No No Over-current Protection (Bus Power Only) 现在可以看到连接了 v600 的port是port2,请问我如何来构造createfile中的文件名(请注意不是在系统内核模式下,而是在普通的应用程序中,另外v600 的驱动是虚拟modem)? 我使用 CString Pname=\.USB#ROOT_HUB#4&28dab860&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}; Pname=Pname+"\0002"; 将Pname传递给createfile,可以成功返回一个HANDLE。但是我使用这个返回的HANDLE来获得DCB 数据不能成功。 DCB dcb; bool fSuccess = GetCommState(hub_port_n, &dcb); 使用下面的调用也不成功 COMMPROP COMMPROP_data; BOOL comb=GetCommProperties(hub_port_n, &COMMPROP_data); 请问我这样做的方法是否正确? |
|
6楼#
发布于:2004-07-30 21:14
你的问题还没有解决吗?
|
|
|
7楼#
发布于:2004-07-30 17:50
a5dcbf10-6530-11d2-901f-00c04fb951ed,如果没有错的话
|
|
8楼#
发布于:2004-07-30 16:39
请问这个GUID是哪个,我的USB设备有几个GUID,一个是类GUID,{36FC9E60-C465-11CF-8056-444553540000}在HKLM\SYSTEM\CURRENTCONTROLSET\CONTROL\CLASS里定义,另外一个是
在HKLM\SYSTEM\CURRENTCONTROLSET\ENUM\USB里定义,如下: \??\USB#Vid_0ef5&Pid_2202#SN123456789#{a5dcbf10-6530-11d2-901f-00c04fb951ed}, |
|
9楼#
发布于:2004-07-30 15:46
十有八九是GUID的事,你再查一下GUID获取的对不对
|
|
10楼#
发布于:2004-07-30 11:19
我用的是usb9603,
固件已经调好了,用ds生成了了一个简单代码框架 问题如下: 首先,sys目录下面的sys驱动是否要在exe程序运行前,给设备加载上去? 其次,调试exe代码时 hDevice = OpenByInterface( &ClassGuid, 0, &Error); 返回了一个INVALID_HANDLE_VALUE 其中 CDeviceInterfaceClass DevClass(pClassGuid, pError); 得到的guid为{4CCE721E-692D-4A12-B388-0FB9C7FB134D}; CDeviceInterface DevInterface(&DevClass, instance, pError); 却返回了INVALID_HANDLE_VALUE, SetupDiEnumDeviceInterfaces 返回了0 不知道这是什么原因导致的 请大家帮忙分析一下,谢谢 [编辑 - 7/30/04 by ip4347] |
|
11楼#
发布于:2004-07-30 08:51
用SoftIce跟踪一下,看Write和 Read时驱动是不是正确执行了,最后应该是调用CallDriver后返回,如果都对的话就是firmware有问题了
|
|
|
12楼#
发布于:2004-07-30 08:00
还是没搞出来,快不行了
|
|
13楼#
发布于:2004-07-28 15:57
strcat (completeDeviceName,
"\\\\PIPE02" ); h = CreateFile( completeDeviceName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 这时completeDeviceName的值是0x005e5e30 "\\\\?usb#vid_0471&pid_0100#5&378d755d&0&1#{f16328af-4480-4b18-b028-51301beb166d}\\\\PIPE02" |
|
|
14楼#
发布于:2004-07-28 15:37
一共调用了两次createfile:
第一次调用: hOut = CreateFile ( functionClassDeviceData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); //这时functionClassDeviceData->DevicePath: //0x00c21774 "\\?\usb#vid_0471&pid_0100#5&378d755d&0&1#{f16328af-4480-4b18-b028-51301beb166d}" //这一次打开usb设备 ,creatrfile返回: 0x00000748 第二次调用: strcat (completeDeviceName, "\\PIPE2" ); h = CreateFile( completeDeviceName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); //这时completeDeviceName的值是 //0x005e5e30 "\\?\usb#vid_0471&pid_0100#5&378d755d&0&1#{f16328af-4480-4b18-b028-51301beb166d}\PIPE2" //这一次打开usb设备的端点, createfile 的返回值还是0x00000748 |
|
15楼#
发布于:2004-07-28 11:28
我在createfile之前用strcat在devicePath上加了"PIPE01"(“PIPE02”),是不是就是打开了通道呢? 你可以试试在你的functionClassDeviceData->DevicePath返回 "?usbstor#disk&ven_&prod_&rev_#6&381fcd8&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\\PIPE00"(PIPE00--对应端点1IN,PIPE01-对应端点1OUT,,PIPE02-对应端点2IN,PIPE03-对应端点2OUT)。然后再用CreateFile打开。 我用这样的方法实现过! |
|
|
16楼#
发布于:2004-07-28 10:08
我在createfile之前用strcat在devicePath上加了"\PIPE01"(“\PIPE02”),是不是就是打开了通道呢?
另外那些返回值不知道对不对? [编辑 - 7/28/04 by billy2004] |
|
17楼#
发布于:2004-07-27 23:11
是PDIUSBD12,可能是pipe的室,可是在哪儿设置啊?
|
|
18楼#
发布于:2004-07-27 22:40
我的GUID是: 可是你并没有打开pipe(通道)呀! 所以就不能对设备读写。 你用的是PDIUSBD12吗? |
|
|
19楼#
发布于:2004-07-27 22:29
我的GUID是:
0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); SetupDiGetClassDevs 返回0x0016fa30 SetupDiEnumDeviceInterfaces 返回 true functionClassDeviceData->DevicePath返回 "\?usbstor#disk&ven_&prod_&rev_#6&381fcd8&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}" createfile 返回 0x00000768 不知道这些返回值对不对? [编辑 - 7/28/04 by billy2004] |
|
上一页
下一页