1 / 25

第六章 文件管理

第六章 文件管理. 概 述. 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 系列

peony
Download Presentation

第六章 文件管理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章 文件管理

  2. 概 述 • Windows文件系统概述 • 文件系统驱动 • NTFS的组织结构 • 文件系统的系统调用

  3. Windows文件系统概述 • CDFS,UDF:主要用于光盘,其中UDF应用更广 • FAT = File Allocate Table • 包括FAT12,FAT16,FAT32。目前应用最多的是FAT32 ,兼容的系统有Windows 9x,2000,2003,XP等 • NTFS = New Technology File System • 主要针对Windows NT系列 • 支持安全性,磁盘配额,基于日志的数据恢复,多数据流,稀疏文件压缩等一系列新特性

  4. 文件系统驱动 • 文件系统驱动(File System Driver,即FSD)隶属于I/O驱动的一部分,是将上层传来的抽象命令和参数转化为具体的命令和参数,等待下层处理完成后将操作的结果或状态返回给上层。 • 相对底层硬件驱动而言,FSD是高层内核模式驱动程序,用于扩展底层驱动的功能,进而实现特定的文件系统。 • 分为本地FSD和远程FSD • 本地FSD,直接管理本地主机的文件卷上的数据; • 远程FSD,允许用户连接到远程主机并存取数据。

  5. 文件系统驱动 本地FSD

  6. 文件系统驱动 远程FSD

  7. NTFS的组织结构 • NTFS磁盘结构 • MFT表 • NTFS文件组织

  8. NTFS磁盘结构 • 卷:代表了一个逻辑分区,是在磁盘被格式化为NTFS格式的时候创建的,也可以用多个磁盘创建RAID卷。 • 扇区:将磁道划分成的大小相同的区域。 • 簇:由若干个扇区组成。 • LCN:对整个卷中所有的簇进行的编号。 • VCN:针对某一特定文件内的编号。

  9. NTFS的磁盘结构 • NTFS磁盘结构 • 扇区:将磁道划分成的大小相同的区域。 • 簇:由若干个扇区组成。 • 簇的大小又称簇因子,会因磁盘大小不同而不同 • 簇因子对文件的存取效率有一定影响,使用大的簇因子可以加快分配速度,当然为之付出的代价是一小部分空间会被浪费掉

  10. MFT表 • MFT=Master File Table,即主文件表,由一系列的文件记录组成,每个记录大小固定为1KB。卷上的每个文件,包括MFT本身,在MFT中都有一行记录。前16个记录被称为元数据,是系统保留的,包含系统启动及正常运行必须的信息。 • 每个MFT记录都对应着不同的文件,如果一个文件有很多的属性就可能需要多个文件记录

  11. NTFS文件组织 • NTFS中将文件作为属性和值的集合来处理,文件的内容被看作是未命名数据属性(Unnamed Data Attribute),其他一些常用的文件属性包括文件名,文件拥有者,时间戳等。每个文件属性都由单独的流(Stream,即简单的字节序列)组成。 • 常驻属性 :属性值能后直接存放在MFT中时,该属性就被称作是常驻属性。有些属性总是常驻的,这样NTFS才能通过他们找到其他的非常驻属性 。 • 每个属性都是以一个标准头(也称属性头部)开始的,其中包含了该属性的信息和NTFS用来管理该属性的信息。标准头总是常驻的,并且记录着属性值是否为常驻。对于常驻属性,头中还包含了属性值的偏移量和属性值长度

  12. I/O管理 用户态 文件系 统调用 检查参数 转入内核态 调用其他模块结 合完成具体功能 内存管理 缓存管理 文件系统的系统调用 文件系统调用的一般过程

  13. 实 验 • 创建文件 • 查询文件

  14. 创建文件 • 实验目的:验证Win32 API函数CreateFile()对内核函数的调用过程。Win32 API函数CreateFile()实际上先调用NtCreateFile(),再调用IopCreateFile(),由IopCreateFile()完成具体的操作。 • 实验内容:实验用Visual Studio 2005编写一个创建文件的程序CreateFile,并用Windbg对该程序进行调试,验证创建文件的执行过程。同时在WRK源代码总中加入一些调试打印语句,在WinDbg调试窗口中显示函数内部的调用过程。

  15. 创建文件 • 实验过程: • 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文件

  16. 创建文件 • 实验过程: • 4. 在WinDbg的File选项中选择Open Executable,打开CreateFile.exe文件 • 5. 用x命令查看函数在内存中的地址,用bp命令设置断点 • 6. 用g命令使程序继续运行,遇到断点停止后再用k命令查看调用堆栈 • 7. 在WRK代码中加入DbgPrint()语句,让函数在执行相应模块时打印出信息。 注意加入打印控制信息,控制打印时间和位置。

  17. 查询文件 • 实验目的:通过修改查询函数的判定条件,实现对我们指定文件的特殊操作。修改完成后需要重新编译内核执行,并可以结合DbgPrint()函数将一些调试信息发送到WinDbg中,进一步了解内核的执行过程。 • 实验内容:在NtQueryInformationFile ()函数使用输入的文件句柄获得文件对象,从文件对象的FileName属性可以得到包含完整路径的文件名。得到文件名之后,对其内容进行检查,如果其中包含某特定字符串(以“crash”为例),则拒绝本次操作,返回STATUS_ACCESS_DENIED的信息。上层应用程序得到该信息后便给用户返回相应的报错信息。

  18. 查询文件 • 实验过程: • 为了通过文件名对文件进行操作,我们首先需要得到的就是文件名。而文件对象中的FileName是包含完整路径的。需要用wcsstr ()函数进行处理,判断该其中是否包含指定的字符。注意wcsstr ()的参数都是Uicode字符。 • 文件对象中的FileName是UNICODE_STRING类型的,该结构体的成员包括Length,MaximumLength,Buffer分别是该字符串的长度,最大长度和指向字符串的指针。因此需要用语句fileObject->FileName.Buffer取得文件名。

  19. 查询文件 • 实验过程: • 为了便于更直观的查看FileName的内容,在检查文件名之前先调用DbgPrint()函数打印得到的文件名。在这里需要注意的一点是得到的字符串是Unicode的,因此打印时候的控制符要用%ls,而不是我们常用的%s。

  20. 查询文件 • 实验过程: • 在获得文件对象后加入下列语句 • DbgPrint("NtQueryInformationFile() has queried file: \"%ls\"!\n"); • if (wcsstr(fileObject->FileName.Buffer,CrashName.Buffer) >0 ){ return STATUS_ACCESS_DENIED; }

  21. 系统启动时查询的文件

  22. 重命名文件被拒绝

  23. 打开文件被拒绝

More Related