c# - WinVerifyTrust 返回 0x80092003 - CRYPT_E_FILE_ERROR

标签 c# x86-64 winverifytrust

我正在使用 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 而不是 Program Files x86 下的 dll。所以我按照 Verify digital signature within system32/drivers folder 的答案进行操作并尝试禁用 FS 重定向但它没有帮助。

我很确定问题与重定向有关,因为我

  1. 在“程序文件 (x86)”下创建了 ApplicationToLoad 文件夹的副本 - WinVerifyTrust 返回状态正常

  2. 将我的应用程序编译为 64 位 - WinVerifyTrust 返回状态 OK

更新:

这是禁用重定向的代码:

 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);

最佳答案

我想通了 - 问题是文件路径中有一个额外的空间。并且获取 32 位和 64 位文件路径的代码不同,这就是为什么它在编译为 64 位时无法重现的原因。 所以它与重定向无关......

关于c# - WinVerifyTrust 返回 0x80092003 - CRYPT_E_FILE_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815676/

相关文章:

c# - 方法在应该返回 'true' 时返回 'false'

c - 如何避免多个线程写入共享数组导致缓存行失效?

signtool - WinVerifyTrust 函数需要很长时间才能执行

c# - 在 XML 中选择列表

c# - 将 System.Collections.Generic.SortedList<string,T> 转换为 IEnumerable<T>

c# - 在 C# JSON.NET 中将字符串或对象解析为对象

c - 适用于 Windows 的硬件性能计数器 API

linux - 如何通过内联汇编中的sysenter调用系统调用?

certificate-revocation - 如何仅从 CRL 检查撤销列表?

windows - 什么是信托提供者?