【问题标题】:Create a Windows driver to access network storage创建 Windows 驱动程序以访问网络存储
【发布时间】:2015-05-17 00:23:38
【问题描述】:

我正在开发一个应用程序,该应用程序需要管理(访问、创建、写入、读取)远程服务器上的文件,并将存储作为虚拟驱动器/卷安装在计算机上的指定位置(例如 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é ==========

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

谁能帮我解决这个问题?我花了很多时间在这上面,我真的被困住了。

感谢您的帮助,
纪尧姆

【问题讨论】:

  • 您是否检查过文件系统微型过滤器驱动程序是否满足您的需求? (查看msdn.microsoft.com/en-us/library/windows/hardware/ff540402code.msdn.microsoft.com/windowshardware/…)。如果这对您来说是一种可能的方式,我可能会给您更多提示(我最近写了一个小型迷你过滤器驱动程序作为概念证明)
  • 虽然文件系统驱动程序是内核模式驱动程序,但它是一种非常特殊的情况;甚至单独记录,IIRC。我不确定 KMDF 模板是否是一个明智的起点。另外,您是否考虑过 iSCSI 能否满足您的需求?
  • 感谢您的回答。首先,不,iSCSI 不能满足我的需求,因为我必须通过 HTTPS 与 API 通信(而且我无法更改服务器端)。在 KMDF 和文件系统微型过滤器驱动程序之间进行选择是我在项目中遇到的第一个困难。当时,我似乎误解了 FS mini 过滤器的工作原理,这可能导致我做出了错误的选择。 (1/2)
  • 通过重新审视 FS 过滤器,我发现可以通过从 preop 例程返回 FLT_PREOP_COMPLETE 来完成一个 I/O 操作(如果我错了)而不是简单地将 I/O 操作传递给下一个过滤器。其次,必须将 FS 过滤器驱动程序附加到卷,但在我的情况下,我需要创建一个虚拟卷。事实是,我不知道怎么做,也不知道在哪里做。这应该在驱动程序中还是在用户应用程序部分中完成?谢谢。 (2/2)
  • 你好,@RainerSchaack。我现在正在尝试部署我的 fs 过滤器驱动程序,但在部署它时遇到了一些问题:Driver Preparation (x86) (possible reboot): Fail。在 VS 中,在部署属性的“驱动程序安装选项”部分,我选择了“安装和验证”,但我不确定它是否是 fs 驱动程序部署的正确选项。你能帮我吗?另外,您能否在我的最后评论中给我一些关于我的其他问题的提示?感谢您的帮助。

标签: windows driver wdk


【解决方案1】:

首先:编写(内核)驱动程序并非易事。如果这不是出于教育目的,我强烈建议向真正的专家寻求商业支持,例如看看https://www.osr.com/custom-development

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

通过重新审视 FS 过滤器,我发现可以通过从 preop 例程返回 FLT_PREOP_COMPLETE 来完成 I/O 操作(如果我错了,请纠正我)而不是简单地传递 I/O 操作到下一个过滤器。

正确

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

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

我能想到这些选项:

如果使用 subst,则映射例如X:到C:\fakepath,在filter里面解析文件名,如果在fake path下面,就可以在filter里面完成I/O了。

我搜索了其他解决方案:

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

也看这里:How to Create a Virtual Windows Drive

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

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

我没有这种 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 属性(过滤器和用户)

配置属性 => 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
  • minispy.sys
  • test.cer

在 Server 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

【讨论】:

  • 非常感谢您提供如此详细的回答。今天,我只快速浏览了您的所有链接和提示,但我发现它们中的大多数应该对我很有帮助。在接下来的几天里,我将更详细地研究所有这些内容,我会再回复你以获取任何精确度。谢谢。
  • 我现在可以做一些事情了。 Minispy 样本帮助很大。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多