WinVerifyTrust возвращает 0x80092003 - CRYPT_E_FILE_ERROR
Я работаю на 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-разрядную и пытаюсь проверить DLL, которая находится в Program Files, а не Program Files x86. Поэтому я последовал за ответом в разделе Проверка цифровой подписи в папке system32/drivers и попытался отключить перенаправление FS, но это не помогло.
Я совершенно уверен, что проблема передается как-то на перенаправление, потому что я
создал копию папки ApplicationToLoad в папке "Program Files (x86)" - WinVerifyTrust вернул статус OK
Скомпилировал мое приложение на 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);
1 ответ
Я понял это - проблема была в том, что в пути к файлу было дополнительное место. и код получения пути к файлу в 32-битной и 64-битной системах был другим, поэтому он не воспроизводился при компиляции в 64-битную версию. так что это не имеет ничего общего с перенаправлением...