




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 H a r b i n I n s t i t u t e o f T e c h n o l o g y a t W e i h a i 操作系统课程设计报告设计题目:院 系:班 级:学 号:设 计 者:哈尔滨工业大学(威海)2008年12月哈尔滨工业大学(威海)计算机学院操作系统课程设计验收及成绩评定表(项目组) 哈尔滨工业大学(威海)课程设计任务书 目录1. 设计要求 . . - 4 -2. 设计目的 . . - 4 -3. 设计的描述 . - 4 -4. 设计分析 . . - 5 -4.1驱动程序 . - 5 -4.2 filedisk应用程序. - 7 -5. 程序设计流程图 .
2、- 8 -6. 程序主要模块代码 . . - 9 -6.1虚拟磁盘或光驱的加载模块 . - 9 -6.2虚拟磁盘或光驱的卸载模块 . - 11 -7. 调试分析 . . - 13 -8. 运行结果 . . - 14 -8.1创建虚拟磁盘 . - 14 -8.2创建虚拟光盘 . - 14 -9. 心得体会 . . - 15 -1. 设计要求本实验将在Windows XP平台上,指导学生分析一个具体的虚拟磁盘的文件系统驱动程序,并完成对它的完善。具体要求如下:1)、理解文件系统驱动程序(FSD )在系统中的作用和工作机制。2)、分析实验给出的虚拟磁盘文件系统设备驱动程序,能够掌握其结构和运作机制,
3、同时理解其与FSD 的关系。3)、完善所给虚拟设备文件系统驱动程序,加入虚拟光驱功能的支持。4)、将虚拟设备驱动程序安装到系统中,运行相应的应用程序进行测试分析。2. 设计目的了解文件系统及文件系统驱动程序的一般原理。学习开发文件系统驱动程序的开发环境,了解其与DDK (Device Drivers Kit,设备驱动程序开发包)的关系。掌握虚拟磁盘技术,能够编译生成相应的驱动程序并在系统中安装实现。进一步掌握Windows 2000/XP系统中驱动程序的一般结构。3. 设计的描述通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD )已经实现了在硬盘上创建和管理文件,本系统主要
4、实现将一个文件虚拟成一个相应的磁盘。在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟磁盘技术得到了很多应用,例如虚拟光驱就是其中之一。虚拟磁盘文件系统经过安装可以模拟真实的硬盘,支持各种文件系统功能,例如读写“磁盘”上的文件。程序层次分布如下: 4. 设计分析4.1驱动程序系统启动时驱动程序将入口函数DriverEntry 装入内存,随即调用它的入口函数进行初始化。在初始化的过程中,本驱动程序要完成两件事:调用辅助函数FileDiskCreateDevice 创建几个虚拟磁盘的对象,向I/O管理器注册本程序的分发例程,同时也注册本驱动程序的卸载例程用于在卸载驱动程序时卸载所占
5、有的资源。创建磁盘设备对象的同时创建一个设备工作线程,用于完成IRP 的后续处理。实验中利用该线程的一个事件对象,实现对虚拟磁盘的读写同步。本系统就是在该线程中利用一个时间对象,实现对虚拟磁盘的读写等操作之间的同步,实际上该工作线程执行的是函数FileDiskThread 。 以下是驱动程序内部函数调用关系: (1)全局变量dir_handle HANDLE dir_handle; 该全局变量用于指向一个“目录对象”,存放本驱动程序创建的所有磁盘对象。(2)模拟磁盘文件信息结构 OPEN_FILE_INFORMATIONtypedef struct _OPEN_FILE_INFORMATION
6、DEVICE_TYPE DeviceType;/所模拟的磁盘的类型BOOLEAN ReadOnly; /是否设置虚拟磁盘为只读 LARGE_INTEGER FileSize; /本文件的大小 USHORT FileNameLength;/文件名的长度 UCHAR FileName1; /文件名字符串OPEN_FILE_INFORMATION; 该结构保存了用于虚拟磁盘的文件的详细信息。在应用程序中利用mount 命令指定这个文件时,会将文件的信息组成这样一个结构后作为参数传入内核。驱动程序会抽取这些信息,并把它们作为虚拟磁盘的磁盘信息,例如磁盘的大小和只读属性。 (3)设备扩展结构 DEVIC
7、E_EXTENSION自定义的磁盘信息结构,用来保存设备的细节以及对设备的编程方式。typedef struct _DEVICE_EXTENSION 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;
8、 KEVENT request_event; PVOID thread_pointer; BOOLEAN terminate_thread; DEVICE_EXTENSION, *PDEVICE_EXTENSION;本驱动程序所创建的虚拟磁盘对象均为自己维护这样一个数据结构。实际上,所有内核驱动程序中的设备对象都维护着这样一个数据结构。其主要作用就是在此保存对应设备的一些参数,使得所有有关此设备的处理都可以通过设备对象访问到这些信息。程序中还引用了ntfs.h 和ntddk.h 中的其它数据结构。(1)入口函数 DirverEntryDirverEntry(IN PDRIVER_OBJECT
9、DriverObject, IN PUNICODE_STRING RegisterPath该函数主要实现建立相应个数的磁盘对象和向I/O管理器注册4个分发例程以处理来自应用程序的相应请求。(2)分发例程 FileDiskCreateClose FileDiskCreateClose ( IN PDEVICE_OBJECT DriverObject, IN PIRP Irp )在这个函数中相应打开文件和关闭文件对象的请求,对应主功能代码IRP_MJ_CREATE和IRP_MJ_CLOSE。在本函数中就是简单的返回打开成功的标记,不需要完成额外的工作。(3)分发例程 FileDiskReadWri
10、te 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_OBJE
11、CT DriverObject )用于卸载驱动程序。通过调用辅助函数FileDiskDeleteDevice 卸载本驱动程序创建的各设备对象和对应的设备对象工作线程。 (6)辅助函数辅助函数有 FileDiskCreateDevice、FileDiskThread 、FileDiskDeleteDevice 、FileDiskOpenFile 和FileDiskCloseFile 这些辅助函数被前面的各个函数调用,以完成相应的任务,其中最后两个函数在FileDiskThread 中进行调用,完成相应的工作。4.2 filedisk应用程序filedisk 应用程序用于为驱动程序加载时创建的几个
12、设备对象指定一个卷名,这个卷名就是对应于该设备的Win32设备名称;同时为该设备对象指定用于作为虚拟磁盘的文件和设定该磁盘的一些属性。这些信息都来源于命令行参数,在解析命令行参数时将它们组织到如下一些变量中以供随后的函数进行处理:int DeviceNumber;/设备号char FileName; /虚拟磁盘文件的文件名 int FileSize; /文件大小char DriveLetter; /要指定的设备对象的卷标BOOLEAN ReadOnly; /指定磁盘为只读的标记BOOLEAN CdImage; /是否将磁盘设备对象类型设置为光驱 POPEN_FILE_INFORMATION O
13、penFileInformation;/存储模拟文件信息应用程序由6个函数组成。主函数main 完成命令行参数的解析,并根据参数的具体情况调用不同的4个功能单元模块:FileDiskSyntax ,FileDiskMount,FileDiskUmount 和FileDiskStatus 。一旦在四个单元模块的执行过程中遇到了错误或异常,则调用一个公共的错处理模块。应用程序结构示意图: 5. 程序设计流程图 6. 程序主要模块代码6.1虚拟磁盘或光驱的加载模块int FileDiskMount(int DeviceNumber, / 设备号 0 1 2 3 等POPEN_FILE_INFORMA
14、TION OpenFileInformation,/ 文件类型的信息 char DriveLetter, / 文件(卷 名 BOOLEAN CdImage/ 是否是cdrom char VolumeName = ". :" char DeviceName255; / 用来临时存储文件名字 HANDLE Device;/ 用来保存返回的文件句柄 DWORD BytesReturned;/ 缓冲区VolumeName4 = DriveLetter;/卷的名字Device = CreateFile(/创建文件, 并设置文件的读写属性等VolumeName,GENERIC_READ
15、 | GENERIC_WRITE,/文件访问权限FILE_SHARE_READ | FILE_SHARE_WRITE, /文件分享权限NULL, /返回文件指针是否可以被继承 OPEN_EXISTING,/文件不存在就返回错误 FILE_FLAG_NO_BUFFERING,/不是用系统的缓存空间NULL ; / 如果要创建的卷标正在使用 / 则抛出忙的信息/ 如果K:已分配 而传入的参数中使用了K: 这个卷标/ 则返回错误 K:请求的资源正在使用中if (Device != INVALID_HANDLE_VALUE /创建文件不成功时处理 SetLastError(ERROR_BUSY; /设
16、置文件系统忙的信息 PrintLastError(&VolumeName4;/设置卷标 return -1;/返回错误if (CdImage/如果是要创建cdrom 的虚拟文件格式sprintf(DeviceName, DEVICE_NAME_PREFIX "Cd" "%u", DeviceNumber; elsesprintf(DeviceName, DEVICE_NAME_PREFIX "%u", DeviceNumber;/将指定的Win32设备名(卷标)和相应的NT 设备名之间建立符号链接 /Win32设备名(卷标)只
17、能在用户程序中使用,NT 设备名系统运行时使用 /如果错误, 设置错误信息, 并返回if (!DefineDosDevice( DDD_RAW_TARGET_PATH, /传入的(绝对 路径&VolumeName4,/卷标的名字 如C: D: 等 DeviceName/设备的名字 PrintLastError(&VolumeName4;return -1;/-/ 测试是否创建成功/ 上面已经创建了这个文件(卷/ 如果再次创建, 如果上面创建的已经成功 / 则这次创建将返回一个无效的句柄, 因为相应的文件(卷 名被占用了Device = CreateFile(VolumeName
18、,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL;/ 如果Device 返回一个有效的句柄 , 这说明上次创建的没有成功, 这返回错误信息 / 并将建立的符号链接断开if (Device = INVALID_HANDLE_VALUEPrintLastError(&VolumeName4;DefineDosDevice(DDD_REMOVE_DEFINITION, &VolumeName4, NULL;ret
19、urn -1;/-/IO设配操作-打开文件(卷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_DEFINITIO
20、N, &VolumeName4, NULL;return -1;return 0;6.2虚拟磁盘或光驱的卸载模块int FileDiskUmount(char DriveLetterchar VolumeName = ". :"HANDLE Device;DWORD BytesReturned;VolumeName4 = DriveLetter;Device = CreateFile(/此时所指的虚拟设备时候存在 VolumeName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NU
21、LL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL;/ 测试的结构有两种:/1.返回一个有效的文件句柄/ 说明要卸载的设备存在/2.返回一个无效的文件句柄/ 说明要卸载的文件系统根本不存在/ 强行卸载会出现错误, 此时要抛出错误信息if (Device = INVALID_HANDLE_VALUE/IO设配操作-锁定此文件(卷if (!DeviceIoControl(Device,FSCTL_LOCK_VOLUME, /文件系统命令-关闭文件(卷NULL,0,NULL,0,&BytesReturned,NULLPrintLastError(&VolumeName4;/不成功就打印错误后返回return -1;/IO设配操作-关闭文件if (!DeviceIoControl(Device,IOCTL_FILE_DISK_CLOSE_FILE,/IO的控制信息 关闭磁盘文件 NULL,0,NULL,0,&BytesReturned,NULLPrintLastError("FileDisk:"/不成功就打印错误后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电影院影厅的环保材料与节能布局
- 科技创新对商业生态稳定性的影响研究
- 科技企业客服中心流程自动化的实施策略
- 美国签约合同范本
- 日化铺货合同范本
- 2025至2030年中国特效洁版膏数据监测研究报告
- 2025至2030年中国燃气铸铁热水炉数据监测研究报告
- 科技推动下的社交网络信息传播革新
- 展览陈列 施工合同范本
- 物流行业的大数据技术应用案例
- 2025年四川绵阳科技城新区投资控股集团有限公司招聘笔试参考题库附带答案详解
- 2025年碳化硅(SiC)市场分析现状
- 2024年湖南高速铁路职业技术学院高职单招数学历年参考题库含答案解析
- 2024年沙洲职业工学院高职单招语文历年参考题库含答案解析
- 2024年广东省《辅警招聘考试必刷500题》考试题库【学生专用】
- 水文工程施工方案
- 学校食堂餐厅管理者食堂安全考试题附答案
- 2025延长石油(集团)限责任公司社会招聘高频重点提升(共500题)附带答案详解
- 《没有纽扣的红衬衫》课件
- 病原微生物安全
- 玻璃电动平移门施工方案
评论
0/150
提交评论