阅读:4074回复:28
救命呀 。。。为啥我的用户程序老找不到驱动程序呀?
我编了个wdm驱动,用softice调试也可以,安装也成功了,但是用户程序测试时,老出现找不到驱动程序的错误。驱动程序也很简单,就是读写内存。
我把驱动程序和用户测试源程序还有inf文件上传为附件,。 请大哥大姐们抽点时间帮我瞧瞧。 我找了两天错误,找得郁闷呀。 小弟我刚学驱动,觉得原理弄明白了,没想到编起来不顺呀。请高手帮忙呀!!!!!! |
|
|
沙发#
发布于:2005-03-13 20:20
又搞了一天
还是没搞定:((((((((((((((9999 郁闷 |
|
板凳#
发布于:2005-03-12 11:30
我在inf文件把classguid加上去
可是inf文件安装老出错:((((((((((((((((((((((((((( |
|
地板#
发布于:2005-03-12 11:19
在testwdm。cpp中
、、、、、、、、、、成功、、、、、、、、、、 if(!SetupDiEnumDeviceInterfaces(info,NULL,pGuid,instance,&ifdata)) { printf(\"no SP_INTERFACE_DEVICE_DATA available for this guid instance\\n\"); SetupDiDestroyDeviceInfoList(info); return NULL; } 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); printf(\"the error can appere1!!\\n\"); return NULL; } 上面代码都是成功的,就是下面的老通不过,怪,我把下面代码注释掉也不行:((((( ifdetail->cbSize=sizeof(PSP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(info,&ifdata,ifdetail,ReqLen,NULL,NULL)) { SetupDiDestroyDeviceInfoList(info); printf(\"the error can appere2!!\\n\"); delete ifdetail; return NULL; } |
|
地下室#
发布于:2005-03-12 10:58
我发现SetupDiEnumDeviceInterfaces()出问题,Error 103
但用 http://www.driverdevelop.com/forum/viewthread.php?tid=67241 这代码可通过,你的Testwdm就是通不过 !! |
|
5楼#
发布于:2005-03-12 10:46
又是看了一上午,还是没搞定呀:((((((((((((
我是照着书上代码敲的,连大小写都一样了,就是接过出不来。 我照《windows 内核实验教程》上编的的。。。。搞不懂他也是xp编的 为啥我编的就不行:((((((((((( |
|
6楼#
发布于:2005-03-11 18:52
呵呵,,不好意思,,这两天没有来这里了。。
我还没有看别的 了,,打开你的inf文件一看,,就是问题 哦 1,你没有设备类型的guid,(自己可以用guidgen生成一个啊) 。 2,[DestinationDirs]一节下最好有默认的系统路径。。 3。你要是没有作成安装盘的话,,就不要那相应的几节了。。 问题多多的。。。你自己看看ddk里关于inf文件的语法文挡吧,, 哎!太多问题了,, 不好意思也是比较忙,,有空给你看看的,,千万别光等着我,,,我不知道什么时候看呢,,,,没有办法,,忙?。累啊,,嘿嘿 [编辑 - 3/11/05 by aiwadgj] |
|
|
7楼#
发布于:2005-03-11 16:06
哪位高手帮我看看呀!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
8楼#
发布于:2005-03-11 13:02
我基本写的是标准的wdm驱动。
我查了好多变,是不是我的guid又错???? |
|
9楼#
发布于:2005-03-11 12:26
注册设备接口与注册符号联接是两码子回事 知到了 !! |
|
10楼#
发布于:2005-03-11 11:49
设备接口
用旧的命名方法命名设备对象,并创建一个应用程序能够使用的符号连接,存在着两个主要问题。命名设备对象所带来的潜在安全问题我们已经讨论过。此外,访问设备的应用程序需要先知道设备采用的命名方案。如果你的硬件仅由你的应用程序访问,那么不会有什么问题。但是,如果有其它公司想为你的硬件写应用程序,并且有许多硬件公司想制作相似的设备,那么设计一个合适的命名方案是困难的。最后,许多命名方案将依赖于程序员所说的自然语言,这不是一个好的选择。 为了解决这些问题,WDM引入了一个新的设备命名方案,该方案是语言中立的、易于扩展的、可用于许多硬件和软件厂商,并且易于文档化。该方案依靠一个设备接口(device interface)的概念,它基本上是软件如何访问硬件的一个说明。一个设备接口被一个128位的GUID唯一标识。你可以用平台SDK中的UUIDGEN工具或者GUIDGEN工具生成GUID,这两个工具输出同一种数,但格式不同。这个想法就象某些工业组织联合起来共同制定某种硬件的标准访问方法一样。在标准制作过程中,产生了一些GUID,这些GUID将永远关联到某些接口上。 注册设备接口 调用IoRegisterDeviceInterface函数,功能驱动程序的AddDevice函数可以注册一个或多个设备接口: #include <initguid.h> <--1 #include \"guids.h\" <--2 ... NTSTATUS AddDevice(...) { ... IoRegisterDeviceInterface(pdo, &GUID_SIMPLE, NULL, &pdx->ifname); <--3 ... } 我们包含了GUIDS.H头文件,那里定义了DEFINE_GUID宏。DEFINE_GUID通常声明一个外部变量。在驱动程序的某些地方,我们不得不为将要引用的每个GUID保留初始化的存储空间。系统头文件INITGUID.H利用某些预编译指令使DEFINE_GUID宏在已经定义的情况下仍能保留该存储空间。 我使用单独的头文件来保存我要引用的GUID定义。这是一个好的想法,因为用户模式的代码也需要包含这些定义,但它们不需要那些仅与内核模式驱动程序有关的声明。 IoRegisterDeviceInterface的第一个参数必须是设备PDO的地址。第二个参数指出与接口关联的GUID,第三个参数指出额外的接口细分类名。只有Microsoft的代码才使用名称细分类方案。第四个参数是一个UNICODE_STRING串的地址,该串用于接收设备对象的符号连接名。 IoRegisterDeviceInterface的返回值是一个Unicode串,这样在不知道驱动程序编码的情况下,应用程序能用该串确定并打开设备句柄。顺便说一下,这个名字比较丑陋;后面例子是我在Windows 98中为Sample设备生成的名字:\\DosDevices\\0000000000000007#{CAF53C68-A94C-11d2-BB4A-00C04FA330A6}。 注册过程实际就是先创建一个符号连接名,然后再把它存入注册表。之后,当响应PnP请求IRP_MN_START_DEVICE时,驱动程序将调用IoSetDeviceInterfaceState函数“使能”该接口: IoSetDeviceInterfaceState(&pdx->ifname, TRUE); 在响应这个调用过程中,I/O管理器将创建一个指向设备PDO的符号连接对象。以后,驱动程序会执行一个功能相反的调用禁止该接口(用FALSE做参数调用IoSetDeviceInterfaceState)。最后,I/O管理器删除符号连接对象,但它保留了注册表项,即这个名字将总与设备的这个实例关联;但符号连接对象与硬件一同到来或消失。 因为接口名最终指向PDO,所以PDO的安全描述符将最终控制设备的访问权限。这样比较好,因为只有管理员才可以通过控制台控制PDO的安全属性 |
|
11楼#
发布于:2005-03-11 11:10
我的adddevice是标准的编法,
实在查不出adddevice哪里有错:(((((( |
|
12楼#
发布于:2005-03-11 11:03
注册设备接口与注册符号联接是两码子回事
|
|
|
13楼#
发布于:2005-03-11 10:57
可我用softice
status=IoRegisterDeviceInterface(pdo, &WDM_GUID, NULL, &dx->ifSymLinkName); if(NT_ERROR(status)) { // unable to register interface KdPrint((DRIVERNAME \" - IoRegisterDeviceInterface failed - %8.8lX\\n\", status)); ////////////////////////这句softice没跟踪进去说明、 //IoRegisterDeviceInterface,注册是成功的呀 IoDeleteDevice(fdo); return status; } RtlCopyMemory(PBuffer,dx->ifSymLinkName.Buffer,SymLinkNameLen);这是在wmi力的查询符号链接名的。 |
|
14楼#
发布于:2005-03-11 10:43
RtlCopyMemory(PBuffer,dx->ifSymLinkName.Buffer,SymLinkNameLen);
Buffer在这是空的 ! [编辑 - 3/11/05 by KMK] |
|
15楼#
发布于:2005-03-11 10:42
难道和wmi。cpp有关,可是我用户层没用到它的接口函数
和inf文件也该没关吧 真是万事开头难呀:(((((((((( |
|
16楼#
发布于:2005-03-11 10:38
我刚用softice调试过了:
//GUID WDMGUID=WdmGuid; NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { NTSTATUS status; PDEVICE_OBJECT fdo; UNICODE_STRING devname; RtlInitUnicodeString(&devname, L\"\\\\Device\\\\WdmDriver0\"); //IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &devname, ...); status=IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), &devname, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo); if(NT_ERROR(status)) return status; PWDM_DEVICE_EXTENSION dx=(PWDM_DEVICE_EXTENSION )fdo->DeviceExtension; dx->pdo=pdo; dx->fdo=fdo; status=IoRegisterDeviceInterface(pdo, &WDM_GUID, NULL, &dx->ifSymLinkName); if(NT_ERROR(status)) { // unable to register interface KdPrint((DRIVERNAME \" - IoRegisterDeviceInterface failed - %8.8lX\\n\", status)); IoDeleteDevice(fdo); return status; } IoSetDeviceInterfaceState(&dx->ifSymLinkName,true); dx->NextDevice=IoAttachDeviceToDeviceStack(fdo,pdo); fdo->Flags&=~DO_DEVICE_INITIALIZING; fdo->Flags|=DO_BUFFERED_IO; RegisterWmi(fdo); return STATUS_SUCCESS; } softice可以抓到 fdo->Flags&=~DO_DEVICE_INITIALIZING; fdo->Flags|=DO_BUFFERED_IO; 这两个断点,说明符号连接名已注册 就是说status=IoRegisterDeviceInterface(pdo, &WDM_GUID, NULL, &dx->ifSymLinkName);是正确的。 驱动程序很简单,没用到其他的东西呀:(((( |
|
17楼#
发布于:2005-03-11 10:31
[quote] 或者用我上面提的的方法(这种方法通用) 没注意到他用了 IoRegisterDeviceInterface() !! ifSymLinkName is NULL !!?? [编辑 - 3/11/05 by KMK] [/quote] 我下载了他的代码RAR文件 在PnP.cpp中的AddDevice中看他调用了IoRegisterDeviceInterface |
|
|
18楼#
发布于:2005-03-11 10:29
我用了
status=IoRegisterDeviceInterface(pdo, &WDM_GUID, NULL, &dx->ifSymLinkName); 这个函数,已注册symbolic link WDM_GUID也是我用guigen生成的,应该没问题呀:(((((((((((((((((( IoSetDeviceInterfaceState(&dx->ifSymLinkName,true); |
|
19楼#
发布于:2005-03-11 10:07
或者用我上面提的的方法(这种方法通用) 没注意到他用了 IoRegisterDeviceInterface() !! ifSymLinkName is NULL !!?? [编辑 - 3/11/05 by KMK] |
|
上一页
下一页