Принудительное перенаправление файлов на x64 для 32-битного приложения - PullRequest
4 голосов
/ 20 апреля 2010

Бесшумное перенаправление 64-разрядных системных файлов на 32-разрядные эквиваленты можно отключить , отключить и вернуть с помощью Wow64DisableWow64FsRedirection и Wow64RevertWow64FsRedirection. Мы используем это для определенных проверок личности файлов в нашем приложении.

Проблема заключается в том, что при выполнении некоторых из этих задач мы могли бы вызвать каркас или API Windows, который впоследствии вызывает другой API в DLL, которая еще не была загружена. Если перенаправление включено в это время, может быть загружена неправильная версия библиотеки DLL, что приведет к ошибке XXX is not a valid Win32 application.

Я определил несколько рассматриваемых вызовов API, и что я хотел бы сделать, чтобы принудительно включить перенаправление на время этого вызова, а затем вернуть его обратно - просто напротив предоставленных Win32 API. , К сожалению, эти вызовы не предоставляют какой-либо флаг совместимости с WOW64, как это делают некоторые методы реестра.

Очевидная альтернатива - использовать Wow64EnableWow64FsRedirection, передать TRUE для Wow64FsEanbledRedirection. Однако существует множество предупреждений об использовании этого метода и отмечается, что он не совместим с комбинированными методами Disable / Revert, которые его заменили.

Существует ли безопасный способ принудительного перенаправления на для вызова Win32 без ограничений?

В документации указано, что перенаправление зависит от потока, поэтому я рассмотрел возможность создания нового потока для конкретного вызова с соответствующими блокировками и ожиданиями, но я надеялся на более простое решение.

Ответы [ 3 ]

0 голосов
/ 23 апреля 2010

удар в темноте. Не могли бы вы включить перенаправление, вызвать все необходимые методы API, но проигнорировать результаты. Это загрузит все соответствующие библиотеки. Затем отключите перенаправление и повторите вызовы методов, используя результаты на этот раз?

0 голосов
/ 25 апреля 2010

Итак, я наконец выбрал новый путь потока, который оказался проще, чем предполагалось. В документе указано, что перенаправление зависит от потока, поэтому перенаправление всегда будет включено в новом потоке.

var t = new Thread(() => 
    SafeNativeMethods.LoadLibraryExW("NTMARTA.DLL", IntPtr.Zero, 0) );
t.Start();
t.Join();
0 голосов
/ 20 апреля 2010

Почему бы не использовать SHGetKnownFolderPath или SHGetFolderPath и найти FOLDERID_SystemX86 / CSIDL_SYSTEMX86, чтобы получить базовый путь для загрузки библиотек DLL? Это должно дать вам правильную папку независимо от перенаправления файловой системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...