创建Windows驱动程序以访问网络存储

Gui*_*cal 1 windows driver wdk

我正在开发一个应用程序,它需要在远程服务器上管理(访问,创建,写入,读取)文件,并将存储作为虚拟驱动器/卷安装在计算机上的指定位置(例如H :),比如本地USB设备.

在Linux上,可以使用FUSE做这样的事情.但是,在Windows上,没有等效的,唯一的方法是使用驱动程序.所以我开始使用WDF创建一个驱动程序但是我在开头就遇到了inf文件和最小的代码调整以适应我的需要.
我已经查看了许多官方驱动程序示例(例如,nonpnp示例)以及互联网上的许多各种资源(例如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:\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é ==========
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮我解决这个问题吗?我花了很多时间在这上面,我真的被卡住了.

谢谢你的帮助,
纪尧姆

Rai*_*ack 5

第一:编写(内核)驱动程序并非易事.如果这不是出于教育目的,我强烈建议向真正的专家寻求商业支持,例如,请查看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".

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

从Configuration Manager中,选择Active Solution Configuration:

Win7发布

对,在"Active solution platform"下设置为x64

可选:

minispy属性(过滤器和用户)

配置属性=> 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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

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

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

在Server 2008 R2上:

为了能够加载驱动程序,必须使服务器进入"测试模式".

命令提示符(以Administrator身份运行)

bcdedit.exe -set TESTSIGNING ON
Run Code Online (Sandbox Code Playgroud)

重启

重启后,"测试模式"将显示在右下角

导入测试证书

启动"certmgr"

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

主菜单=>操作=>所有任务=>导入...

选择test.cer

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

安装筛选驱动程序

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

(您只看到一个短暂的闪烁而没有"成功类型"消息)

在命令提示符中:

fltmc load minispy
Run Code Online (Sandbox Code Playgroud)

如果看不到任何消息,则表明驱动程序已成功加载.

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

fltmc
Run Code Online (Sandbox Code Playgroud)

将显示所有已加载的筛选器驱动程序

第一次测试:

minispy /a c: /f: log.txt
Run Code Online (Sandbox Code Playgroud)

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