jjzjj

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

coder 2024-06-16 原文

我正在开发一个应用程序,它需要管理(访问、创建、写入、读取)远程服务器上的文件,并将存储作为虚拟驱动器/卷装载到计算机上的指定位置(例如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项目生成的初始代码,
第二个显示了我的测试的当前状态(但是,我做了很多小测试(没有一个成功),我不能在这里列出所有的测试)。
有人能帮我解决这个问题吗?我花了很多时间在这上面,我真的被卡住了。
谢谢你的帮助,
纪尧姆

最佳答案

第一:编写(内核)驱动程序不是一件容易的事情。如果这不是为了教育目的,我强烈建议向真正的专家寻求商业支持,例如查看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:\ fake path,然后在筛选器中解析文件名,如果文件名在伪路径下,则可以在筛选器中完成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操作。根据驱动程序的性质,filter可以是log、observate、modify,甚至prevent。文件系统筛选器驱动程序的典型应用程序包括防病毒实用程序、加密程序和分层存储管理系统。”
其他一些有价值的信息:
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、服务器2008R2…)上的筛选器驱动程序进行签名。如果你想在“正常”系统上安装这样的驱动程序,必须购买正式的驱动程序证书。出于开发和测试的目的,您可以将系统设置为“测试模式”,在该模式下可以使用自签名证书(无需正式证书或注册)
第一个示例驱动程序
有一些来自微软的示例驱动程序,可以作为起点。我可以建议从迷你型过滤器开始。
先决条件
Visual Studio 2013版
Windows驱动程序工具包8.1(WDK 8.1)http://www.microsoft.com/en-us/download/details.aspx?id=42273
迷你源代码(https://code.msdn.microsoft.com/windowshardware/Minispy-File-System-97844844
建造
开放式迷你解决方案
有一些已定义的配置。由于要在Windows Server 2008 R2上安装驱动程序,因此在此处设置“Win7版本”。
然后右键单击解决方案资源管理器中的解决方案并选择配置管理器
从配置管理器中,选择活动解决方案配置:
Win 7发布版
右侧,在“活动解决方案平台”下设置为x64
可选地:
迷你复制属性(过滤器和用户)
配置属性=c/c++=>代码生成=运行时库:
从多线程dll更改为多线程(静态链接)
优点:无需将msvcr120.dll安装到目标系统
构建解决方案
在接下来的步骤中,需要三个文件:
MySISPy\C++Field\x64 \Wi7Read
MIXISPY.EXE(MimISP\C++\\\x64 \Wi7Read)
MimISPY.IF(MimISPIC\C++)
将这些文件复制到一个目录中
Visual Studio 2013=>Visual Studio工具=>VS2013 x64本机工具命令提示
CD到包含文件的目录

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

编辑minispy.inf
换行
驱动服务器=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:
迷你猫
微小的
微型潜艇
小精灵
塞尔
在服务器2008 R2上:
要加载驱动程序,服务器必须进入“测试模式”。
命令提示符(以管理员身份运行)
bcdedit.exe -set TESTSIGNING ON

重新启动
重新启动后,右下方将显示“测试模式”
进口检验证书
启动“certmgr”
选择受信任的根证书颁发机构
主菜单=>操作=>所有任务=>导入…
选择test.cer
将所有证书放入以下存储区:受信任的根证书颁发机构
安装筛选器驱动程序
在Windows资源管理器中,选择minispy.inf,右键单击=>install
(您只看到一个简短的闪烁,没有“成功类型”消息)
在命令提示中:
fltmc load minispy

如果没有看到消息,则说明驱动程序已成功加载。
要检查驱动程序是否已加载,可以使用
fltmc

将显示所有加载的筛选器驱动程序
对于第一次测试:
minispy /a c: /f: log.txt

按回车键启动命令模式。在那里,您可以输入exit

关于windows - 创建Windows驱动程序以访问网络存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050551/

有关windows - 创建Windows驱动程序以访问网络存储的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  3. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  9. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  10. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

随机推荐