创build一个Windows驱动程序来访问networking存储

我正在研究需要pipe理(访问,创build,写入,读取)远程服务器上的文件的应用程序,并将该存储装载为计算机上指定位置(如H :)上的虚拟驱动器/卷,就像本地的USB设备一样。

在Linux上,使用FUSE可以做这样的事情。 但是,在Windows上,没有对等的,唯一的办法就是使用驱动程序。 所以我开始使用WDF创build一个驱动程序,但是我一开始就用inf文件和最小的代码适应来适应我的需要。
我看了很多官方的驱动程序样本(例如nonpnp样本)以及互联网上的各种资源(例如OSR Online ),但是我无法得到这个工作。

我遵循的步骤

为了启动我的驱动程序项目,我在Visual Studio 2013中创build了一个内核模式驱动程序(KMDF) 。它是一个模板项目。 我能够用这个项目(testing机器+签名的东西+部署configuration)设置我的整个testing环境,所以这些东西正常工作。

但是,模板项目并不适合我的需求:我需要一个桌面应用程序,它将与(仅限软件)驱动程序进行交互,并要求驱动程序安装/卸载卷,并提供特定的(连接)信息每卷。 基于此,最初的inf文件必须改变,因为它是为了一个硬件驱动程序(等待一个真正的设备被插入)而不是这里的情况。 inf文件的更改也意味着模板的初始代码发生了一些变化。 但是,由于我开始修改inf文件和代码以满足我的最低要求,驱动程序安装在部署步骤中失败。

这是我得到的错误:

1>------ Début de la génération : Projet : cadwd Package, Configuration : Win7 Debug Win32 ------ 1> .......................... 1> Signability test complete. 1> 1> Errors: 1> None 1> 1> Warnings: 1> None 1> 1> Catalog generation complete. 1> C:\project\driver\Win7Debug\cadwd Package\cadwd.cat 1> Done Adding Additional Store 1> Successfully signed: C:\project\driver\Win7Debug\cadwd Package\cadwd.cat 1> 1> Deploying driver files for project "C:\project\driver\cadwd Package\cadwd Package.vcxproj". Deployment may take a few minutes... 1>C:\Program Files (x86)\Windows Kits\8.1\build\Win32\ImportAfter\DriverDeployment.targets(69,9): error : Driver Deployment Task Failed: Default Driver Package Installation Task (possible reboot) ========== Génération : 0 a réussi, 1 a échoué, 1 mis à jour, 0 a été ignoré ========== 

这是最小的代码: https : //github.com/gupascal/StackOverflow-Q201503-1 。 第一次提交是由VS项目生成的初始代码,第二次提交显示了我的testing的当前状态(但是,我做了大量的小testing[他们都没有工作],我不能在这里列出所有这些) 。

任何人都可以帮我解决这个问题吗? 我在这上面花了很多时间,而且我很困难。

谢谢你的帮助,
纪尧姆

第一:编写(内核)驱动程序并不是一件容易的事情。 如果这不是教育目的,我强烈建议询问真正的专家的商业支持,例如看看https://www.osr.com/custom-development

(我和OSR没有任何关系,但是他们似乎很能干)

通过对FS过滤器进行新的观察,我发现可以通过从preop例程中返回FLT_PREOP_COMPLETE来完成I / O操作(如果我错了,请纠正我),而不是简单地将I / O操作传递给下一个过滤。

正确

其次,一个FS过滤器驱动程序必须连接到一个卷,但在我的情况下,我需要创建一个虚拟卷。 事实是,我不知道该怎么做。

这似乎是这里的主要问题。 我发现无法通过迷你过滤器“引入”一个新的(虚拟)卷,只能附加和过滤一个已经存在的卷。

我可以想到这些选项:

如果使用subst,则将例如X:映射到C:\ fakepath,并在过滤器中解析文件名,如果它位于假路径下面,则可以在过滤器中完成I / O。

我寻找其他解决方案:

https://www.eldos.com/cbfs (看起来有趣)

另外看看这里: 如何创建一个虚拟的Windows驱动器

自从我开发了一个简单的迷你过滤器(作为一个概念验证)之后,我记录下了我的经验。

我得到的错误是默认驱动程序包安装任务(可能的重新启动):失败

