WinVerifyTrust返回0x80092003 - CRYPT_E_FILE_ERROR

时间:2012-10-10 09:03:05

标签: 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下的dll而不是Program Files x86。所以我按照Verify digital signature within system32/drivers folder的答案,尝试禁用FS重定向,但没有帮助。

我很确定这个问题在某种程度上与重定向有关,因为我

  1. 在“program Files(x86)”下创建了ApplicationToLoad文件夹的副本 - WinVerifyTrust返回状态OK

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

  3. 更新

    这是禁用重定向的代码:

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

1 个答案:

答案 0 :(得分:0)

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