阅读:1803回复:16
大家看看我这个程序(限明天上午前回复)
就一个打开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); } } |
|
沙发#
发布于:2004-07-18 17:25
你用的pGuid是设备的GUID吧,得到的 ifDetail->DevicePath要再加上管道名才能用,管道名在驱动中定义好的。
[编辑 - 7/18/04 by zfw] |
|
|
板凳#
发布于:2004-07-18 19:27
但是我用的驱动是设备自带的sys 文件,怎样才能看出管道名呢?
|
|
地板#
发布于:2004-07-18 21:34
可以试试从PIPE00到PIPE03
|
|
地下室#
发布于: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; } } |
|
5楼#
发布于:2004-07-19 08:05
"\\.\USB#Vid_05e3&Pid_0702#5&17ef3568&0&2#{36FC9E60-C465-11CF-8056-444553540000}\\pipe0";少了“\”,这样应该能用createfile打开读写句柄,不过不知道你还拿USBDeviceDescriptorType作什么用?
|
|
6楼#
发布于: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] |
|
7楼#
发布于:2004-07-19 09:03
我打开时是这样的:
char Path[MAX_PATH] memset(Path,0,MAX_PATH); strcpy(Path,DevInterface.DevicePath()); strcat(Path,"\\PIPE03"); .... PIPE可从PIPE01到PIPE03都试试 |
|
|
8楼#
发布于:2004-07-19 09:07
麻烦楼上的能不能把你的打开方法写详细一点呢?
|
|
9楼#
发布于: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] |
|
|
10楼#
发布于:2004-07-19 09:27
楼上的能给个联系方式吗?
想直接像你请教 |
|
11楼#
发布于:2004-07-19 09:29
MSN加我,zhangfwen@msn.com
|
|
|
12楼#
发布于:2004-07-19 13:29
你用的pGuid是设备的GUID吧,得到的 ifDetail->DevicePath要再加上管道名才能用,管道名在驱动中定义好的。 那用什么guid,可以不要加上管道号?你指的设备的guid是说在驱动力注册的那个Guid还是指设备类的class guid? |
|
13楼#
发布于:2004-07-19 13:40
当然是驱动里的设备GUID
|
|
|
14楼#
发布于:2004-07-19 14:02
那在何种情况下还要加上pipe号呢?是否是针对USB的设备的做法?我以前似乎没有用到这种方法。SetupDiGetdeviceInterfaceDetail获得devicepath之后就可以打开设备了。
|
|
15楼#
发布于:2004-07-21 23:39
请教高人指点:
我用vc6。0编写一个和usb设备通讯的程序,现在使用DeviceIoControl得到的信息可以知道usb_hub上某个口上连接了外设,我使用这里得到的什么信息和什么方法来构造createfile的文件名? 先行谢过! |
|
16楼#
发布于: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] |
|
|