虚拟磁盘的设计与操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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等

相关文档
最新文档