zhaoaimin
驱动牛犊
驱动牛犊
  • 注册日期2003-11-10
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3734回复:27

用Createfile成功返回的句柄却不能读写,请教

楼主#
更多 发布于:2003-11-10 17:58
我用Createfile()成功返回读写句柄,然而用writefile,readfile却不行,请各位赐教
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-31 14:58
U盘是不是不能用ReadFile和WriteFile?它是不是应该响应SCSI命令集呀?


u盘的好像没有这么简单
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
ruyili9803
驱动牛犊
驱动牛犊
  • 注册日期2004-06-07
  • 最后登录2005-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-31 08:40
U盘是不是不能用ReadFile和WriteFile?它是不是应该响应SCSI命令集呀?
binaryman
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2004-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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);

请问我这样做的方法是否正确?
binaryman
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2004-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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);

请问我这样做的方法是否正确?
binaryman
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2004-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);

请问我这样做的方法是否正确?
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-30 21:14
你的问题还没有解决吗?
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-30 17:50
a5dcbf10-6530-11d2-901f-00c04fb951ed,如果没有错的话
ruyili9803
驱动牛犊
驱动牛犊
  • 注册日期2004-06-07
  • 最后登录2005-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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},
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-30 15:46
十有八九是GUID的事,你再查一下GUID获取的对不对
ip4347
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2010-10-31
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
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]
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-30 08:51
用SoftIce跟踪一下,看Write和 Read时驱动是不是正确执行了,最后应该是调用CallDriver后返回,如果都对的话就是firmware有问题了
zfw
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-30 08:00
还是没搞出来,快不行了
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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"
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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

                        
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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打开。
我用这样的方法实现过!
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-07-28 10:08
我在createfile之前用strcat在devicePath上加了"\PIPE01"(“\PIPE02”),是不是就是打开了通道呢?

另外那些返回值不知道对不对?


[编辑 -  7/28/04 by  billy2004]
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-07-27 23:11
是PDIUSBD12,可能是pipe的室,可是在哪儿设置啊?
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-07-27 22:40
我的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
 


可是你并没有打开pipe(通道)呀!
所以就不能对设备读写。
你用的是PDIUSBD12吗?
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
billy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-03
  • 最后登录2005-01-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
上一页
游客

返回顶部