阅读:3765回复: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] |
|
|
沙发#
发布于:2004-04-13 17:37
好,顶
|
|
|
板凳#
发布于:2004-04-13 15:54
好帖子
|
|
|
地板#
发布于:2002-11-01 15:23
回复似乎比较慢,我找到上一个问题的答案了。连续发了三条,不是有意灌水的,请见谅
把答案贴出来大家共享: A theory - The call to ZwReadFile is probably only valid in the context in which you originally opened the file. If another driver (like a file system driver, for example) calls your driver\'s read handler from a different thread context (such as would happen often if the call to your driver were done in a DPC, worker thread, or work item callback), you could see this. There\'s two approaches you could use to test and then possibly work around this issue if it indeed turns out to be what\'s happening: 1. Put all of the Zw I/O calls into functions called by a worker thread. When a request comes in, signal the thread and have the thread handle the actual I/O. 2. A very different approach - Have a user app or service do the actual I/O and get rid of the Zw calls altogether. You could have the app/service queue up several DeviceIoControl IRPs to \'Listen\' for requests, and fill them in and complete them where you\'re currently doing the ZwReadFile. The User app could then fetch the appropriate data and call back into the driver. Likely not the fastest/highest performance approach, but very very flexible and gets a lot of code out of your driver. You can use this method to handle any user interface you need, as well. //这个贴子似乎已经可以封起来了,准备给分 |
|
|
地下室#
发布于:2002-11-01 15:10
我在google的讨论组里面查了:
status = 0xc0000024代表STATUS_OBJECT_TYPE_MISMATCH 但是为什么会这样呢?下面是我调用ZwReadFile的context: 我在DriverEntry里面调用ZwOpenFile打开我想读取的文件,打开成功(这里的确是成功了,我看到的)后把文件句柄放在DeviceExtension里面 当我的Driver响应IRP_MJ_READ的时候取出此句柄并用它调用ZwReadFile,然后就出错了。 大家看看是怎么回事? |
|
|
5楼#
发布于:2002-11-01 15:00
调用ZwReadFile,失败
返回status = 0xc0000024 这是什么意思?谢谢! |
|
|
6楼#
发布于:2002-11-01 09:47
guardee说得很对
我费了好大的劲终于搞明白windows的分区管理模型如下: FileSystemDriver (top) VolumeDriver DiskDriver (bottom) 而我的虚拟磁盘的就是没有底下的那个DiskDriver,自己来完成最终的数据读写工作 现在我只是新加入了一个分区到系统里面,在响应IRP_MJ_READ和IRP_MJ_WRITE的时候我都返回失败 下一步我就是要完成这两个proc,我觉得分区格式的识别应该是通过READ完成的吧? |
|
|
7楼#
发布于:2002-11-01 09:40
呵呵!你的这个驱动好象还会有问题吧!正确的方式应该让系统的文件驱动程序来识别出你的这个虚拟出来的分区
|
|
8楼#
发布于:2002-11-01 09:03
谢谢lu0,不过后来发现似乎不用响应这个IOCTL
现在我只响应了四个IOCTL,其余的统统返回STATUS_INVALID_DEVICE_REQUEST,也不出错了 |
|
|
9楼#
发布于:2002-10-31 19:23
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
|
|
|
10楼#
发布于:2002-10-31 17:13
谢谢大家在前面的一些提示 自己写有些困难了,建议看看 filedisk 代码,千多行 |
|
11楼#
发布于: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里面去查如何处理它 请赐教 |
|
|
12楼#
发布于:2002-10-30 10:22
那么我是应该虚拟一个disk还是虚拟一个Volume呢?
我想应该是Volume吧? 有什么区别吗? |
|
|
13楼#
发布于:2002-10-30 10:15
引用:
-----------------------------------------------------------你的这个驱动就是一个磁盘驱动,不过是虚拟的磁盘驱动,其中实际调用到这个虚拟盘镜像文件所在磁盘的文件系统驱动和磁盘驱动。这个是我的理解。呵呵 ------------------------------------------------------------ 你这和我的意思不是一样吗? |
|
|
14楼#
发布于:2002-10-30 08:32
何谓“实际磁盘”? 你的这个驱动就是一个磁盘驱动,不过是虚拟的磁盘驱动,其中实际调用到这个虚拟盘镜像文件所在磁盘的文件系统驱动和磁盘驱动。这个是我的理解。呵呵 |
|
15楼#
发布于:2002-10-29 17:02
“实际磁盘”就是系统提供的磁盘驱动程序。
|
|
|
16楼#
发布于:2002-10-29 13:57
何谓“实际磁盘”?
在驱动的分层模型中实际磁盘对应于什么? |
|
|
17楼#
发布于:2002-10-25 16:30
你的Driver就是位于那个实际磁盘的上层的一个驱动了,有点像过滤
程序。所谓虚拟就是你来模拟实际操作了,因为你的程序在实际磁盘的上层所以你不需要用srb。你所作的工作就是接到i/o control code用zwXXXXX系列函数就可以完成读写等磁盘操作了。 |
|
|
18楼#
发布于: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处理链好像都是分层的,有没有平行的呢? 实际上还是我最初提到的对于驱动层次模型不清楚的问题。 天资愚笨,一直没能领会驱动编程关键的部分。希望先行者指点迷津,不胜感谢! |
|
|
19楼#
发布于:2002-10-23 13:02
谢谢yymrhxf
我去找来看看 //图好大,呵呵…… |
|
|
上一页
下一页