【纯笔记】文件啊文件(1)

来源:互联网 发布:程序员标准形象 编辑:程序博客网 时间:2024/06/13 04:12
大家都在搞文件系统,我慢慢研究吧,这一篇先记录一下从win32暴露的界面到FSD的过程,不涉及文件系统~

资料来源于ReactOS(0.3.10)和毛德操那本书还有其他乱七八糟的有关文件的资料,只是大概了解一下流程,不保证对,前两天看内存管理那块发现ROS里好多东西都是自己YY的...

最古老的存储介质——磁盘,物理磁盘是计算机上安装的实际磁盘,实际在我的电脑里看到的逻辑磁盘,Io初始化时 会为每一块物理磁盘创建符号链接 \??\PhsicalDriveX。 再从0号分区读取分区表,创建符号链接 X: 连接于 \Device\Harddisk0\PartitionN(N从1开始对应C:,以此类推)(ROS的源码是这样的,但vista下略有不同,不过也差不太多,用winobj可以看到Partition0又是 \Device\Harddisk0\DR0 的符号链接,Partition1是\Device\HarddiskVolume1的符号链接 以此类推)

以创建文件为例,一种是给出绝对路径创建,一种是给出相对路径的参照和路径名创建,略有一点不同。

CreateFile

主要工作就是翻译一下路径名 D:\Windows\WINOBJ.INI 变成 \??\D:\Windows\WINOBJ.INI 之类的操作,然后就进入内核了。 第一个"\"是对象根目录 \??就是找盘符的符号链接了。


NtCreateFile 直接调用 IoCreateFile

填充了一个OPEN_PACKET 然后直接调用ObReferenceObjectByName,返回文件句柄,文件对象并不插入对象目录,只能通过句柄访问。

ObReferenceObjectByName

调用ObpLookupObjectName创建或打开文件对象,调用ObpCreateHandle创建句柄后返回

ObpLookupObjectName  

1 。提供绝对路径:

通过 \??\X: 符号链接找到设备对象\Device\Harddisk0\PartitionX   调用其解析函数IopParseDevice

2。相对路径:

通过相对路径的参照根目录来IopParseFile 间接调用IopParseDevice,两种方式在IopParseDevice有细微差别,不影响整体流程
IopParseDevice

IopCheckVpbMounted 检测文件卷是否安装,如否则安装并绑定。然后就向FSD发送IRP了。

VPB(volume parameter block ):文件卷参数块

typedef struct _VPB {
。。。。
struct _DEVICE_OBJECT *DeviceObject;  //指向FSD设备栈上层的过滤设备
struct _DEVICE_OBJECT *RealDevice;  //逻辑磁盘设备对象,驱动对象是\Driver\Disk
。。。。
} VPB, *PVPB;

typedef struct _FILE_OBJECT {
。。。。。。。。
PVOID FsContext;
PVOID FsContext2;

FsContext是FCB(file control block)/ SCB (stream control block) 不同文件系统不一样
FsContext2是 CCB(Context Ctrl Block )只有磁盘对象才需要