(a)DllB靜態連結DllA
(b)DllB在DllMain裡呼叫DllA的一個函式A1()
(c)DllA在DllMain裡呼叫LoadLibrary("DllB.dll")
分析:當執行到DllA中的DllMain的時侯,DllA.dll已經被對映到程序地址空間中,已經加入到了module list中。當它呼叫LoadLibrary("DllB.dll")時,首先會呼叫LdrpMapDll把DllB.dll對映到程序地址空間,並加入到InLoadOrderModuleList中。然後會呼叫LdrpLoadImportModule(...)載入它引用的DllA.dll,而 LdrpLoadImportModule會呼叫LdrpCheckForLoadedDll檢查是否DllA.dll已經被載入。 LdrpCheckForLoadedDll會在雜湊表LdrpHashTable中查詢DllA.dll,而顯然它能找到,所以載入DllA.dll這一步被成功調過。
(a)DllB靜態連結DllA
(b)DllB在DllMain裡呼叫DllA的一個函式A1()
(c)DllA在DllMain裡呼叫LoadLibrary("DllB.dll")
分析:當執行到DllA中的DllMain的時侯,DllA.dll已經被對映到程序地址空間中,已經加入到了module list中。當它呼叫LoadLibrary("DllB.dll")時,首先會呼叫LdrpMapDll把DllB.dll對映到程序地址空間,並加入到InLoadOrderModuleList中。然後會呼叫LdrpLoadImportModule(...)載入它引用的DllA.dll,而 LdrpLoadImportModule會呼叫LdrpCheckForLoadedDll檢查是否DllA.dll已經被載入。 LdrpCheckForLoadedDll會在雜湊表LdrpHashTable中查詢DllA.dll,而顯然它能找到,所以載入DllA.dll這一步被成功調過。