虚拟磁盘的设计与操作.doc_第1页
虚拟磁盘的设计与操作.doc_第2页
虚拟磁盘的设计与操作.doc_第3页
虚拟磁盘的设计与操作.doc_第4页
虚拟磁盘的设计与操作.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

虚拟磁盘的设计与操作 李季季摘要:通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD)已经实现了在硬盘上创建和管理文件,本系统主要实现将一个文件虚拟成一个相应的磁盘,在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟技术得到了很多应用,例如虚拟光驱就是其中之一,我们将对磁盘进行相关的操作。关键字: 函数 加载模块 读写操作 卸载模块 格式化 一整体功能概述: 1. 通过命令行输入/mount的加载相应虚拟磁盘的命令,执行完毕后便可以在“我的电脑”中看到又多出了与命令行输入相应的盘符,通过format将磁盘格式化或通过右键选择格式化成相应格式后,便可以对它操作。2. 通过命令行输入/mount的加载相应虚拟磁盘的命令,执行完后便可以在“我的电脑”中看到又多出了一个虚拟的磁盘,便可以对它执行读写操作。3. 在命令行下输入/umount的卸载相应虚拟磁盘的命令,执行完后便可以卸载除刚才加载的虚拟磁盘。二设计的描述: 通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD)已经实现了在硬盘上创建和管理文件,本系统主要实现将一个文件虚拟成一个相应的磁盘,在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟技术得到了很多应用,例如虚拟光驱就是其中之一。虚拟磁盘文件系统经过安装可以模拟真实的硬盘,支持各种文件系统功能。三基本的数据结构(1)全局变量dir_handleHANDLE dir_handle;该全局变量用于指向一个“目录对象”,存放本驱动程序创建的所有的磁盘对象。(2)模拟磁盘文件信息结构 OPEN_FILE_INFORMATIONtypedef struct _OPEN_FILE_INFORMATIONDEVICE_TYPE DeviceType;/所模拟的磁盘的类型BOOLEAN ReadOnly;/是否设置虚拟磁盘为只读LARGE_INTEGER FileSize;/本文件的大小USHORT FileNameLength;/文件名的长度UCHAR FileName1;/文件名字符串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)入口函数 DirverEntryDirverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegisterPath)该函数主要实现建立相应个数的磁盘对象和向I/O管理器注册4个分发例程以处理来自应用程序的相应请求。(2)分发例程 FileDiskCreateCloseFileDiskCreateClose( IN PDEVICE_OBJECT DriverObject, IN PIRP Irp)在这个函数中相应打开文件和关闭文件对象的请求,对应主功能代码IRP_MJ_CREATE和IPR_MJ_CLOSE。在函数中就是简单的返回打开成功的标记,不需要完成额外的工作。(3)分发例程FileDiskReadWriteFileDiskReadWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)这个函数完成对虚拟磁盘的读写,对应于主功能代码IRP_MJ_WRITE和IRP_MJ_READ。在进行读写之前先确认设备是否存在。(4)分发例程FileDiskDeviceControlFileDiskDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)该函数处理发送到虚拟磁盘的控制信息。(5)分发例程FileDiskUnloadFileDiskUnload( IN PDRIVER_OBJECT Driverobject)用于卸载驱动程序。通过调用辅助函数FileDiskDeleteDevice卸载本驱动程序创建的各设备对象和对应的设备对象工作线程。(6)辅助函数 辅助函数有 FileDiskCreateDevice、FileDiskThread、FileDiskDeleteDevice、FileDiskOpenFile和FileDiskCloseFile这些辅助函数被前面的各个函数调用,以完成相对应的任务,其中最后两个函数在FileDiskThread中进行调用,完成相对应的工作。程序主要模块代码1. 虚拟磁盘或光驱的加载模块Int FileDiskMount(Int DeviceNumber,/设备号 0 1 2 3等POPEN_FILE_INFORMATION OpenFileInformation,/文件类型信息Char Driverletter,/卷名BOOLEAN CdImage/是否为CD) char VolumeName=”. :”; char DeviceName255;/临时存放文件名HANDLE Device;/文件句柄DWORD BytesReturned;/缓冲区VolumeName4 = DriveLetter;/将空格用盘符号代替 Device = CreateFile( VolumeName,/要打开的文件的名字 GENERIC_READ | GENERIC_WRITE,/ 访问模式 FILE_SHARE_READ | FILE_SHARE_WRITE,/允许对文件进行读写共享访问 NULL, OPEN_EXISTING,/文件必须已经存在。/打开一个文件, 如果文件不存在函数将会失败 FILE_FLAG_NO_BUFFERING,/禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块 NULL ); if (Device != INVALID_HANDLE_VALUE)/创建文件成功 SetLastError(ERROR_BUSY); PrintLastError(&VolumeName4); return -1; /上面CreateFile的作用是:判断文件是否已经存在,存在则设置错误信息,中断返回。不存在继续向下执行; if (CdImage) sprintf(DeviceName, DEVICE_NAME_PREFIX Cd %u, DeviceNumber);/格式化输出到DeviceName中DeviceFileDisk Cd* else sprintf(DeviceName, DEVICE_NAME_PREFIX %u, DeviceNumber);/格式化输出到DeviceName中DeviceFileDisk* if (!DefineDosDevice(/创建一个指向设备命名空间的符号链接,创建失败,输出错误信息; DDD_RAW_TARGET_PATH, &VolumeName4,/盘符号,例如Z: DeviceName ) PrintLastError(&VolumeName4); return -1;/返回 Device = CreateFile(/用CreateFile打开上面建立的符号链接 VolumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,/打开一个文件, 如果文件不存在函数将会失败,利用DefineDosDevice创建VolumeName4与DeviceName的链接故文件存在; FILE_FLAG_NO_BUFFERING, NULL ); if (Device = INVALID_HANDLE_VALUE)/创建失败; PrintLastError(&VolumeName4);/错误信息; DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName4, NULL);/删除前面建立的符号链接 return -1;/返回 if (!DeviceIoControl( Device, IOCTL_FILE_DISK_OPEN_FILE, OpenFileInformation, sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation-FileNameLength - 1, NULL, 0, &BytesReturned, NULL )/创建失败 PrintLastError(FileDisk:);/错误处理 DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName4, NULL);/删除前面建立的符号链接 return -1;/返回 return 0;2.虚拟磁盘或光驱的卸载模块 int FileDiskUmount(char DriveLetter) char VolumeName = . :;/ . :特别特别注意中间有个空格 HANDLE Device; DWORD BytesReturned; VolumeName4 = DriveLetter;/将空格用盘符号代替 Device = CreateFile(/此处的作用是判断文件是否存在 VolumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,/文件必须已经存在。打开一个文件, 如果文件不存在函数将会失败GetLastError()函数会捕获消息; FILE_FLAG_NO_BUFFERING, NULL );/ 返回一个无效的文件句柄,说明要卸载的文件系统根本不存在 if (Device = INVALID_HANDLE_VALUE) PrintLastError(&VolumeName4);/比如要删除Z:但是Z不存在,便会输出错误“Z: 系统找不到指定的文件。” return -1;/返回 /如果返回一个有效文件句柄,则虚拟的盘符存在/开始执行/umount的动作/包括以下几个步骤:/1、锁定当前卷,通过发送FSCTL_LOCK_VOLUME到设备驱动实现/2、关闭所有该卷上打开的所有文件,通过发送IOCTL_FILE_DISK_CLOSE_FILE到设备驱动实现/3、卸载该卷,通过发送FSCTL_DISMOUNT_VOLUME到设备驱动实现/4、解除该卷的锁定,通过发送FSCTL_UNLOCK_VOLUME到设备驱动实现/5、关闭设备/6、删除虚拟盘符 if (!DeviceIoControl( Device, FSCTL_LOCK_VOLUME,/首先我们得发出FSCTL_LOCK_VOLUME锁住光驱以防止写入 NULL, 0, NULL, 0, &BytesReturned, NULL ) PrintLastError(&VolumeName4);/操作失败,GetLastError()函数会捕获消息,则进行错误处理; return -1;/返回 if (!DeviceIoControl( Device, IOCTL_FILE_DISK_CLOSE_FILE,/发出IOCTL_FILE_DISK_CLOSE_FILE,IO的控制信息 关闭磁盘文件 NULL, 0, NULL, 0, &BytesReturned, NULL ) PrintLastError(FileDisk:);/操作失败,GetLastError()函数会捕获消息,则进行错误处理; return -1;/返回 if (!DeviceIoControl( Device, FSCTL_DISMOUNT_VOLUME,/卸载该卷,通过发送FSCTL_DISMOUNT_VOLUME到设备驱动实现 NULL, 0, NULL, 0, &BytesReturned, NULL ) PrintLastError(&VolumeName4);/操作失败,GetLastError()函数会捕获消息,则进行错误处理; return -1;/返回 if (!DeviceIoControl( Device, FSCTL_UNLOCK_VOLUME,/解除该卷的锁定,通过发送FSCTL_UNLOCK_VOLUME到设备驱动实现 NULL, 0, NULL, 0, &BytesReturned, NULL ) PrintLastError(&VolumeName4);/操作失败,GetLastError()函数会捕获消息,则进行错误处理; return -1;/返回 CloseHandle(Device);/关闭内核对象设备HANDLE if (!DefineDosDevice(/删除虚拟盘符 DDD_REMOVE_DEFINITION, &VolumeName4, NULL ) PrintLastError(&VolumeName4);/操作失败,GetLastError()函数会捕获消息,则进行错误处理; return -1;/返回虚拟盘符 return 0;/正常执行结束,返回int FileDiskStatus(char DriveLetter) char VolumeName = . :;/ . :特别特别注意中间有个空格 HANDLE Device; POPEN_FILE_INFORMATION OpenFileInformation; DWORD BytesReturned; VolumeName4 = DriveLetter;/将空格用盘符号代替 Device = CreateFile(/此处的作用是判断文件是否存在 VolumeName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,/文件必须已经存在。打开一个文件, 如果文件不存在函数将会失败GetLastError()函数会捕获消息; FILE_FLAG_NO_BUFFERING, NULL );/ 返回一个无效的文件句柄,说明文件系统根本不存在 if (Device = INVALID_HANDLE_VALUE)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论