我正在开发一个应用程序,该应用程序需要管理(访问、创建、写入、读取)远程服务器上的文件,并将存储作为虚拟驱动器/卷安装在计算机上的指定位置(例如H:),例如本地USB设备。
在Linux上,可以使用FUSE来做这样的事情。然而,在Windows上,没有等效的驱动程序,唯一的方法就是使用驱动程序。因此,我开始使用WDF创建一个驱动程序,但一开始我就被inf文件和满足我需求的最小代码改编所困扰
我看了很多官方的驱动程序样本(例如非npp样本),也看了很多互联网上的各种资源(例如OSR Online),但我没能做到这一点。
我遵循的步骤
为了启动我的驱动程序项目,我在Visual Studio 2013中创建了一个内核模式驱动程序(KMDF)。这是一个模板项目。我能够用这个项目设置我的整个测试环境(测试机+签名材料+部署配置),所以这些东西都能正常工作。
但是,模板项目不太符合我的需求:我需要一个桌面应用程序,它将与(仅限软件)驱动程序交互,并要求驱动程序装载/卸载卷,并提供每个卷的具体(连接)信息。基于此,必须更改初始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:projectdriverWin7Debugcadwd Packagecadwd.cat
1> Done Adding Additional Store
1> Successfully signed: C:projectdriverWin7Debugcadwd Packagecadwd.cat
1>
1> Deploying driver files for project "C:projectdrivercadwd Packagecadwd Package.vcxproj". Deployment may take a few minutes...
1>C:Program Files (x86)Windows Kits8.1buildWin32ImportAfterDriverDeployment.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项目生成的初始代码,第二个显示了我的测试的当前状态(然而,我做了很多小测试[没有一个有效],我不能在这里列出所有测试)。
有人能帮我解决这个问题吗?我花了很多时间在这上面,我真的被卡住了。
感谢您的帮助,
Guillaume
第一:编写(内核)驱动程序不是一项容易的任务。如果这不是出于教育目的,我强烈建议向真正的专家寻求商业支持,例如https://www.osr.com/custom-development
(我与OSR没有任何关系,但他们似乎非常胜任)
通过对FS过滤器进行新的审视,我发现可以通过从PREOP例程返回FLT_PREOP_complete来完成I/O操作(如果我错了,请纠正我),而不是简单地将I/O操作传递给下一个过滤器。
纠正
其次,FS筛选器驱动程序必须连接到卷,但在我的情况下,我需要创建一个虚拟卷。事实上,我不知道怎么做,也不知道在哪里做。
这似乎是这里的主要问题。我找不到通过迷你过滤器"引入"新(虚拟)卷的方法,只能附加和过滤现有的卷。
我能想到这些选项:
-
使用subst命令(或相应的API)。有关C#中的工作示例,请参阅http://dotnet-snippets.com/snippet/create-a-virtual-drive/632)
-
使用RAM驱动器或其他添加虚拟驱动器的"假"驱动程序,并对其进行过滤。
如果使用subst,则将X:映射到C:\fakepath,然后在筛选器中解析文件名,如果它在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…)上的筛选器驱动程序进行签名。如果你想在"正常"系统上安装这样的驱动程序,必须购买官方的驱动程序证书。出于开发和测试目的,您可以将系统设置为"测试模式",在该模式下可以使用自签名证书(无需官方证书或注册)
第一个样本驱动程序
这里有一些来自微软的示例驱动程序,可以作为一个起点。我可以建议从Minispy过滤器开始。
先决条件
- Visual Studio 2013
- Windows驱动程序工具包8.1(WDK 8.1)http://www.microsoft.com/en-us/download/details.aspx?id=42273
- Minispy源代码(https://code.msdn.microsoft.com/windowshardware/Minispy-File-System-97844844)
构建
开放式迷你解决方案
有一些已定义的配置。由于我们想在Windows Server 2008 R2上安装驱动程序,我们在此处设置了"Win7 Release"。
然后右键单击解决方案资源管理器中的解决方案,然后选择Configuration Manager
从Configuration Manager中,选择Active Solution Configuration:
Win7发布
右侧,在"活动解决方案平台"下设置为x64
可选:
迷你副本属性(过滤器和用户)
配置属性=>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本机工具命令提示符
cd到带有文件的目录
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
- 迷你.sys
- test.cer
在服务器2008 R2:上
为了能够加载驱动程序,服务器必须进入"测试模式"。
命令提示符(以管理员身份运行)
bcdedit.exe -set TESTSIGNING ON
重新启动
重新启动后,"测试模式"将显示在的右下方
进口测试证书
启动"certmgr">
选择受信任的根证书颁发机构
主菜单=>操作=>所有任务=>导入。。。
选择test.cer
将所有证书放入以下存储:受信任的根证书颁发机构
安装过滤器驱动程序
在Windows资源管理器中,选择minispy.inf,右键单击=>安装
(你只看到一个短暂的闪烁,没有"成功类型"的信息)
在命令提示符中:
fltmc load minispy
如果没有看到任何消息,则表示驱动程序已成功加载。
要检查驱动程序是否已加载,可以使用
fltmc
所有加载的过滤器驱动程序将显示
第一次测试:
minispy /a c: /f: log.txt
按Enter键启动命令模式。在那里,您可以输入exit