FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2688回复:11

关于scsi miniport 以及相关的device object, device extension 问题

楼主#
更多 发布于:2004-01-07 20:33
各位老大,
谢过先~~
我正在研究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是如何联系起来的?

我刚接触驱程着一块,问得不专业,说得也有点乱,但还是希望高手指教。。。。



最新喜欢:

TOMG2004TOMG20...
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2004-01-08 08:23
各位老大,
谢过先~~
我正在研究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是如何联系起来的?

我刚接触驱程着一块,问得不专业,说得也有点乱,但还是希望高手指教。。。。

 


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了。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 只是一段空间,内容是空的?)

seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
地板#
发布于: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。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
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里面呼叫)。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
维雷利
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分-70分
  • 威望100点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-01-12 11:27
系统只是为你分配了这么一段空间,至于具体这段空间如何组织是由你自己定义的。你可以在其中放你所希望保存的信息,包括数据结构和函数指针。

当系统执行ScsiPortInitialize时,他会自动调用你所注册的HwFindAdapter函数,在这个函数中,你可以来填你所希望在device extension中保存的信息。注意!!你还要完成这个函数所规定的一些工作,他会发过来很多HwDeviceExtension,你通过ScsiPortGetBusData找到你的Adapter,然后返回SP_RETURN_FOUND。
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-01-15 22:50
多谢以上两位回复 :D :D
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-01-15 22:52
顺便问一句,这里是不是也是像csdn一样要给回答问题的人分数?
怎么给?
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
9楼#
发布于:2004-01-16 08:17
顺便问一句,这里是不是也是像csdn一样要给回答问题的人分数?
怎么给?


在你发的帖子的下方有一排按钮,有一个“给分”按钮
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
machli
驱动牛犊
驱动牛犊
  • 注册日期2003-07-06
  • 最后登录2004-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-01-27 11:10
我也有类似问题,如果解决,希望能共享你的成功!

    
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-06-28 11:46
各位老大,取得总线信息(ScsiPortGetBusData)后能做什么呢
游客

返回顶部