2012-10-10 50 views
3

我正在使用C#.net 3.5並在64位平臺上運行。WinVerifyTrust返回0x80092003 - CRYPT_E_FILE_ERROR

我有一個32位的DLL,我需要動態加載。 該DLL位於「C:\ Program files \ ApplicationToLoad \ Application.dll」

因爲DLL是32位我必須將我的應用程序也編譯爲32位。

在加載DLL之前,我檢查是否使用WinVerifyTrust簽署了dll,但出現錯誤0x80092003 = CRYPT_E_FILE_ERROR =讀取或寫入文件時發生錯誤。

我猜想會發生這種情況,因爲我編譯爲32位,並試圖檢查在Program Files下而不是程序文件x86下的dll。所以我遵循Verify digital signature within system32/drivers folder的答案,並試圖禁用FS重定向,但它沒有幫助。

我敢肯定,這個問題以某種方式相關型號的重定向,因爲我

  1. 「程序文件(x86)」下創建ApplicationToLoad文件夾的副本 - 的WinVerifyTrust返回狀態OK

  2. 編譯我的應用程序到64位 - 返回的WinVerifyTrust狀態OK

UPDATE:

這是代碼的禁用重新定向:

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

文件系統重定向聽起來很可能是麻煩製造者。爲什麼這個DLL存儲在錯誤的文件夾中?發佈禁用重定向的代碼。 –

+0

該DLL不是我的:(我不知道他們爲什麼做了這麼愚蠢的事情...... – user844541

回答

0

我想通了 - 問題是,有一個額外的空間文件路徑。而獲取32位和64位文件路徑的代碼是不同的,這就是爲什麼編譯爲64位時不能重現的原因。 所以它與重定向無關......