最近看了一下一个叫做filedisk的开源程序的代码 了解了关于磁盘设备驱动的一些东西
总结一下
filedisk的功能就是可以把磁盘上的某个文件映射成一个磁盘驱动器
像一般的磁盘卷一样来使用
关于filedisk的原理简单来说就是利用驱动程序创建一个磁盘设备(IoCreateDevice)
然后在用户态程序中用DefineDosDevice将这个设备挂载到某个盘符下面
也就是把所有到这个盘符的操作都导向使用内核驱动创建的这个虚拟的磁盘设备
在内核驱动里面就处理所有的IRP_MJ_WRITE和IRP_MJ_READ请求就可以了
至于怎么样来处理这两个读写请求就可以衍生出很多东西
比如在进行读写处理时对数据进行加密的话 就变成了一个透明加密的东西
比如TrueCrypt好像就是这么做的
如果把写操作复制几份分别发到其他设备 那么就变成了 镜像
filedisk里面是把读写操作完全的导向某个磁盘文件 这样一来就是把文件虚拟成磁盘了
其实这个办法以前也做过 但是总是不行 看了filedisk的源码以后才知道 除了处理读写操作之外
还需要处理很多DeviceIoControl的请求
作为一个磁盘驱动在filedisk里面处理了以下的一些请求
直接返回STATUS_INVALID_DEVICE_REQUEST的IO请求有
IOCTL_DISK_CHECK_VERIFY
IOCTL_CDROM_CHECK_VERIFY
IOCTL_STORAGE_CHECK_VERIFY
IOCTL_STORAGE_CHECK_VERIFY2
IOCTL_DISK_MEDIA_REMOVAL
IOCTL_STORAGE_MEDIA_REMOVAL
IOCTL_CDROM_READ_TOC
IOCTL_DISK_SET_PARTITION_INFO
需要专门进行处理的IO请求
IOCTL_DISK_GET_DRIVE_GEOMETRY
IOCTL_DISK_GET_LENGTH_INFO
IOCTL_DISK_GET_PARTITION_INFO
IOCTL_DISK_VERIFY
IOCTL_DISK_GET_PARTITION_INFO_EX
IOCTL_DISK_IS_WRITABLE
对需需要进行处理的IO请求 按照ddk的文档说明来处理就是
比如IOCTL_DISK_GET_DRIVE_GEOMETRY就是获得该物理设备的一些信息
IOCTL_DISK_GET_PARTITION_INFO是获得该磁盘上的分区表信息等
以前做的时候就是没有处理这些 导致失败...囧
虽然现在看了filedisk 才知道需要处理这些请求
但是还是不知道 哪里有资料讲磁盘驱动 卷驱动需要处理哪些特定的IO控制请求
以上 就是filedisk的内容 做了这些 基本就能写出一个 完整的虚拟磁盘设备了
还有需要注意的地方就是在处理读写请求时 需要创建一个系统线程
分发例程中接收到的读写Irp包都插入一个队列中 在创建的系统线程中来处理
这应该是 一种标准的做法 用来避免在分发例程中由于等待而死锁的问题
嗯 然后下来就是准备尝试把这个和过滤驱动结合起来了...
嗯 又可以由此衍生出很多应用