我剛剛偶然發現這樣做GetModuleHandle("ntdll.dll")
沒有以前撥打LoadLibrary("ntdll.dll")
工作。Win32應用程序是否自動鏈接到ntdll.dll?
這意味着ntdll.dll
已加載到我的過程中。
可以安全地假設ntdll.dll
將永遠在Win32應用程序中加載,因此不需要撥打LoadLibrary
?
我剛剛偶然發現這樣做GetModuleHandle("ntdll.dll")
沒有以前撥打LoadLibrary("ntdll.dll")
工作。Win32應用程序是否自動鏈接到ntdll.dll?
這意味着ntdll.dll
已加載到我的過程中。
可以安全地假設ntdll.dll
將永遠在Win32應用程序中加載,因此不需要撥打LoadLibrary
?
從MSDN on LoadLibrary()(重點煤礦):
系統維護上的所有加載模塊 每個進程的引用計數。調用LoadLibrary會增加引用計數。調用 FreeLibrary或FreeLibraryAndExitThread函數減少 引用計數。當其參考計數爲 達到零或過程終止時(不管參考計數是多少),系統將卸載該模塊。
換句話說,繼續調用LoadLibrary(),並確保您得到您的句柄ntdll.dll
是安全的 - 但系統將幾乎肯定會撞上一個引用計數,因爲它應該已經被加載。
至於「是否真的總是加載?」,請參見Windows Internals on the Image Loader(簡短答案是肯定的,ntdll.dll
是加載程序本身的一部分並始終存在)。
有關段落是:
圖像裝載機住在用戶模式的系統DLL 的Ntdll.dll而不是在內核庫。因此,它的行爲就像是屬於DLL的標準代碼一樣,並且在內存訪問和安全權限方面受到同樣的限制。是什麼讓這段代碼更加特別是它在運行過程中始終存在的保證(Ntdll.dll始終加載),並且它是在用戶模式下作爲新應用程序的一部分運行的第一部分代碼。 (當系統建立初始上下文時,程序計數器或指令指針被設置爲Ntdll.dll中的初始化函數。)
它是一個實施細節可能會發生變化。你應該*不要直接在ntdll.dll中使用任何東西。但只要你這樣做,如果你正確地做到這一點,微軟只能幫助你。避免LoadLibrary()沒有意義。 –
* ntdll.dll *始終在所有進程中加載。它始終如一,永遠都會肯定 – RbMm
這樣想想...你打電話給GetModuleHandle()。 GetModuleHandle()在kernel32.dll中,所以你的應用程序必須鏈接到它。如果你看看kernel32.dll的依賴關係,你會發現它依賴於ntdll.dll。所以,如果您的應用程序必須加載kernel32,那麼它也必須加載ntdll。但是,作爲任何Win32進程的根源,ntdll應該不會感到意外。 kernel32中有幾個/許多函數是在ntdll函數中進行封裝的。 –