2010-04-20 34 views
4

的64位的系統文件的無聲重定向到其32位等效可關斷收歸和Wow64DisableWow64FsRedirection Wow64RevertWow64FsRedirection。我們在我們的應用程序中使用它來進行某些文件身份檢查強制文件重定向在x64用於32位應用程序

問題是,在執行這些任務時,我們可能會調用一個框架或Windows API,隨後調用另一個尚未加載的DLL中的API。如果當時啓用重定向,則可能會加載錯誤版本的dll,導致出現XXX is not a valid Win32 application錯誤。

我已經確定了幾個有問題的API調用,並且我想要做的事情是在該調用期間強制重定向,然後將其恢復 - 僅提供提供的Win32 API的。不幸的是,這些調用並沒有提供像註冊表方法那樣的任何類型的WOW64兼容性標誌。

明顯的選擇是使用Wow64EnableWow64FsRedirection,爲Wow64FsEanbledRedirection傳遞TRUE。然而,關於使用這種方法的警告有很多種,並且注意到它與取代它的禁用/恢復組合方法不兼容。

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

文檔狀態重定向是線程特定的,所以我已經考慮爲特定的調用啓用適當的鎖和等待的新線程,但我希望有一個更簡單的解決方案。

回答

0

因此,我終於去了新的線程路線,結果比預期容易。文檔聲明重定向是線程特定的,因此新線程將始終啓用重定向。

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

爲什麼不使用SHGetKnownFolderPath或SHGetFolderPath並查找FOLDERID_SystemX86/CSIDL_SYSTEMX86以獲取加載DLL的基路徑?這應該讓你獲得獨立於文件系統重定向的正確文件夾。

+0

@afrazier:我們不加載DLL文件,他們正在間接我們呼籲 – 2010-04-20 01:35:15

0

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

+0

感謝山姆的Windows API加載,這正是我試圖完成。但是,如果您仔細閱讀問題描述,則無法執行此操作。 Windows API提供的唯一方法是_disable_和_restore_重定向狀態。 Wow64EnableWow64FsRedirection方法已棄用,不能與禁用/恢復方法混合使用。 – 2010-04-24 09:03:11

+0

好吧,我想我會檢查。也許它只是我錯過了一些東西,但爲什麼不能在你禁用重定向狀態來加載你需要的所有dll之前調用所有的方法,然後啓用重定向來檢查你的dll。正如我所說,我可能不瞭解根本性的東西。 – 2010-04-24 09:21:12

+0

我也試過這個,但遺憾的是通話路徑不夠可預測。 Windows試圖加載的DLL也取決於調用時的應用程序狀態,因此調用它們,比如應用程序啓動可能不會加載所有依賴的DLL。 – 2010-04-24 22:43:53

相關問題