我正在使用 C# .net 3.5 并在 64 位平台上运行。
我有一个需要动态加载的 32 位 dll。dll 位于“C:\Program files\ApplicationToLoad\Application.dll”下
因为 dll 是 32 位的,所以我必须将我的应用程序也编译为 32 位。
在加载 dll 之前,我检查 dll 是否使用 WinVerifyTrust 签名,但我收到错误 0x80092003 = CRYPT_E_FILE_ERROR = 读取或写入文件时发生错误。
我猜这是因为我被编译为 32 位并试图检查 Program Files 下的 dll 而不是 Program Files x86 下的 dll。因此,我遵循了在 system32/drivers 文件夹中验证数字签名的答案,并尝试禁用 FS 重定向,但没有帮助。
我很确定问题与重定向有关,因为我
在“程序文件(x86)”下创建了 ApplicationToLoad 文件夹的副本 - WinVerifyTrust 返回状态正常
将我的应用程序编译为 64 位 - WinVerifyTrust 返回状态正常
更新:
这是禁用重定向的代码:
IntPtr ptr = new IntPtr();
Wow64DisableWow64FsRedirection(ref ptr);
var lStatus = WinVerifyTrust(
IntPtr.Zero,
pGuid,
pData);
Wow64RevertWow64FsRedirection(ptr);
pinvoke 声明:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);