windows平台xFsRedir目录重定向程序2019年更新

                                                                           by fanxiushu 2019-08-12 转载或引用请注明原始作者。


使用过xFsRedir程序的人大概都知道这个程序是做什么用的。
它把各种服务端的文件夹也就是目录,映射到本地某个文件夹中,而且操作这个被重定向的文件夹就跟本地文件系统一样。
它支持FTP,SMB,  NFS,SFTP等10来种通用的文件传输协议,从而能把各种异构的文件夹平台集中到一起来访问。
xFsRedir核心部分就是从文件夹到文件夹的映射。
而本次的更新是让xFsRedir支持更多的功能,支持从镜像文件到磁盘的映射。

xFsRedir核心部分文件夹映射文件夹的原理介绍可从CSDN上的文中查阅。为了方便本文再次罗列出相关链接:
https://blog.csdn.net/fanxiushu/article/details/43636575     (文件过滤驱动实现目录重定向(一))
https://blog.csdn.net/fanxiushu/article/details/43845699     (文件过滤驱动实现目录重定向 (二))
https://blog.csdn.net/fanxiushu/article/details/44737171     (文件过滤驱动实现目录重定向 (三))
https://blog.csdn.net/fanxiushu/article/details/52681705     (linux平台用VFS驱动实现目录重定向(文件驱动实现目录重定向 四))

其中第四部分是在linux平台开发VFS驱动来实现目录重定向,其他三篇则是在windows平台的实现原理。
windows平台利用文件过滤驱动实现目录重定向是非常复杂的,
这可以从 文件过滤驱动实现目录重定向 (三) 这篇文章中定义的最早期数据结构声明可以看出,
声明的数据结构挺复杂,更别说内部的实现了。因此也花费了我不少时间来开发这样的驱动。

xFsRedir开发当初,只关注文件夹的重定向,并没认真去考虑虚拟磁盘,
只是后来想到有人可能并不想在原有的分区盘符中对某个目录做重定向,而是希望开辟一个新盘符,再对新盘符的某个文件夹做重定向。
因此这个时候就得开发对应的虚拟磁盘驱动。为了省事本打算使用系统自带的接口比如 subst命令来创建一个盘符,
但是这样创建的盘符不是真正的分区卷,无法挂载文件过滤驱动。因此只能在驱动内部实现虚拟磁盘驱动。

xFsRedir项目,是我在研究底层的StorPort和ScSIPort模型的磁盘驱动之后,萌生的一个想法。
虽然当时玩storport虚拟磁盘驱动玩的很顺,并且还从头开发了各个程序,
比如实模式下的BOOT引导PXE程序,storport引导盘驱动等等,实现了无盘启动的功能。
记得当初成功无盘启动了winxp系统,只是随着云桌面的新起,
无盘启动又牵涉到很多底层技术,而且局限很大,限制也多,我想现在主要除了网吧,其他地方应该比较少使用无盘吧。
因此也没再花更多的时间去研究,尤其是PXE引导,现在除了实模式引导,还包括EFI引导。iPXE开源项目集成了大部分这种功能。

折腾storport模型的虚拟磁盘驱动,都是从一个物理镜像文件映射到虚拟磁盘,也就是都是从单一的文件映射成分区盘符。
而平时接触到更多的是各种目录,各种文件夹,包括各种平台的,linux的,嵌入式openwrt的,windows的,macOS的等等。
当时很想把各种文件夹映射成本地文件系统。于是xFsRedir项目孕育而生。

当时需要在xFsRedir驱动中实现虚拟磁盘驱动功能的时候,
并没把storport虚拟磁盘驱动框架集成到xFsRedir驱动中,主要是基于以下原因考虑,
storport框架或者自己实现ScSIDisk驱动,都是基于PNP即插即用的,需要INF安装文件来安装。
而文件过滤驱动是NT驱动,安装卸载相当方便,若两者集成到一起,虽然没什么问题,但是会显得喧宾夺主,主次不分。
因此选择了尽量简单的虚拟磁盘驱动模式,也就是 filedisk。
这种框架简单到何种程度呢?
只需要在需要的时候,IoCreateDevice创建一个 FILE_DEVICE_DISK类型的设备,
在 IRP_MJ_DEVICE_CONTROL 派遣函数中处理跟磁盘相关的一些参数和属性。
然后 IRP_MJ_READ,IRP_MJ_WRITE派遣函数中就是直接读写扇区数据了。
在应用层调用 DefineDosDevice函数来挂载这个设备,就能生成一个新分区卷,
然后可以把新分区卷格式化为NTFS文件系统,并可以在上面挂载文件过滤驱动。
有兴趣可以参阅很早前写的博客 (其中只有第一章简单介绍了filedisk驱动):
https://blog.csdn.net/fanxiushu/article/details/9903123    (磁盘驱动与虚拟磁盘Miniport驱动一)
https://blog.csdn.net/fanxiushu/article/details/11713357  ; (磁盘驱动与虚拟磁盘Miniport驱动二)