我没有这个VS部署方案的经验,我手动安装我的驱动程序。 我不确定什么是正确/最好/最简单的方法。

我只能告诉你,我的下面的描述为我工作(我甚至使用新的安装再次测试)。

我在这里添加这些说明,可能是他们可以帮助您尝试这种方式:


文档

https://msdn.microsoft.com/en-us/library/windows/hardware/ff548202%28v=vs.85%29.aspx

从这个链接:

“文件系统过滤器驱动程序可以过滤一个或多个文件系统或文件系统卷的I / O操作。根据驱动程序的性质,过滤器可能意味着记录,观察,修改或甚至阻止。驱动程序包括防病毒实用程序,加密程序和分层存储管理系统。“

其他有价值的信息:

http://download.microsoft.com/download/f/0/5/f05a42ce-575b-4c60-82d6-208d3754b2d6/Filter_Manager.ppt

http://download.microsoft.com/download/e/b/a/eba1050f-a31d-436b-9281-92cdfeae4b45/FilterDriverDeveloperGuide.doc

从哪儿开始

将安装在64位操作系统(Windows 7,server 2008R2 …)上的筛选器驱动程序必须进行签名。 如果您想在“正常”系统上安装这样的驱动程序,则必须购买正式的驱动程序证书。 对于开发和测试目的,您可以将系统设置为“测试模式”,其中可以使用自签名证书(不需要官方证书或注册)

第一个驱动程序

有一些来自Microsoft的示例驱动程序,可以作为一个起点。 我可以推荐使用Minispy过滤器。

先决条件

建立

打开minispy解决方案

有一些定义的配置。 既然我们要在Windows server 2008 R2上安装驱动程序,我们在这里设置“Win7 Release”。

然后右键单击解决方案资源管理器中的解决方案并选择配置管理器

从配置管理器中选择活动解决方案配置:

Win7发布

正确的,在“主动解决方案平台”设置为X64

可选:

minispy属性(Filter和User)

配置属性=> C / C ++ =>代码生成=>运行库:

从多线程DLL更改为多线程(静态链接)

优点:您不需要将MSVCR120.DLL安装到目标系统

构建解决方案

为了接下来的步骤,需要三个文件:

  • minispy.sys(MiniSpy \ C ++ \ filter \ x64 \ Win7Release)
  • minispy.exe(MiniSpy \ C ++ \ user \ x64 \ Win7Release)
  • minispy.inf(MiniSpy \ C ++)

将这些文件复制到一个目录中

Visual Studio 2013 => Visual Studio工具=> VS2013 x64本机工具命令提示符

光盘到文件的目录

 makecert -r -pe -ss PrivateCertStore -n CN=TestCert test.cer 

编辑minispy.inf更改行

DriverVer = 06/16 / 2007,1.0.0.0到当前日期

 inf2cat /driver:[path-to-dir]\ /os:server2008R2_IA64 signtool sign /v /s PrivateCertStore /n TestCert /t http://timestamp.verisign.com/scripts/timestamp.dll minispy.cat signtool sign /v /s PrivateCertStore /n TestCert /t http://timestamp.verisign.com/scripts/timestamp.dll minispy.sys 

将这些文件复制到Windows server 2008 R2:

  • minispy.cat
  • minispy.exe
  • minispy.inf
  • minispy.sys
  • test.cer

在server 2008 R2上:

为了能够加载驱动程序,服务器必须进入“测试模式”。

命令提示(以管理员身份运行)

 bcdedit.exe -set TESTSIGNING ON 

重启

重新启动后,“测试模式”将显示在右下角

导入测试证书

启动“certmgr”

选择受信任的根证书颁发机构

主菜单=>动作=>所有任务=>导入…

选择test.cer

将所有证书放置在以下存储中:受信任的根证书颁发机构

安装过滤器驱动

在Windows资源管理器中,选择minispy.inf,右键单击=>安装

(你只看到一个简短的闪烁,没有“成功类型”的消息)

在命令提示符下:

 fltmc load minispy 

如果您看不到消息,驱动程序已成功加载。

要检查驱动程序是否已加载,可以使用

 fltmc 

将显示所有加载的过滤器驱动程序

对于第一个测试:

 minispy /ac: /f: log.txt 

按Enter启动命令模式。 在那里,你可以进入exit