ttjjcc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1805回复:16

大家看看我这个程序(限明天上午前回复)

楼主#
更多 发布于:2004-07-18 16:33
就一个打开usb设备,并关闭设备的简单程序。编译没问题,一运行就挂,各位高手看看问题在哪呢?
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include "ezusbsys.h"
#include <conio.h>
#include "winioctl.h"

HANDLE USB_Createfile( GUID* pGuid, DWORD InterfaceIndex)
{
   // Get handle to relevant device information set
   HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
   if(info==INVALID_HANDLE_VALUE)
   {
      return NULL;
   }

   // Get interface data for the requested MemberIndex
   SP_INTERFACE_DEVICE_DATA ifdata;
   ifdata.cbSize = sizeof(ifdata);
   if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, InterfaceIndex, &ifdata))
   {
      SetupDiDestroyDeviceInfoList(info);
      return NULL;
   }

   // Get size of symbolic link name
   DWORD ReqLen;
   SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);
   PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
   if( ifDetail==NULL)
   {
      SetupDiDestroyDeviceInfoList(info);
      return NULL;
   }

   // Get symbolic link name
   ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
   if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL))
   {
      SetupDiDestroyDeviceInfoList(info);
      delete ifDetail;
      return NULL;
   }

   // Open file
   HANDLE pDevicefile = CreateFile( ifDetail->DevicePath,
      GENERIC_READ | GENERIC_WRITE,
      FILE_SHARE_READ | FILE_SHARE_WRITE,
      NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   if( pDevicefile==INVALID_HANDLE_VALUE) pDevicefile = NULL;

   delete ifDetail;
   SetupDiDestroyDeviceInfoList(info);
   return pDevicefile;
}





void main()
{
HANDLE hDevice = NULL;
    //USB#Vid_046b&Pid_0157#5&2017af02&0&2#{B5A22D9A-7A7C-489D-ADE4-90C5E5A93149}
//GUID WDM2_GUID={0x36FC9E60,0xC465,0x11CF,0X80,0x56,0x44,0x45,0x53,0x54,0x00,0x00};
GUID WDM2_GUID={0xB5A22D9A,0x7A7C,0x489d,0xAD,0xE4,0x90,0xC5,0xE5,0xA9,0x31,0x49};

    hDevice = USB_Createfile(&WDM2_GUID,0);

if (hDevice == NULL)
{
printf("Open Device %s failed");
   return;
}
else
{
printf("Open Device %s success !\n");

CloseHandle(hDevice);
}
}
snoopy_dl
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-08-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-22 12:22
void main()
{
HANDLE hDevice = NULL;
//usbstorage***************************************
char szDeviceName[256] =".USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}pipe0";
^^^^^^^^^^^^^^^^^^
}

这个问题你解决了吗?
1。如果你直接用USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000},那么就不需要再使用上面的子程序,就可以直接CreateFile打开设备.
2.char szDeviceName[256] ="\\\\\\\\.\\\\USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}pipe00";
3.pipe00不能确定,你应该再查一下ez系列。
 




[编辑 -  7/22/04 by  snoopy_dl]

[编辑 -  7/22/04 by  snoopy_dl]
虚心向各位大虾请教~~~~~~ 争取自身的提高~~~~~~~~~~
binaryman
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2004-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-21 23:39
请教高人指点:
我用vc6。0编写一个和usb设备通讯的程序,现在使用DeviceIoControl得到的信息可以知道usb_hub上某个口上连接了外设,我使用这里得到的什么信息和什么方法来构造createfile的文件名? 先行谢过!
bigbee
驱动牛犊
驱动牛犊
  • 注册日期2003-08-04
  • 最后登录2004-10-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-19 14:02
那在何种情况下还要加上pipe号呢?是否是针对USB的设备的做法?我以前似乎没有用到这种方法。SetupDiGetdeviceInterfaceDetail获得devicepath之后就可以打开设备了。
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-19 13:40
当然是驱动里的设备GUID
zfw
bigbee
驱动牛犊
驱动牛犊
  • 注册日期2003-08-04
  • 最后登录2004-10-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-19 13:29
你用的pGuid是设备的GUID吧,得到的 ifDetail->DevicePath要再加上管道名才能用,管道名在驱动中定义好的。

[编辑 -  7/18/04 by  zfw]


那用什么guid,可以不要加上管道号?你指的设备的guid是说在驱动力注册的那个Guid还是指设备类的class guid?
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-19 09:29
MSN加我,zhangfwen@msn.com
zfw
ttjjcc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-19 09:27
楼上的能给个联系方式吗?
想直接像你请教
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-19 09:21
DS中有个头文件devintf.h,CDeviceInterfaceClass是封装好的一个类,直接用就行了