这样的磁盘驱动也是有限制的:
1,首先,操作系统并没把他当成真正的磁盘,不会出现在磁盘管理器中,它只能以单个分区卷方式挂载。
2,它不能作为系统启动盘来远程启动系统,也就是无法作为无盘工作站的启动盘。当然要实现一个无盘启动,需牵涉到很多底层技术。
然而,只要我们不关心系统启动部分,只在系统正常运行中使用此类虚拟磁盘。这样的情况下,依然能胜任绝大部分需求。

在最早的xFsRedir驱动中就已经集成了这样的虚拟磁盘,但是当时无暇考虑过多,
只简单实现了用稀释文件方式创建了一个镜像文件来生成一个新分区卷,然后在新分区卷挂载文件过滤驱动,实现目录重定向的功能。
然后到了2018年,改进了虚拟磁盘的镜像文件的存储方式,并且创建了内存磁盘来给内存目录提供基础。
修改日志可查阅:
https://blog.csdn.net/fanxiushu/article/details/80289261
2018年的修改依然只是把虚拟磁盘功能作为一个隐身部分。

而这次的升级,则是把虚拟磁盘功能从幕后变身到前台,扩大了实际使用的功能。
这其实得益于CSDN上一位网友的提醒:想要httpdisk功能,也就是通过HTTP协议传输iso镜像文件来模拟光驱。
于是查阅了filedisk,httpdisk,imdisk,winvblock等等这些磁盘提供的大致功能,把他们的功能集中到xFsRedir来实现,
并且提供了多种访问镜像的方式,不单单是HTTP,还包括HTTPS,FTP,SMB,NFS,SFTP等等,还提供了整个物理磁盘分区的远程映射。
就是xFsRedir的目录重定向的文件传输协议也提供给了虚拟磁盘的镜像文件传输。

要支持这么多的传输协议,如果只是在驱动内部处理数据传输,对某些协议是非常艰难的,比如HTTPS,SFTP等。
因为这样的话,需要在驱动里要实现SSL加密代码。
做这种吃力不讨好的事,还不如直接把驱动的数据读写请求转发到应用层来,
然后在应用层有一大堆的现成的各种支持HTTPS,SFTP等传输协议的开源库可以使用。
这也是xFsRedir的目录重定向这个核心功能实现的基本准则,文件过滤驱动的对文件的各种请求,都是转发到应用层来处理。
这样的处理方式,才会让xFsRedir很轻松的支持各种网络文件传输协议。
当然这样会让性能有些耗损,并且疯狂传输文件的时候,可能会让CPU占有率有些高。

具体点,对于虚拟磁盘驱动来说,其实真正要处理的读写请求,就是IRP_MJ_READ,IRP_MJ_WRITE,且只是读写扇区数据。
比起非常复杂的文件过滤驱动要处理各种请求类型,处理虚拟磁盘驱动的读写请求简直是太轻松了。
当然,为了给这种轻松增加点复杂度,又把它分成两种情况来处理。
如果是对本地镜像文件或者对 \\Server\ 共享文件的读写,直接在驱动里以打开文件方式来传输数据。
当然内存磁盘肯定也是在驱动内部处理数据的传输。
其他传输协议的磁盘,则是把IRP_MJ_READ/WRITE 读写请求转发到应用层,然后应用层利用现成的开源库,直接连接到服务器读写数据。
当然,PRIVATE私有协议除外,这个只有我自己的实现的代码,同时本次更新中,PRIVATE协议的服务端增加了映射物理分区的功能。

如下图,展现了最新版本的xFsRedir的虚拟磁盘效果图:
windows平台xFsRedir目录重定向程序2019年更新_第1张图片

图中的A部分展示了目前支持的所有文件传输协议,其中 private://server/$:D ,这样的URL意思是把服务端的整个物理D盘分区映射过来。
映射物理分区只支持私有协议。其他协议均指定一个镜像文件,这个镜像文件可以是磁盘分区镜像文件,也可以是光驱ISO文件。
如果设置的是磁盘分区镜像文件,在非只读情况下,并且镜像文件不存在,
程序会根据设置的虚拟磁盘大小新创建一个镜像文件,并且自动格式化为NTFS系统。
图中C部分表示创建的虚拟磁盘类型,通常分为两类,一个是普通镜像磁盘,也就是通过文件传输协议实时的与远程镜像文件交换数据。
另一个是内存磁盘,可以创建一个空白内存磁盘,也可以预先从本地镜像文件加载到内存磁盘中。
图中,除了 C,D,E是我电脑真实的物理磁盘分区,其他的H,K,L,M,O 五个全是xFsRedir创建的虚拟磁盘分区。
其中M分区是直接映射的另一台机器的物理分区,足有4T大小的分区。H分区也是映射的另一台机器的物理分区。
如果觉得映射整个物理分区还不过瘾,还可以在M分区内的某些文件夹设置重定向,
比如图中的B部分,把 CentOS 目录重定向到linux系统的文件夹下面。
挺热闹吧,至此,xFsRedir 已经成为了一个大杂烩。

如果有兴趣,可关注GITHUB上的最新版本,稍后会把更新了的xFsRedir发布上去。
https://github.com/fanxiushu/xFsRedir
 

你可能感兴趣的:(驱动开发,windows)