zhiyuan19840428
驱动小牛
驱动小牛
  • 注册日期2004-05-11
  • 最后登录2005-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2203回复:7

用createfile打开驱动对象时有错,请指教

楼主#
更多 发布于:2004-08-09 08:11
我写一个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;
}
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-09 08:46
看看驱动里是不是注册了设备接口
zfw
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-08-09 10:02
你的guid有没有搞错
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
pugb79
驱动牛犊
驱动牛犊
  • 注册日期2004-07-29
  • 最后登录2007-01-06
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-09 16:43
我最近在调用usb设备时也遇到了这个问题
不知道楼主的guid是不是{0x36FC9E60-0xC465-0x11CF-0x8056-0x444553540000}
我访问这个GUID号,但是老是不成功
关注ing
summerfruit
驱动牛犊
驱动牛犊
  • 注册日期2004-06-12
  • 最后登录2013-12-07
  • 粉丝0
  • 关注0
  • 积分395分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-19 13:40
我是用这个GUID,
0x36FC9E60-0xC465-0x11CF-0x8056-0x444553540000
但是跟你一样,枚举interface时总失败,
不知大哥问题解决没有,
可否高知我解决方法
谢谢,先!
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-19 14:26
两位老大,不要搞混了interface guid和ClassGUID
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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保持一致就可以了.呵呵,说多了点.多看看吧
linan1003
驱动牛犊
驱动牛犊
  • 注册日期2005-05-05
  • 最后登录2010-02-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-26 12:43
驱动里调用
IoSetDeviceInterfaceState (&nameString,TRUE);没有
游客

返回顶部