利用windows内核驱动创建虚拟磁盘设备

最近看了一下一个叫做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包都插入一个队列中 在创建的系统线程中来处理

这应该是 一种标准的做法 用来避免在分发例程中由于等待而死锁的问题

嗯 然后下来就是准备尝试把这个和过滤驱动结合起来了...

嗯 又可以由此衍生出很多应用

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
转自看雪的CCDeath 【文章标题】: WinMount虚拟磁盘深入研究(-)之filedisk源代码详细分析 【下载地址】: 自己搜索下载 【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! -------------------------------------------------------------------------------- 【详细过程】 我的驱动入门三终结版,还再学习中。由于个人也有些事情要处理,研究起刘涛涛WinMount的虚拟 磁盘,而且这方面的书籍,貌似乎没见过,只有傻傻的几K代码存在,没注释什么的,整体框架也没说。 虚拟光驱用实现文件来模拟磁盘的原理,是文件系统驱动程序。 把filedisk驱动安装,查看install.txt文件。 1.Copy the driver (filedisk.sys) to %systemroot%\system32\drivers\. 2.Import filedisk.reg to the Registry. 3.Reboot. 4.Use the program filedisk.exe to mount/umount files, for an example of use see the file example.txt. 可以不用重起机子的方法,找一个动载加载驱动工具:DriverMonitor不错了。然后在“开始菜单”-> "运行"输入 "net start filedisk" 出现:“ 请求的服务已经启动”。这个必须得成功才行哦。 接下来注意点。cmd后 出现这个目录 C:\Documents and Settings \Administrator>,在接下来敲入 filedisk /mount 0 c:\temp\filedisk.img 8M f: C:\Documents and Settings \Administrator>filedisk /mount 0 c:\temp\filedisk.img 8M r: 回车一下。 出现"FileDisk:系统找不到指定路径" 。原因就出在这 "c:\temp\filedisk.img" 中的C:\temp要这个目录才行。至于 filedisk.img不是必须,会自动创建。 如果有出现"FileDisk:函数不正确" 中的“filedisk /mount 0 ”中"0"代号已经被使用。可以改为"1". 查看一下,结果就出现一个还未格式化 8M R磁盘,查看C:\temp下生成一个filedisk.img也8M。想卸载 掉"filedisk /umount r:". 还可以创建很大的虚拟磁盘,你把"8M"改换其他的就是了。 以上如果都没出现结果,基本上就没兴趣继续研究下去了,我看到了很多人初学filedisk都遇到以上这 些问题(包括我在内) ,把我折腾了半天。 先来分析驱动层代码,后来分析应用层代码。更详细的请看附件里的源代码。我对代码工程方式重新布 局,用起来更方便。 ===================================//先来分析驱动层代码 1.对filedisk.h进行分析 #define FILE_DEVICE_FILE_DISK 0x8000//用户定义范围0x8000~ #define IOCTL_FILE_DISK_OPEN_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_FILE_DISK_CLOSE_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_FILE_DISK_QUERY_FILE CTL_CODE(FILE_DEVICE_FILE_DISK, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS) typedef struct _OPEN_FILE_INFORMATION { LARGE_INTEGER FileSize;//文件大小 BOOLEAN ReadOnly;//只读属性 USHORT Fil
Windows内核驱动虚拟化技术是指在Windows操作系统内核层面实现的一种虚拟化技术,用于创建和管理虚拟设备驱动程序。 在Windows操作系统中,设备驱动程序是用于与硬件设备进行通信和控制的软件模块。传统上,每个设备需要对应一个物理设备驱动程序来进行管理。但是,随着虚拟化技术的发展,我们可以在一台物理计算机上运行多个虚拟机,每个虚拟机都有自己的操作系统和设备驱动程序。 Windows内核驱动虚拟化技术允许在宿主操作系统内核创建虚拟设备驱动程序,并将其公开给虚拟机。这些虚拟设备驱动程序可以模拟各种硬件设备,如网络适配器、磁盘控制器等。虚拟机可以将这些虚拟设备驱动程序视为真实设备,并与其进行通信,而不需要直接访问物理硬件。 通过使用Windows内核驱动虚拟化技术,可以实现以下优势: 1. 硬件资源共享:多个虚拟机可以共享宿主计算机上的物理硬件资源,提高资源利用率。 2. 灵活性和可移植性:虚拟设备驱动程序可以在不同的虚拟机环境中运行,使应用程序更易于迁移和部署。 3. 隔离性和安全性:虚拟机之间相互隔离,一个虚拟机中的故障或恶意行为不会影响其他虚拟机和宿主系统的稳定性和安全性。 常见的Windows内核驱动虚拟化技术包括Microsoft Hyper-V、VMware Workstation、VirtualBox等。它们提供了管理和控制虚拟设备驱动程序的功能,并使虚拟化环境更加灵活和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值