阅读:2203回复:7
用createfile打开驱动对象时有错,请指教
我写一个USB过滤驱动程序,驱动已写好了,但不知为什么在打开驱动程序时老是出错(错误为SetupDiEnumDeviceInterfaces()失败,用getlasterror()得到的error code is 259(没有可能数据了),不知什么原因,请指教
代码如下: HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance) { OutputDebugString("GetDeviceViaInterface"); // Get handle to relevant device information set HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(info==INVALID_HANDLE_VALUE) { printf(cError, "No HDEVINFO available for this GUID , error code %u", GetLastError()); OutputDebugString(cError); return NULL; } // Get interface data for the requested instance SP_INTERFACE_DEVICE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata)) { printf(cError, "No SP_INTERFACE_DEVICE_DATA available for this GUID instance , error code %u", GetLastError()); OutputDebugString(cError); 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 rv = CreateFile( ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( rv==INVALID_HANDLE_VALUE) rv = NULL; delete ifDetail; SetupDiDestroyDeviceInfoList(info); return rv; } |
|
沙发#
发布于:2004-08-09 08:46
看看驱动里是不是注册了设备接口
|
|
|
板凳#
发布于:2004-08-09 10:02
你的guid有没有搞错
|
|
|
地板#
发布于:2004-08-09 16:43
我最近在调用usb设备时也遇到了这个问题
不知道楼主的guid是不是{0x36FC9E60-0xC465-0x11CF-0x8056-0x444553540000} 我访问这个GUID号,但是老是不成功 关注ing |
|
地下室#
发布于:2004-08-19 13:40
我是用这个GUID,
0x36FC9E60-0xC465-0x11CF-0x8056-0x444553540000 但是跟你一样,枚举interface时总失败, 不知大哥问题解决没有, 可否高知我解决方法 谢谢,先! |
|
5楼#
发布于:2004-08-19 14:26
两位老大,不要搞混了interface guid和ClassGUID
|
|
6楼#
发布于:2004-08-19 14:38
补充一下:
你是这么做的 SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); 再看看DDK里描述: ClassGuid Optionally points to a class GUID for a setup class or an interface class. If the DIGCF_DEVICEINTERFACE flag is set, ClassGuid represents an interface class; otherwise, ClassGuid represents a setup class. 所以你的pGuid必须是指interface class而不是setup class.而你的GUID 36FC9E60-C465-11CF-8056-444553540000却是setup class. 实际上你的驱动程序里已经通过IoRegisterDeviceInterface函数注册了一interface class,所以和驱动里的GUID保持一致就可以了.呵呵,说多了点.多看看吧 |
|
7楼#
发布于:2005-05-26 12:43
驱动里调用
IoSetDeviceInterfaceState (&nameString,TRUE);没有 |
|