簡體   English   中英

對於32位應用程序,在x64上強制文件重定向

[英]Forcing file redirection on x64 for a 32-bit application

可以通過Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection 關閉還原 64位系統文件到其32位等效文件的靜默重定向。 我們將其用於應用程序中的某些文件身份檢查。

問題在於,在執行其中的某些任務時,我們可能會調用框架或Windows API,隨后會在尚未加載的DLL中調用另一個API。 如果在那時啟用了重定向,則可能會加載錯誤版本的dll,導致XXX is not a valid Win32 application錯誤。

我已經確定了幾個有問題的API調用,我想在該調用期間執行重定向操作,然后將其還原-與提供的Win32 API 相反 不幸的是,這些調用沒有像某些注冊表方法那樣提供任何WOW64兼容性標志。

顯而易見的替代方法是使用Wow64EnableWow64FsRedirection,為Wow64FsEanbledRedirection傳遞TRUE。 但是,有關使用此方法的警告多種多樣,並請注意,該方法與替換該方法的“禁用/還原”組合方法不兼容。

有沒有一種安全的方式來強制重定向對於給定的Win32調用?

文檔指出重定向是特定於線程的,因此我考慮過使用適當的鎖和等待為特定的調用擴展一個新線程,但是我希望有一個更簡單的解決方案。

在黑暗中刺傷。 您可以打開重定向,調用所需的所有API方法,但是忽略結果。 這將加載所有相關的dll。 然后關閉重定向並重做方法調用,這次使用結果嗎?

所以我終於走上了新的線程路線,事實證明這比預期的要容易。 文檔指出重定向是特定於線程的,因此新線程將始終啟用重定向。

var t = new Thread(() => 
    SafeNativeMethods.LoadLibraryExW("NTMARTA.DLL", IntPtr.Zero, 0) );
t.Start();
t.Join();

為什么不使用SHGetKnownFolderPath或SHGetFolderPath並查找FOLDERID_SystemX86 / CSIDL_SYSTEMX86來獲取加載DLL的基本路徑? 那應該獲得正確的文件夾,而不依賴於文件系統重定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM