FileDisk源码分析.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:5 大小:39KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

FileDisk源码分析.doc

FileDisk源码分析.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

这差不多是去年写的学习笔记了...当时后面部分好像偷懒了...没写全的样子...呵呵~当时本来还打算A掉VirtualCDROM的VcdRom.sys,不过debugman上已经有人放出src了...所以也就学习了一下...下面凑合着看.filedisk是一个网上流传比较广泛的开源程序,它能够mount/unmountCD/DVDimages.通俗点说就是实现虚拟光驱的功能,也是一个学习磁盘过滤驱动非常好的例子.你可以从HYPERLINK"http://www.acc.umu.se/~bosse/"\t"_blank"Windowsdriverexamples下载最新的filedisk源代码,下面的代码是基于最新的filedisk-17.[1.0]FileDisk的使用打开install.txt文件.里面讲述的很清楚.首先,将filedisk.sys驱动程序复制到%systemroot%\system32\drivers\.目录下.然后,双击filedisk.reg文件.添加到注册表中.最后,重启即可.上面这些其实就是实现对filedisk.sys的驱动安装而已,在启动的时候将filedisk.sys加载到内核中.重启之后,就可以在控制台中运行filedisk.exe程序,可以使用mount和unmount命令了.[2.0]FileDisk驱动分析.FileDisk驱动程序,通过增加一个设备,实现磁盘过滤.对磁盘的过滤,重点要关注的是对磁盘的读,写,以及关于磁盘信息的获取.[2.1]filedisk.h1.定义了设备名和符号链接名2.定义三个IOCTL_CODE,分别与Read,Write,Query三个操作相关3.定义了OPEN_FILE_INFORMATION结构,该结构保存和传递关于被mount的文件的相关信息.typedefstruct_OPEN_FILE_INFORMATION{LARGE_INTEGERFileSize;//文件大小BOOLEANReadOnly;//是否可读写UCHARDriveLetter;//盘符USHORTFileNameLength;//文件名的长度UCHARFileName[1];//文件名}OPEN_FILE_INFORMATION,*POPEN_FILE_INFORMATION;[2.2]filedisk.c再分析函数之前先来熟悉下几个结构1.DEVICE_EXTENSION结构.其实关于DEVICE_EXTENSION,它是由I/O管理器自动分配这个内存,并把设备对象中的DeviceExtension指针指向这块内存.typedefstruct_DEVICE_EXTENSION{BOOLEANmedia_in_device;//是否指定了一个文件作为存储媒介HANDLEfile_handle;//文件句柄ANSI_STRINGfile_name;//文件名LARGE_INTEGERfile_size;//文件大小BOOLEANread_only;//是否只读BOOLEANis_cd_or_dvd;//是否为cd/dvdPSECURITY_CLIENT_CONTEXTsecurity_client_context;//线程客户安全contextLIST_ENTRYlist_head;//链表头KSPIN_LOCKlist_lock;//自旋锁KEVENTrequest_event;//请求事件PVOIDthread_pointer;//线程函数指针BOOLEANterminate_thread;//线程结束标志}DEVICE_EXTENSION,*PDEVICE_EXTENSION;media_in_device是指这个设备是否已经指定了一个文件作为存储媒质。这是一个用文件来虚拟磁盘的驱动。那么一个磁盘应该对应一个实际存在的文件。读写这个磁盘的请求最终转变为对文件的读写。如果一个磁盘设备对象还没有指定文件,那么这个内容是FALSE.file_handle是文件句柄。也就是这个虚拟磁盘所对应的文件。file_information是这个文件的一些信息。read_only是否只读。security_client_context访问文件的时候需要使用的一个线程客户安全性上下文。list_head是一个链表头。一部分irp(windows发来的请求包)被放入这个链表中。我们为每个磁盘对象开启一个系统线程(处理线程),专门用来处理这些请求。list_lock是为了保证链表读写同步的锁。request_event是一个事件。当链表中没有请求的时候,处理请求的系统线程并不做任何事情,而只等待这个事件。当有请求到来,我们把请求放入链表,然后设