我是Windows设备驱动程序的新手。我的当前任务是使用现有的32位minifilter驱动程序并将其移植到64位Windows。我的开发环境是Windows 7/64位,Visual Studio 2012 Ultimate,DDK 7600.16385.1和SDK 7.1A。安装包是使用InstallShield 2013创建的setup.exe。
我在porting drivers to 64 bit找到了一些文档,但它完全是关于代码问题的。我还没能找到一本白痴指南,里面有关于你可能要改变的其他一切的逐步说明,所以我决定采取天真的尝试 - 看看 - 什么 - 发生方法,只是重新编译为64位,一个例外是代码签名,因为我确实读过Win64需要签名驱动程序的地方。
使用DDKBuild.cmd的驱动程序项目的预先存在的构建,我已修改Win64平台的属性以在构建命令行上指定../scripts/build.cmd -WNETAMD64 free $(OutDir)
。编译和链接成功。我修改了InstallShield项目以引入签名的64位代码文件而不是32位代码。
安装似乎在64位系统(Win2008 R2)上成功运行。这是一个在安装过程中运行的双线脚本:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 .\xxxxxflt.inf
fltmc load xxxxxflt
我们应用程序的其余部分实际上是Java,它对一些DLL进行了一些JNI调用,其中一个调用FilterLoad()
。 (顺便说一句,JVM和DLL仍然是32位,但我的理解是32位代码应该能够通过FilterLoad()加载64位驱动程序。如果我错了,请纠正我。)从FilterLoad返回()是ERROR_FILE_NOT_FOUND,这使我注意到,如上所述,xxxxxxflt.sys文件已被复制到SysWOW64 \ drivers而不是System32 \ drivers。
我知道这是错的,因为Win64是对面的,所以System32应该是64位的东西,而SysWOW64应该是32位的东西。我不知道的是它为什么会在那里结束。 .inf文件中是否需要进行更改才能将其识别为64位驱动程序?我可能需要在InstallShield项目中做些什么来告诉它构建64位安装程序或在64位引擎中运行脚本?脚本是否必须执行某些操作才能强制使用64位版本的rundll32?还有别的吗?
答案 0 :(得分:1)
我还没有看到这个具体的问题,但我对这类" WOW64"之前的事情。它通常意味着您的软件中有一些32位的东西并且正在该模式下运行,因此您所做的任何事情都将在a" Program Files(x86)"或" WOW64"类型位置。以下是我认为可能会发生的事情:
这可能与您调用rundll32.exe的方式有关。请参阅以下帖子:
rundll32.exe equivalent for 64-bit DLLs
如果您的InstallSheild安装正在创建32位可执行文件,那么它可能已经在WOW模式下运行,这意味着它可能选择了WOW目录中的rundll32.exe,因此你的装置也会在那里结束。
您可能会考虑修改脚本以根据平台调用特定的脚本,或者查看是否可以将InstallShield更改为在非WOW64模式下作为64位应用程序运行。