写完ARK(不算文件 网络 注册表部分 就写完了 囧)那两天闲着没事儿干,大概一个xx没干正事儿 关于文件操作,今天翻腾了不少资料,发现网上的资料都是各取所需,存储这块我是一点基础也没有=。= 一头雾水了很久 大家都在搞文件系统,我慢慢研究吧,这一篇先记录一下从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的符号链接 以此类推) 以创建文件为例,一种是给出{jd1}路径创建,一种是给出相对路径的参照和路径名创建,略有一点不同。 CreateFile 主要工作就是翻译一下路径名 D:\Windows\WINOBJ.INI 变成 \??\D:\Windows\WINOBJ.INI 之类的操作,然后就进入内核了。 {dy}个"\"是对象根目录 \??就是找盘符的符号链接了。 NtCreateFile 直接调用 IoCreateFile 填充了一个OPEN_PACKET 然后直接调用ObReferenceObjectByName,返回文件句柄,文件对象并不插入对象目录,只能通过句柄访问。 ObReferenceObjectByName 调用ObpLookupObjectName创建或打开文件对象,调用ObpCreateHandle创建句柄后返回 ObpLookupObjectName 1 。提供{jd1}路径: 通过 \??\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 )只有磁盘对象才需要 接下来就可以看文件系统了。。。 PS。国足竟然赢韩国了,不看国足大半年,今天一看视频集锦,还真吓一跳,那三个球是真漂亮,配合明显是练过的,当然韩国防守相当假,都快赶上中国了,不过比赛过程应该还是真实的,因为中国技术统计很难看。国足在我的词典里已经沦为最恶毒的骂人语言,但32年中国男性在足球上没赢过韩国了,说不高兴就太假了,不过不用像徐扬那样高呼“中国足球春天来了”,也不用像李承鹏那样乱损一同(不过人家是足球评论员,如果也跟老百姓一样傻乐估计饭碗就没了)。咱还是乐呵乐呵得了。 足球界的问题即是社会问题,想必社会各个领域也不比足球强到哪去。到了这个倒霉的年龄,对社会的认知从各个方面都会被xx,世态炎凉~大悲剧。 |