【纯笔记】文件啊文件(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 )只有磁盘对象才需要
资料来源于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 )只有磁盘对象才需要
- 【纯笔记】文件啊文件(1)
- Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)
- Wave文件读取(纯C版)
- 纯ajax上传文件
- 纯js上传文件
- 纯c++读写文件方式
- 纯Servlet实现文件上传
- 纯C读写ini文件
- 纯php多文件上传
- 纯php多文件上传
- 纯java代码文件上传
- 纯JS导出文件为excel格式-----1
- test3-10(写入文件,纯抄的。。。)
- Matlab----GUI编程-登录框实现(纯m文件)
- 文件上传(纯jsp编写,无框架)
- 【matlab】----GUI编程-登录框实现(纯m文件)
- Qt 学习笔记--------------------使用纯代码写dialog 与 UI文件
- ( 转载)纯Java文件操作工具,支持文件、文件夹的复制、删除、移动
- VC++ Semaphore
- Linux下查看文件和文件夹大小的df和du命令
- WORD调用EXCEL数据
- flash登录界面正常显示与当前系统编码页不同的语种版本
- QT 发射信号,接收槽,双线程演示(QtSDK演示程序)
- 【纯笔记】文件啊文件(1)
- 详细解析Linux scp命令的应用
- 文件啊文件(2)FAT32格式~
- 过华为论-观华为二十年盛衰史有感
- Linux配置教程之五:apache安装配置
- 一个学习silverlight游戏的网站
- 黑马程序员--数组与集合
- Extjs+struts2 实现文件上传
- C#Zip方式压缩文件和解压缩文件代码