1. 程式人生 > >轉:System32與SysWOW64的關係

轉:System32與SysWOW64的關係

有時候人們懷疑一個系統的底層結構能否保證這個系統在被使用時達到安全而高效,64位版本的Windows在這方面就比較完美。Windows XP和Windows Server 2003都是執行64位硬體的64位版本作業系統。64位Windows作業系統執行64位程式碼,同時通過使用WoW64(Windows on Windows 64)也能執行32位程式碼。   你看,這並不是什麼大問題,畢竟,32位版本的不同Windows作業系統都用來同時執行32位和16位程式碼。(技術上說,並不是同時執行,相關解釋在以後的技巧中會展示給大家)   32位版本的Windows在如何允許32為和16位程式碼並肩執行方面有著很複雜的機制。然而,這個系統被設計成無論你是系統管理員還是臨時使用者,你都不需要知道這些機制如何執行。   但是64位版本的Windows就不同了。從一個使用者的立場上看,64位應用程式和32位應用程式簡單地同時執行,沒有什麼特殊的。但是對於一個管理員(和幫助桌面使用者的人員)來說,這其中就有很大不同了:32位程式碼與64位程式碼相隔離。這個隔離是如此重要以至於64位版本的Windows有兩個登錄檔,一個是針對64位,一個是針對32位。   儘管64位版本的Windows XP和Windows Server 2003看起來在操作時候和它們32位的版本幾乎同樣的,但是在表象之下其實是有很大不同的。如果你在64位版本的Windows下按照32位版本一樣來執行某些程式,你可能引起一些麻煩。   DLL 存放到何處?   64位應用程式的第一條規則是:你絕對不能把32位和64位程式碼混和在同一個應用程式內。如果你有一個64位應用程式,所有與這個應用程式相關的東西,包括

DLL檔案,必須是64位的。這就有一個有趣的挑戰,因為有時候很多應用程式都依靠一個共同的DLL檔案。幸運的是,Windows保持32位的DLL檔案和64位的DLL檔案處於隔離狀態。   如果你檢視一下在32位作業系統內的\Windows資料夾,你會發現兩個子目錄:一個名為SYSTEM,還有一個名為SYSTEM32。SYSTEM目錄是Windows 3.x遺留下來的,用來保持Windows的對一些舊的應用程式的向下相容性。一般說來,16位的DLL檔案(以及其它的支援檔案)被存放在\Windows\System資料夾裡,32位DLL檔案和不同支援檔案被存放在\Windows\System32資料夾裡。   32位版本的Windows保持16位和32位DLL檔案的方式是非常簡單的,但是64位版本的Windows保持64位和32位DLL檔案的方式就不這麼簡單了。 理論上說,微軟將要建立一個名為\Windows\System64的資料夾來用其存放64位DLL檔案,但是取而代之的是,微軟建立了一個新的名為
SysWOW64
的資料夾來存放32位的DLL檔案。第一眼看起來,讓人感覺這個資料夾應該存放64位應用程式的,但是注意,32位應用程式本來應該存放它們的DLL檔案到\Windows\System32資料夾裡面。   \Windows\System32資料夾在64位版本的Windows內仍然存在。但是微軟使用這個資料夾做為64位DLL的倉庫,而不是32位DLL檔案的。我不清楚微軟使用\Windows\System32資料夾來存放64位DLL的原因,但是我聽說這麼做是為了向下相容性。   那麼是不是所有32位應用程式該存放它們的DLL檔案到\Windows\System32資料夾呢?這又讓事情變得混亂。   如我之前所提及的,32位程式碼不能預設在64位版本的Windows內執行。為了執行32位的應用程式,Windows使用
WOW64
 emulator,來讓這些應用程式還認為它們在32位版本的Windows內執行。   當你安裝一個32位的應用程式,安裝嚮導通過WOW64 emulato執行。32位和64位程式碼並不混和。一旦一個應用程式(包括一個安裝嚮導)從WOW64 emulator開始執行,它必須接著在WOW64內繼續執行。這意味著當你安裝一個應用程式,安裝嚮導並不知道這個程式被安裝到64位版本的Windows內,並且和它執行在32位作業系統一樣把DLL檔案寫到\Windows\System32資料夾裡面。   當然,WOW64知道安裝嚮導通過emulator來執行的32位應用程式。同時也知道64和32位程式碼不能混合在一起。所以,WOW64 emulator 給\Windows\SysWOW64建立一個別名。這意味著任何時候32位應用程式要寫入到\Windows\System32資料夾或者從\Windows\SysWOW64資料夾讀取,WOW64 emulator都能使其改道到\Windows\SysWOW64資料夾。   所有這些都意味著如果你需要手動操作\Windows\System32資料夾內的內容,你可能要非常的麻煩。我最近了解到一個管理員需要安裝一些小的支援指令碼到一個已經安裝的應用程式,這個指令碼的指導上說明這些指令碼需要被存放到\Windows\System32資料夾。當然這些指令碼的說明假定這個應用程式是在32位作業系統上執行的。   這些指令碼沒有引起系統崩潰。然而Windows給人幻想永遠不用進行更新。當管理員執行應用程式,它將被改道到\Windows\SysWOW64資料夾。管理員知道他自己把這些指令碼放到\Windows\System32資料夾並且能通過Windows瀏覽器看到這些指令碼,但是不能指出為什麼應用程式不能看到這些指令碼。考慮到這個問題是和許可權相關的,他花費了一些時間來研究這個,所以知道了關於64位版本的Windows儲存DLL檔案隔離的方法,所以他能夠把這些指令碼放到\Windows\SysWOW64資料夾。   64位版本的Windows對於一個管理員來說,瞭解底層系統結構非常重要。

---------------------------------------------------------------------------------------------------------------------

本人問題:拷貝指令碼把dll拷貝到system32,發現自動到了SysWOW64!

有點無語,最後把dll放在自己程式目錄下了,沒有在撕這個問題。