阅读:1862回复:8
(u盘)总线驱动中的PnP(续)
现象:
========================== ?插入u盘后,枚举成功; ?在BusRelations的IRP_MN_QUERY_DEVICE_RELATIONS中,创建(只在第一次创建)并返回U盘PDO; 。。。。。。 ?系统了解到总线结构,开始针对以上创建的PDO进行一系列pnp,并开始安装上层的disk.sys,这时我的u盘程序接收到第一个IRP_MJ_SCSI,其功能为SRB_FUNCTION_CLAIM_DEVICE,正确处理并返回后, ?系统发出一个不明Io control,code = 2d1400。接着就发出IRP_MN_QUERY_DEVICE_RELATIONS,最后IRP_MN_REMOVE_DEVICE灭掉我的PDO。Game Over。 ============================ 不知道是什么IRP的处理出了问题? 另外,系统针对PDO已经发出的IRP_MJ_PNP有: IRP_MN_QUERY_CAPA­BILITIES //随便填充一些信息返回成功; IRP_MN_QUERY_ID // 正确处理并成功返回; IRP_MN_QUERY_DEVICE_ TEXT // 正确处理并成功返回; IRP_MN_QUERY_BUS_INFORMATION // 未作任何处理返回(即保持原状返回); IRP_MN_QUERY_RESOURCES // 未作任何处理返回,或者成功返回; IRP_MN_QUERY_RESOURCE_ REQUIREMENTS // 未作任何处理返回, 或者成功返回; IRP_MN_START_DEVICE // 成功返回; IRP_MN_QUERY_DEVICE_ RELATIONS // 是BusRelations则填充pdo地址,并成功返回; IRP_MN_REMOVE_DEVICE //成功返回。 请大侠帮忙分析一下,我的哪个IRP处理出了错误?其中,IRP_MN_QUERY_RESOURCES和IRP_MN_QUERY_RESOURCE_ REQUIREMENTS发出了两次,我曾经尝试不作任何处理,或成功返回,都还是如此。 谢谢 [编辑 - 3/18/03 by daor] |
|
沙发#
发布于:2003-03-18 21:20
现象: 这两个消息我也没有处理, 我估计问题可能还在IOCTL的地方, IOCTL_STORAGE_GET_DEVICE_NUMBER IOCTL_STORAGE_QUERY_PROPERTY 这两个好像比较重要,不知你处理过了吗? |
|
板凳#
发布于:2003-03-20 13:04
多谢老兄指点
我的驱动类型是FILE_DEVICE_MASS_STORAGE(我反汇编USBSTOR.SYS 看出来,它也是用这个类型),应该收不到你所说的这两个io control irp。 我现在暂时把前面工作放下了,先写个usbstor.sys的上层过滤,对系统内部的东西做一个全面的监视。 也许可以看出一点东西来。 |
|
地板#
发布于:2003-03-20 23:22
多谢老兄指点 你可以用DevView来观察usbstor的层次架构,可以看到它用的是什么类型,我自己用的是FILE_DEVICE_DISK类型,基本已经完成。 另外,如果你的上层过滤写好,能否给我一份,懒得自己动手了 :D |
|
地下室#
发布于:2003-03-21 09:05
你可以用DevView来观察usbstor的层次架构,可以看到它用的是什么类型,我自己用的是FILE_DEVICE_DISK类型,基本已经完成。 你说的DevView是什么工具?我怎么没有?以前我听人家说这个东东,还以为是windows的设备管理器 :D我信箱是suriyu@163.com,给我寄一个吧,谢谢! 上层过滤已经安装完成,并且已经能输出Scsi指令的内容。当然读写数据、sensedata等各种信息的显示还没做,做完了可以给你。显示终端是DS的调试输出工具Monitor。 以后我可能想自己做Monitor,但是我在考虑怎样显示输出数据,才能最大限度地不影响驱动程序的效率。不知兄弟有何高见? :cool: |
|
5楼#
发布于:2003-03-21 09:28
[quote] 你可以用DevView来观察usbstor的层次架构,可以看到它用的是什么类型,我自己用的是FILE_DEVICE_DISK类型,基本已经完成。 你说的DevView是什么工具?我怎么没有?以前我听人家说这个东东,还以为是windows的设备管理器 :D我信箱是suriyu@163.com,给我寄一个吧,谢谢! 上层过滤已经安装完成,并且已经能输出Scsi指令的内容。当然读写数据、sensedata等各种信息的显示还没做,做完了可以给你。显示终端是DS的调试输出工具Monitor。 以后我可能想自己做Monitor,但是我在考虑怎样显示输出数据,才能最大限度地不影响驱动程序的效率。不知兄弟有何高见? :cool: [/quote] mail已经发出,DS的Monitor不如Sysinternals的DebugViewer好使,程序不用改,换个工具而已。 要不影响效率可难说,你根据不同的debug level输出不同的数据吧,另外数据尽量在内存中组织好再一次性用DbgPrint输出…… [编辑 - 3/21/03 by bag] |
|
6楼#
发布于:2003-03-25 12:00
谢谢你提供的东东!非常有用!
我大概看了一下sniffUSB,发现它驱动UsbSnoop.sys的写法跟我的大体一样,都是参考了oney的书 :D 我倒对它的安装手法很感兴趣,它在安装UsbSnoop.sys时,用了一个很变态的手段----不是把UsbSnoop.sys从一个地方拷贝到系统目录,而是在系统目录那里建立一个UsbSnoop.sys新文件,然后直接往里面灌bin数据流 实在是太变态了 :mad: :mad: :D [编辑 - 3/25/03 by daor] |
|
7楼#
发布于:2003-03-25 12:05
主要是我想做成可以在各个层次安装的过滤。
我现在已经能在SCSI上层和Bulk下层过滤了。 我发现过滤驱动的写法基本上都是固定的,只是对数据流进行 翻译显示时,很耗体力 |
|
8楼#
发布于:2003-03-28 09:10
收盘
过滤已经发出 |
|