[問題] DLL只有一個執行個體?

看板CSSE作者 (dick901)時間12年前 (2012/07/05 14:50), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
小弟我在網路上搜尋的許久,結果都顯示了DLL可以節省記憶體的使用,多個執行序可 以同時使用單一DLL來共用記憶體裡DLL的單一複本。也就是說一個執行序一但載入了 一個DLL,那個DLL就不必再次載入記憶體,就算其他的執行序呼叫LoadLibrary()等 函數載入該DLL檔,也只是把計次變數+1,並不會做重複載入DLL的動作,直到執行 序退出,或者使用VirtualFree等函數,才會將該DLL檔從記憶體卸載。(以上是小弟 我的理解,不知道有沒有錯) 但是,今天我寫了一個小程式他會HOOK"User32.dll"裡面的FindWindowExW()函數, 使用Inline Hook的方法,將該API的開頭5個BYTES改成JMP XXXXXXXX,其中XXXXXXXX 是與我自己寫的HOOK函數偏移,照剛剛的邏輯,是否我HOOK了一次FindWindowExW函數, 然後所有載入User32.dll的程序,裡面的FindWindowExW函數的開頭,都被我更改了呢? 為了驗證,我又寫了一個小程式,裡面載入了User32.dll,並且讓兩個程式同時運行, 然後使用OllyDbg分別載入兩個程式,觀察FindWindowExW的開頭,發現兩個程式的 FindWindowExW函數並不相同,一個受到了我的更改,另一個則是維持原狀是 mov edi,edi push ebp... 請問這是甚麼原因?是我在DLL檔的機制上理解有錯誤,還是我在系統記憶體的管理 理解上有錯誤?希望各位高手提點一下!!謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.224.65.226
文章代碼(AID): #1FzJa_Pb (CSSE)
文章代碼(AID): #1FzJa_Pb (CSSE)