阅读:1677回复:11
请教千古难题――IRP的迷途
系统无法发送IRP到指定的函数。它导致了进不了CReate()。
诸位强者能否将其干掉?一等奖 30MIN 二等奖 10MIN |
|
最新喜欢:dregs |
沙发#
发布于:2003-11-11 22:55
你得问题能否具体点。好像也是个千古难题
|
|
板凳#
发布于:2003-11-12 09:31
这种说法不确切,应该是把 IRP 发到某个对象中去,比如设备对象。
不成功的原因,你仔细检查一下, IO_STACK_LOCATION.DeviceObject ; 有时还需要填写 IO_STACK_LOCATION.FileObject 的值。 |
|
|
地板#
发布于:2003-11-12 10:10
多谢指教。我编写的是一个NT下的串口遗留驱动,非即插即用的。在NT下运行OK,但到了2000下就不行了,用SOFTICE调试,只能进入到DRIVERENTRY,往下就什么也干不了了,进入不到ADDdevice以及Create等,这是因为IOmanager未发送IRP还是我得设计使得驱动程序接受不到IRP呢?
看CHRISCANT的windowsWDM设备驱动程序开发指南,说只要将NT下的驱动拷到winnts\'y\'s\'te\'mdrivers下,并启动他,就OK了,可是我这样做了后,注册表改了,有我得驱动名字,设备管理器里的非即插即用设备里也有驱动名字,可是在和应用程序交流时,一直说无法找到设备。 我还是一个菜鸟。希望大家帮帮我啊。 我编写的是一个读卡器驱动。 |
|
地下室#
发布于:2003-11-12 14:46
你的问题可以归结为:
有一个nt4下的读卡器驱动,并且nt下可以正常工作。 现在的问题是,如何把它移植到2000下,使它能够在2k下操纵你的读卡器? am i right?? 可以理解成为一个驱动移植的问题吗?? :D :D :D |
|
|
5楼#
发布于:2003-11-13 12:44
第一,请确认你是否在DriverEntry里初始化了AddDevice的入口,如果初始化了,那么你需要做以下的事情:nt加载driver是通过调用DriverEntry来完成的,2k采用了PNP架构,因此驱动真正的加载是通过调用AddDevice来完成的(调用DriverEntry只是说明你的driver的映象被载入),PNP的加载过程离不开扫描注册表中的Enum树,因此要让系统调用你的AddDevice接口你必须在Enum树中添加相应的键,由于你的设备非即插即用,因此你要把键放在HKLM\\SYSTEM\\CurrentControlSet\\Enum\\Root下面,里面要添加设备id键和实例id子键,具体你可以参考Root下面的其它键,其实这个过程不应该手工添加,你应该为你的driver写一个inf,然后通过添加设备面板来安装,这里的内容就不说了.
|
|
6楼#
发布于:2003-11-13 13:06
犯了个错误,Enum键下的东西你不好直接改,他对LocalSystem有所有权限,一般的用户没有,只有写inf文件或者使用SetupDiSetDeviceRegistryProperty(setup api,见msdn)
|
|
7楼#
发布于:2003-11-13 14:05
谢谢高手,我实施先。
|
|
8楼#
发布于:2003-11-13 14:23
注册表的修改。我是通过光盘上提供的一个工具进行的,对照您所说的,都已经改好了,不是手动改的。不过你说的设备ID和实例ID,我不太清楚,不知道写了没有.
您知道怎样将NT下的驱动移植到2000上吗??? 给分30。 帮帮菜鸡把 :( [编辑 - 11/13/03 by xiaorain] |
|
9楼#
发布于:2003-11-13 19:08
你问的问题有些有些宽泛,将nt的driver如何移植2k要具体问题具体分析,一般来说需要你的driver处理pnp请求,ddk中有一些例子,你可以参考参考
|
|
10楼#
发布于:2003-11-13 20:16
不好意思,我编的一个读卡器驱动,此读卡器是串口的,非即插即用设备,在nt下没问题。将nt下的驱动移植到2000后(没有任何修改源代码),安装后,找不到读卡器。你说要编写即插即用部分,可此设备根本就不支持PNP,不太明白为什么也要编写PNP?这是2000的要求把。
在2000下和nt下,同样的设备,为何驱动的要求和安装都不一样?? 这就是微软的控制力体现吗? 觉着您超强,真想多赐教。 我的MSN是xiaorain1◎hotmail.com 谢谢您的帮助。给分了。 ;) |
|
11楼#
发布于:2004-03-25 18:25
第一,请确认你是否在DriverEntry里初始化了AddDevice的入口,如果初始化了,那么你需要做以下的事情:nt加载driver是通过调用DriverEntry来完成的,2k采用了PNP架构,因此驱动真正的加载是通过调用AddDevice来完成的(调用DriverEntry只是说明你的driver的映象被载入),PNP的加载过程离不开扫描注册表中的Enum树,因此要让系统调用你的AddDevice接口你必须在Enum树中添加相应的键,由于你的设备非即插即用,因此你要把键放在HKLM\SYSTEM\CurrentControlSet\Enum\Root下面,里面要添加设备id键和实例id子键,具体你可以参考Root下面的其它键,其实这个过程不应该手工添加,你应该为你的driver写一个inf,然后通过添加设备面板来安装,这里的内容就不说了. 你好:-) 我的情况和你所说的很类似。 按你所说,通过inf文件安装驱动。 我的设备属于读卡器 在我的注册表里,可以看到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\SMARTCARDREADER 请问这种形式是对的吗? 还是应该legacy_***的? 现在我可以收到irp_mj_pnp,对于我的这种root 枚举的设备,应该怎样处理此irp? |
|
|