DWORD OpenByInterface(
  GUID* pClassGuid, // points to the GUID that identifies the interface class
  DWORD instance, // specifies which instance of the enumerated devices to open
  PDWORD pError // address of variable to receive error status
  )
{
char Path[MAX_PATH];

CDeviceInterfaceClass DevClass(pClassGuid, pError);
if (*pError != ERROR_SUCCESS)
return *pError;

CDeviceInterface DevInterface(&DevClass, instance, pError);
if (*pError != ERROR_SUCCESS)
return *pError;

memset(Path,0,MAX_PATH);
strcpy(Path,DevInterface.DevicePath());
strcat(Path,"\\PIPE03"); // pipe00,pipe02-0x82 input,pipe01,pipe03-0x02 output
hDeviceWrite = CreateFile(
 Path,
 GENERIC_WRITE ,
 FILE_SHARE_WRITE,
 NULL,
 OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL,
 NULL
 );  
 if (hDeviceWrite == INVALID_HANDLE_VALUE)
 {
   *pError = GetLastError();
     return *pError;
 }
memset(Path,0,MAX_PATH);
 strcpy(Path,DevInterface.DevicePath());  
 strcat(Path,"\PIPE02");//read
 hDeviceRead = CreateFile(
 Path,
 GENERIC_READ ,
 FILE_SHARE_READ,
 NULL,
 OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL,
 NULL
 );  
 if (hDeviceRead == INVALID_HANDLE_VALUE)
 {
   *pError = GetLastError();
    return *pError;
 }


打开的设备句柄。hDeviceWrite和hDeviceRead就可以在WriteFile和ReadFile中用了

[编辑 -  7/19/04 by  zfw]

[编辑 -  7/19/04 by  zfw]
zfw
ttjjcc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-19 09:07
麻烦楼上的能不能把你的打开方法写详细一点呢?
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-19 09:03
我打开时是这样的:
char Path[MAX_PATH]
memset(Path,0,MAX_PATH);
strcpy(Path,DevInterface.DevicePath());
strcat(Path,"\\PIPE03");

....
PIPE可从PIPE01到PIPE03都试试
zfw
ttjjcc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-19 08:34
是不是把
char szDeviceName[256] ="\.USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}pipe0";
改成:
char szDeviceName[256] ="\."USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}pipe0"";
啊?
可是这样编译都过不了啊。
大虾能不能写具体一点呢?

[编辑 -  7/19/04 by  ttjjcc]
netscan
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2006-05-18
  • 粉丝0
  • 关注0
  • 积分47分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-19 08:05
"\\.\USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}\\pipe0";少了“\”,这样应该能用createfile打开读写句柄,不过不知道你还拿USBDeviceDescriptorType作什么用?
ttjjcc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-18 22:25
改了还是不行啊,大家看看是不是该这样改?

#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include "ezusbsys.h"
#include <conio.h>
#include   "winioctl.h"


//HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance);

typedef struct
{
  public:
    BYTE bLength;
    BYTE bDescriptorType;
    WORD  bcdUSB;
    BYTE bDeviceClass;
    BYTE bDeviceSubClass;
    BYTE bDeviceProtocol;
    BYTE bMaxPacketSize0;
    WORD idVendor;
    WORD idProduct;
    WORD bcdDevice;
    BYTE iManufacturer;
    BYTE iProduct;
    BYTE iSerialNumber;
    BYTE bNumConfigurations;
}USBDeviceDescriptorType;

HANDLE OpenDevice(char *szDeviceName)
{
HANDLE hDevice = CreateFile
(
szDeviceName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
   0,
NULL
);

if( hDevice==INVALID_HANDLE_VALUE)
{
return NULL;
}
return hDevice;
}



void main()
{
HANDLE hDevice = NULL;
//usbstorage***************************************
char szDeviceName[256] ="\\\\.\\USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}\\pipe0";


hDevice = OpenDevice( szDeviceName );
if (hDevice == NULL)
{
printf("Open Device %s failed, errorcode : %u !\n");
return ;
}
    else
{
printf("Open Device %s success !\n", szDeviceName);
CloseHandle(hDevice);
return;
}



}
netscan
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2006-05-18
  • 粉丝0
  • 关注0
  • 积分47分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-18 21:34
可以试试从PIPE00到PIPE03
ttjjcc
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-07-18 19:27
但是我用的驱动是设备自带的sys 文件,怎样才能看出管道名呢?
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-07-18 17:25
你用的pGuid是设备的GUID吧,得到的 ifDetail->DevicePath要再加上管道名才能用,管道名在驱动中定义好的。

[编辑 -  7/18/04 by  zfw]
zfw
游客

返回顶部