250 likes | 507 Views
第六章 文件管理. 概 述. Windows 文件系统概述 文件系统驱动 NTFS 的组织结构 文件系统的系统调用. Windows 文件系统概述. CDFS , UDF: 主要用于光盘,其中 UDF 应用更广 FAT = File Allocate Table 包括 FAT12 , FAT16 , FAT32 。目前应用最多的是 FAT32 ,兼容的系统有 Windows 9x , 2000 , 2003 , XP 等 NTFS = New Technology File System 主要针对 Windows NT 系列
E N D
概 述 • Windows文件系统概述 • 文件系统驱动 • NTFS的组织结构 • 文件系统的系统调用
Windows文件系统概述 • CDFS,UDF:主要用于光盘,其中UDF应用更广 • FAT = File Allocate Table • 包括FAT12,FAT16,FAT32。目前应用最多的是FAT32 ,兼容的系统有Windows 9x,2000,2003,XP等 • NTFS = New Technology File System • 主要针对Windows NT系列 • 支持安全性,磁盘配额,基于日志的数据恢复,多数据流,稀疏文件压缩等一系列新特性
文件系统驱动 • 文件系统驱动(File System Driver,即FSD)隶属于I/O驱动的一部分,是将上层传来的抽象命令和参数转化为具体的命令和参数,等待下层处理完成后将操作的结果或状态返回给上层。 • 相对底层硬件驱动而言,FSD是高层内核模式驱动程序,用于扩展底层驱动的功能,进而实现特定的文件系统。 • 分为本地FSD和远程FSD • 本地FSD,直接管理本地主机的文件卷上的数据; • 远程FSD,允许用户连接到远程主机并存取数据。
文件系统驱动 本地FSD
文件系统驱动 远程FSD
NTFS的组织结构 • NTFS磁盘结构 • MFT表 • NTFS文件组织
NTFS磁盘结构 • 卷:代表了一个逻辑分区,是在磁盘被格式化为NTFS格式的时候创建的,也可以用多个磁盘创建RAID卷。 • 扇区:将磁道划分成的大小相同的区域。 • 簇:由若干个扇区组成。 • LCN:对整个卷中所有的簇进行的编号。 • VCN:针对某一特定文件内的编号。
NTFS的磁盘结构 • NTFS磁盘结构 • 扇区:将磁道划分成的大小相同的区域。 • 簇:由若干个扇区组成。 • 簇的大小又称簇因子,会因磁盘大小不同而不同 • 簇因子对文件的存取效率有一定影响,使用大的簇因子可以加快分配速度,当然为之付出的代价是一小部分空间会被浪费掉
MFT表 • MFT=Master File Table,即主文件表,由一系列的文件记录组成,每个记录大小固定为1KB。卷上的每个文件,包括MFT本身,在MFT中都有一行记录。前16个记录被称为元数据,是系统保留的,包含系统启动及正常运行必须的信息。 • 每个MFT记录都对应着不同的文件,如果一个文件有很多的属性就可能需要多个文件记录
NTFS文件组织 • NTFS中将文件作为属性和值的集合来处理,文件的内容被看作是未命名数据属性(Unnamed Data Attribute),其他一些常用的文件属性包括文件名,文件拥有者,时间戳等。每个文件属性都由单独的流(Stream,即简单的字节序列)组成。 • 常驻属性 :属性值能后直接存放在MFT中时,该属性就被称作是常驻属性。有些属性总是常驻的,这样NTFS才能通过他们找到其他的非常驻属性 。 • 每个属性都是以一个标准头(也称属性头部)开始的,其中包含了该属性的信息和NTFS用来管理该属性的信息。标准头总是常驻的,并且记录着属性值是否为常驻。对于常驻属性,头中还包含了属性值的偏移量和属性值长度
I/O管理 用户态 文件系 统调用 检查参数 转入内核态 调用其他模块结 合完成具体功能 内存管理 缓存管理 文件系统的系统调用 文件系统调用的一般过程
实 验 • 创建文件 • 查询文件
创建文件 • 实验目的:验证Win32 API函数CreateFile()对内核函数的调用过程。Win32 API函数CreateFile()实际上先调用NtCreateFile(),再调用IopCreateFile(),由IopCreateFile()完成具体的操作。 • 实验内容:实验用Visual Studio 2005编写一个创建文件的程序CreateFile,并用Windbg对该程序进行调试,验证创建文件的执行过程。同时在WRK源代码总中加入一些调试打印语句,在WinDbg调试窗口中显示函数内部的调用过程。
创建文件 • 实验过程: • 1. 在VS中创建工程CreateFile,同时设置生成符号文件 • 在工程属性中:Configuration->Linker->Debugging,在右侧的窗口中将Generate Debug Info的值设为Yes; • Configuration->C/C++->General,将Debug Information Format的值设为Program Database for Edit & Continue(/ZI) • Configuration->C/C++->Optimization,将Optimization的值设置为Disabled (/Od) • 2. 加入程序源代码 • 3. 编译并生成EXE文件
创建文件 • 实验过程: • 4. 在WinDbg的File选项中选择Open Executable,打开CreateFile.exe文件 • 5. 用x命令查看函数在内存中的地址,用bp命令设置断点 • 6. 用g命令使程序继续运行,遇到断点停止后再用k命令查看调用堆栈 • 7. 在WRK代码中加入DbgPrint()语句,让函数在执行相应模块时打印出信息。 注意加入打印控制信息,控制打印时间和位置。
查询文件 • 实验目的:通过修改查询函数的判定条件,实现对我们指定文件的特殊操作。修改完成后需要重新编译内核执行,并可以结合DbgPrint()函数将一些调试信息发送到WinDbg中,进一步了解内核的执行过程。 • 实验内容:在NtQueryInformationFile ()函数使用输入的文件句柄获得文件对象,从文件对象的FileName属性可以得到包含完整路径的文件名。得到文件名之后,对其内容进行检查,如果其中包含某特定字符串(以“crash”为例),则拒绝本次操作,返回STATUS_ACCESS_DENIED的信息。上层应用程序得到该信息后便给用户返回相应的报错信息。
查询文件 • 实验过程: • 为了通过文件名对文件进行操作,我们首先需要得到的就是文件名。而文件对象中的FileName是包含完整路径的。需要用wcsstr ()函数进行处理,判断该其中是否包含指定的字符。注意wcsstr ()的参数都是Uicode字符。 • 文件对象中的FileName是UNICODE_STRING类型的,该结构体的成员包括Length,MaximumLength,Buffer分别是该字符串的长度,最大长度和指向字符串的指针。因此需要用语句fileObject->FileName.Buffer取得文件名。
查询文件 • 实验过程: • 为了便于更直观的查看FileName的内容,在检查文件名之前先调用DbgPrint()函数打印得到的文件名。在这里需要注意的一点是得到的字符串是Unicode的,因此打印时候的控制符要用%ls,而不是我们常用的%s。
查询文件 • 实验过程: • 在获得文件对象后加入下列语句 • DbgPrint("NtQueryInformationFile() has queried file: \"%ls\"!\n"); • if (wcsstr(fileObject->FileName.Buffer,CrashName.Buffer) >0 ){ return STATUS_ACCESS_DENIED; }