阅读:2688回复:11
关于scsi miniport 以及相关的device object, device extension 问题
各位老大,
谢过先~~ 我正在研究scsi miniport,目的是实现像daemon tools 那样的虚拟光驱(我知道还有别的方法实现,但本贴先只讨论用scsi miniport的方法,操作系统只考虑2K/XP) 现在我基本明白了概念上如何实现的问题,但是还有一些东西不太明白: 大体实现思路是写一个scsi miniport driver,来虚拟scsi cdrom(或者确切的说是实现一个虚拟scsi adapter??) 问题1: 由于miniport 不符合wdm模型,所以cdrom的device object,是由portdriver 代替miniport 来创建的,但问题是device object的device extension 是如何被创建的我就不知道了, 我在msdn中只是看到通过在miniport的DriverEntry()中设置IwInitialzationData.DeviceExtensionSize()来申请device extension的空间。但是我没有找到在什么地方来在这段空间中写入你自己定义的device extension的内容....... 问题2:在object manager name space 下面看到的那些device,是都是fdo 还是pdo? 还是都有?我用deamon tools 虚拟了一个光驱,然后在object manager name space 中看到了被虚拟的cdrom device object (/Device/CdRom#),但是还看到了一个对应于插在虚拟的scsi adapter上的设备的d(/Device/scsi/st3wolfport#path#Target#Lun#), 后面这个do会不会就是cdrom的pdo?而前面的/device/Cdrom#是fdo?如果是的话pdo 和fdo是如何联系起来的? 我刚接触驱程着一块,问得不专业,说得也有点乱,但还是希望高手指教。。。。 |
|
最新喜欢:TOMG20... |
沙发#
发布于:2004-01-08 08:23
各位老大, 1. 一般SCSI miniport的DriverEntry会有如下流程: 首先定义: HW_INITIALIZATION_DATA hwInitData; 然后初始化: hwInitData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA); hwInitData.HwStartIo = HwStartIo; hwInitializationData.HwFindAdapter = HwFindAdapter; ...... 再调用ScsiPortInitialize status = ScsiPortInitialize( DriverObject, Argument2, &hwInitData, &Context ); 然后在HwFindAdapter例程会传回一个PHW_DEVICE_EXTENSION, 它就是device extension了。 |
|
|
板凳#
发布于:2004-01-08 16:21
[/quote] 1. 一般SCSI miniport的DriverEntry会有如下流程: ………… ………… 然后在HwFindAdapter例程会传回一个PHW_DEVICE_EXTENSION, 它就是device extension了。 [/quote] 多谢指点, 但是还有一点不明: scsi port driver 会用HwFindAdapter传回device extension, 但是port driver 怎么会知道用我定义的device extension 来初始化呢?因为port driver 好像只能在DriverEntry()里面知道device extension 的大小,但具体内容从何而知?(莫非通过HwFindAdapter传回的device extension 只是一段空间,内容是空的?) 谢 |
|
地板#
发布于:2004-01-08 17:47
1. 一般SCSI miniport的DriverEntry会有如下流程: ………… ………… 然后在HwFindAdapter例程会传回一个PHW_DEVICE_EXTENSION, 它就是device extension了。 [/quote] 多谢指点, 但是还有一点不明: scsi port driver 会用HwFindAdapter传回device extension, 但是port driver 怎么会知道用我定义的device extension 来初始化呢?因为port driver 好像只能在DriverEntry()里面知道device extension 的大小,但具体内容从何而知?(莫非通过HwFindAdapter传回的device extension 只是一段空间,内容是空的?) 谢 [/quote] 请看仔细: status = ScsiPortInitialize( DriverObject, Argument2, &hwInitData, &Context ); ScsiPortInitialize 会将你定义的hwInitData (HW_INITIALIZATION_DATA )传回Port Driver。 |
|
|
地下室#
发布于:2004-01-08 18:34
[quote] 请看仔细: status = ScsiPortInitialize( DriverObject, Argument2, &hwInitData, &Context ); ScsiPortInitialize 会将你定义的hwInitData (HW_INITIALIZATION_DATA )传回Port Driver。 [/quote] 多谢指点,但可能因为我说的不清楚,让你误解我的问题了。 不如我换个问法把: 1。在DriverEntry(),呼叫完ScsiPortInitialize()后,port driver 代替miniport 创建了device extension, 然后port driver在呼叫其他miniport 的历程时,把创建的extension 传回miniport 以供使用(说道这都没错把?) 那么,这个port driver 传回的device extension 是不是只是一段大小为HwInitial.DeviceExtensionSize的空间而没有任何内容(内容为0的一段空间)? 2。如果我上面那个问题的回答是肯定的话, 那就是说,我在定义Device Extenison的时候只能定义其结构,而不能定义其内容(例如在device extension 里面定义一些函数,以便在miniport里面呼叫?)? 万望不吝赐教 :D |
|
5楼#
发布于:2004-01-09 08:13
[quote][quote] 请看仔细: status = ScsiPortInitialize( DriverObject, Argument2, &hwInitData, &Context ); ScsiPortInitialize 会将你定义的hwInitData (HW_INITIALIZATION_DATA )传回Port Driver。 [/quote] 多谢指点,但可能因为我说的不清楚,让你误解我的问题了。 不如我换个问法把: 1。在DriverEntry(),呼叫完ScsiPortInitialize()后,port driver 代替miniport 创建了device extension, 然后port driver在呼叫其他miniport 的历程时,把创建的extension 传回miniport 以供使用(说道这都没错把?) 那么,这个port driver 传回的device extension 是不是只是一段大小为HwInitial.DeviceExtensionSize的空间而没有任何内容(内容为0的一段空间)? 2。如果我上面那个问题的回答是肯定的话, 那就是说,我在定义Device Extenison的时候只能定义其结构,而不能定义其内容(例如在device extension 里面定义一些函数,以便在miniport里面呼叫?)? 万望不吝赐教 :D [/quote] 没错,它只是分配了一段空间,你可以自己在HwFindAdapter例程或者HwInitialize中初始化它(例如在device extension 里面定义一些函数,以便在miniport里面呼叫)。 |
|
|
6楼#
发布于:2004-01-12 11:27
系统只是为你分配了这么一段空间,至于具体这段空间如何组织是由你自己定义的。你可以在其中放你所希望保存的信息,包括数据结构和函数指针。
当系统执行ScsiPortInitialize时,他会自动调用你所注册的HwFindAdapter函数,在这个函数中,你可以来填你所希望在device extension中保存的信息。注意!!你还要完成这个函数所规定的一些工作,他会发过来很多HwDeviceExtension,你通过ScsiPortGetBusData找到你的Adapter,然后返回SP_RETURN_FOUND。 |
|
7楼#
发布于:2004-01-15 22:50
多谢以上两位回复 :D :D
|
|
8楼#
发布于:2004-01-15 22:52
顺便问一句,这里是不是也是像csdn一样要给回答问题的人分数?
怎么给? |
|
9楼#
发布于:2004-01-16 08:17
顺便问一句,这里是不是也是像csdn一样要给回答问题的人分数? 在你发的帖子的下方有一排按钮,有一个“给分”按钮 |
|
|
10楼#
发布于:2004-01-27 11:10
我也有类似问题,如果解决,希望能共享你的成功!
|
|
11楼#
发布于:2004-06-28 11:46
各位老大,取得总线信息(ScsiPortGetBusData)后能做什么呢
|
|