虚拟磁盘的设计与操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
虚拟磁盘的设计与操作
——李季季
摘要:
通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD)已经实现了在硬盘上创建和管理文件,本系统主要实现将一个文件虚拟成一个相应的磁盘,在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟技术得到了很多应用,例如虚拟光驱就是其中之一,我们将对磁盘进行相关的操作。
关键字:
函数加载模块读写操作卸载模块格式化
一.整体功能概述:
1.通过命令行输入/mount的加载相应虚拟磁盘的命令,执行完毕后便可以在“我的电脑”中看
到又多出了与命令行输入相应的盘符,通过format将磁盘格式化或通过右键选择格式化成相应格式后,便可以对它操作。
2.通过命令行输入/mount的加载相应虚拟磁盘的命令,执行完后便可以在“我的电脑”中看到
又多出了一个虚拟的磁盘,便可以对它执行读写操作。
3.在命令行下输入/umount的卸载相应虚拟磁盘的命令,执行完后便可以卸载除刚才加载的虚拟
磁盘。
二.设计的描述:
通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD)已经实现了在硬盘上创建和管理文件,本系统主要实现将一个文件虚拟成一个相应的磁盘,在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟技术得到了很多应用,例如虚拟光驱就是其中之一。虚拟磁盘文件系统经过安装可以模拟真实的硬盘,支持各种文件系统功能。三.基本的数据结构
(1)全局变量dir_handle
HANDLE dir_handle;
该全局变量用于指向一个“目录对象”,存放本驱动程序创建的所有的磁盘对象。
(2)模拟磁盘文件信息结构 OPEN_FILE_INFORMATION
typedef struct _OPEN_FILE_INFORMATION{
DEVICE_TYPE DeviceType;//所模拟的磁盘的类型
BOOLEAN ReadOnly;//是否设置虚拟磁盘为只读
LARGE_INTEGER FileSize;//本文件的大小
USHORT FileNameLength;//文件名的长度
UCHAR FileName[1];//文件名字符串
}OPEN_FILE_INFORMATION;
该结构保存了用于虚拟磁盘的文件的详细信息。在应用程序利用mount命令制定这个文件时,会将文件的信息组成这样一个结构后作为参数传入内核。驱动程序会抽取这些信息,并把它们作为虚拟磁盘的磁盘信息,例如磁盘的大小好只读属性。
(3)设备扩展结构 DEVICE_EXTENSION:
自定义的磁盘信息结构,用来保存设备的细节以及对设备的编程方式。
Typedef struct _DEVICE_EXTESION
{
BOOLEAN media_in_device;
HANDLE file_handle;//文件句柄
ANSI_STRING file_name;//文件名
LARGE_INTEGER file_size;//文件的大小
BOOLEAN read_only;//只读属性
PSECURITY_CLIENT_CONTEXT security_client_context;
LIST_ENTRY list_head;
KSPIN_LOCK list_lock;
KEVENT request_event;
PVOID thread_pointer;
BOOLEAN terminate_thread;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;
本驱动程序所创建的虚拟对象均为自己维护这样一个数据结构。实际上,所有内核驱动程序中的设备对象都维护这样一个数据结构。其主要作用就是在此保存对应设备的一些参数,使得所有有关此设备的处理都可以通过设备对象访问到这些信息。
相关函数介绍
(1)入口函数 DirverEntry
DirverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegisterPath
)
该函数主要实现建立相应个数的磁盘对象和向I/O管理器注册4个分发例程以处理来自应用程序的相应请求。
(2)分发例程 FileDiskCreateClose
FileDiskCreateClose(
IN PDEVICE_OBJECT DriverObject,
IN PIRP Irp
)
在这个函数中相应打开文件和关闭文件对象的请求,对应主功能代码IRP_MJ_CREATE和IPR_MJ_CLOSE。在函数中就是简单的返回打开成功的标记,不需要完成额外的工作。
(3)分发例程FileDiskReadWrite
FileDiskReadWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
这个函数完成对虚拟磁盘的读写,对应于主功能代码IRP_MJ_WRITE和IRP_MJ_READ。
在进行读写之前先确认设备是否存在。
(4)分发例程FileDiskDeviceControl
FileDiskDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
该函数处理发送到虚拟磁盘的控制信息。
(5)分发例程FileDiskUnload
FileDiskUnload(
IN PDRIVER_OBJECT Driverobject
)
用于卸载驱动程序。通过调用辅助函数FileDiskDeleteDevice卸载本驱动程序创建的各设备对象和对应的设备对象工作线程。
(6)辅助函数
辅助函数有FileDiskCreateDevice、FileDiskThread、FileDiskDeleteDevice、FileDiskOpenFile和FileDiskCloseFile这些辅助函数被前面的各个函数调用,以完成相对应的任务,其中最后两个函数在FileDiskThread中进行调用,完成相对应的工作。
程序主要模块代码
1.虚拟磁盘或光驱的加载模块
Int FileDiskMount(
Int DeviceNumber,//设备号 0 1 2 3等