阅读:3763回复:25
一个关于虚拟磁盘的问题 --- 我是新人
我接触WDM时间很短,看了一些朋友推荐的比较好的书,比如《Windows WDM设备驱动程序开发指南》等。有一些概念依然不是很清楚。在此提问,希望能够找到答案
出于初步学习的目的我想写个测试程序,用驱动向系统中添加一个分区,当然这个分区不对应于任何实际存在的设备,仅仅作为系统中已经存在的某个分区的一个镜像存在。实际上可以理解为那个实际存在的分区的一个别名。 在User Mode可能也会有实现的办法,不过这个我的目的主要是学习写WDM Driver。所以请不要讲用别的方法也可以实现 下面是我的一些疑惑: 1、整个系统对于分区是如何管理的? 也就是说,与分区相关的一些驱动程序的层次结构是怎么样的?我用SoftICE找到一个叫做FtDisk的Driver,似乎由它来管理分区设备(Device Object)。我想这应该只是一部分吧,全貌是什么样子的呢? 2、这个问题比较弱。我如何知道我的驱动处在Layer的哪一层? 书上说整个WDM的模型就是分层的,但我不知道我如果写了一个Driver,它到底会处于哪一层? 3、我的想法是否合理? 我最初的想法是这样的:创建一个FILE_DEVICE_DISK类型的设备;用IoGetDeviceObjectPointer取得某个分区对象的DeviceObject;在我的IRP处理例程里面将自己得到的IRP做一些修改然后再调IoCallDriver让我想镜像的那个分区的Driver去处理;最后将结果传回I/O管理器(这一步应该不由我手动完成的) 由于我对第二个问题没有搞清楚,所以我觉得第三个想法很有可能是大错特错。我这个人很笨,但是由于工作需要又不得不写Driver,虽然这些问题都很弱智或者根本就是胡说,但还是很希望能够在这里得到大家的帮助。谢谢! [编辑 - 10/23/02 by JungleBoy] |
|
|
沙发#
发布于:2002-10-23 11:14
你的想法大合理的。同时我认为,这个驱动应该放在Volume Driver 的上层。好象本站的FileDisk讲的就是这方面的技术。
|
|
|
板凳#
发布于:2002-10-23 11:20
我看了filedisk的源码,我并不能够从代码中看出来它的Driver处于哪一层
版主能够比较详细的回答一下我的第一个问题吗? 我现在处于一种混沌状态,知道一点,不知道全部。这样很痛苦 就讲讲跟分区管理相关就行了 ThanX |
|
|
地板#
发布于:2002-10-23 11:38
刚才看了一下DDK中的Storage Driver部分
我觉得想要实现这个功能我得写一个upper filter storage driver ,对吗?这个Driver位于Storage Class Driver之上(再往下就不是处理IRP了,而是处理一个叫做SRB的东西) 这个思路是否正确? |
|
|
地下室#
发布于:2002-10-23 12:00
Yes, I think so too, 我没有直接写过磁盘分区方面的过滤驱动,因此没有去深入研究过。在写文件系统过滤驱动的过程中,我对此有些了解,所以,我只是提供一点参考。 Sorry.
|
|
|
5楼#
发布于:2002-10-23 12:11
我试试
有进展之后会贴上来继续讨论 如果还有别的看法也请发出来看看。 |
|
|
6楼#
发布于:2002-10-23 12:52
大家都是新人啊,推荐一本书:
Inside Windows 2000 3rd.chm. 里面对分区和volume的管理有些讲解,没有细看。先替你贴个图吧。 |
|
7楼#
发布于:2002-10-23 13:02
谢谢yymrhxf
我去找来看看 //图好大,呵呵…… |
|
|
8楼#
发布于:2002-10-25 15:03
看了几天的书,有一些模糊的进展。下面请教问题:
1、作为一个磁盘应该会响应IOCTL_DISK_CHECK_VERIFY、IOCTL_DISK_GET_DRIVE_GEOMETRY等IRP_MJ_DEVICE_CONTROL。(我看了DDK的例子和PGPdisk的源码,他们都处理了这些Device Control IRP)。目前我想在我的处理函数里面Build一个IRP然后送给某实际分区的DeviceObject,这样是不是就能够实现对该分区的镜像?? 2、如果上述假设成立的话。应该怎么做?我的想法是这样的(仅以处理DeviceControl IRP为例,别的IRP处理过程应该类似): 使用IoBuildDeviceIoControlRequest创建对应的IRP并且将它送给实际的分区去处理。但是DDK里面对此函数的讲解令我觉得很搞不懂,它说An intermediate or highest-level driver can call IoBuildDeviceIoControlRequest to set up IRPs for requests sent to lower-level drivers. 也就是说如果我这样做的话,我的Driver就是位于那个实际磁盘的上层的一个驱动了。我想象中应该是与那个Driver平行的,就好像我在处理现有文件的时候打开另外一个文件,读取那边文件的内容一样;而DDK中所有的IRP处理链好像都是分层的,有没有平行的呢? 实际上还是我最初提到的对于驱动层次模型不清楚的问题。 天资愚笨,一直没能领会驱动编程关键的部分。希望先行者指点迷津,不胜感谢! |
|
|
9楼#
发布于:2002-10-25 16:30
你的Driver就是位于那个实际磁盘的上层的一个驱动了,有点像过滤
程序。所谓虚拟就是你来模拟实际操作了,因为你的程序在实际磁盘的上层所以你不需要用srb。你所作的工作就是接到i/o control code用zwXXXXX系列函数就可以完成读写等磁盘操作了。 |
|
|
10楼#
发布于:2002-10-29 13:57
何谓“实际磁盘”?
在驱动的分层模型中实际磁盘对应于什么? |
|
|
11楼#
发布于:2002-10-29 17:02
“实际磁盘”就是系统提供的磁盘驱动程序。
|
|
|
12楼#
发布于:2002-10-30 08:32
何谓“实际磁盘”? 你的这个驱动就是一个磁盘驱动,不过是虚拟的磁盘驱动,其中实际调用到这个虚拟盘镜像文件所在磁盘的文件系统驱动和磁盘驱动。这个是我的理解。呵呵 |
|
13楼#
发布于:2002-10-30 10:15
引用:
-----------------------------------------------------------你的这个驱动就是一个磁盘驱动,不过是虚拟的磁盘驱动,其中实际调用到这个虚拟盘镜像文件所在磁盘的文件系统驱动和磁盘驱动。这个是我的理解。呵呵 ------------------------------------------------------------ 你这和我的意思不是一样吗? |
|
|
14楼#
发布于:2002-10-30 10:22
那么我是应该虚拟一个disk还是虚拟一个Volume呢?
我想应该是Volume吧? 有什么区别吗? |
|
|
15楼#
发布于:2002-10-31 09:36
谢谢大家在前面的一些提示
我现在在尝试着写一个例子。我创建了一个DEVICE_TYPE 为FILE_DEVICE_DISK、DeviceCharacteristics为FILE_VIRTUAL_VOLUME的设备,其Win32 Symbolic Link名为“\\??\\i:” 在我的IRP_MJ_DEVICE_CONTROL处理函数中我处理了如下几个IOCTL: IOCTL_DISK_GET_PARTITION_INFO IOCTL_DISK_GET_DRIVE_GEOMETRY IOCTL_DISK_CHECK_VERIFY 现在一打开“我的电脑”,explorer就会崩溃。我在SoftICE里面看我的调试信息似乎是我少处理了一个IOCTL,它的值为0x4d0008,我很想知道它对应的是哪个IOCTL,这样我才可以到DDK里面去查如何处理它 请赐教 |
|
|
16楼#
发布于:2002-10-31 17:13
谢谢大家在前面的一些提示 自己写有些困难了,建议看看 filedisk 代码,千多行 |
|
17楼#
发布于:2002-10-31 19:23
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
|
|
|
18楼#
发布于:2002-11-01 09:03
谢谢lu0,不过后来发现似乎不用响应这个IOCTL
现在我只响应了四个IOCTL,其余的统统返回STATUS_INVALID_DEVICE_REQUEST,也不出错了 |
|
|
19楼#
发布于:2002-11-01 09:40
呵呵!你的这个驱动好象还会有问题吧!正确的方式应该让系统的文件驱动程序来识别出你的这个虚拟出来的分区
|
|
上一页
下一页