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

看板CSSE (電腦科學及軟體工程)作者 (inevitable......)時間12年前 (2012/07/07 01:22), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《dick901 (dick901)》之銘言: : 小弟我在網路上搜尋的許久,結果都顯示了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檔的機制上理解有錯誤,還是我在系統記憶體的管理 : 理解上有錯誤?希望各位高手提點一下!!謝謝!! DLL的存在 是為了 1.把共用的部份抽出 讓程式本身在硬碟上佔據空間少一點 2.程式庫更新方便 有新的改動換dll就好 像Win32 API那種dll 避免直接link進你的程式有這些好處 loading dll的時候 是載入到各自的process address space 當你改了process A中的user32.dll 這時不同的OS有時候有不同的做法 在Windows上 OS會進行copy on write 這樣一來 只要process沒有去改load進來的dll的code section 在physical memory中其實都還是同一塊 但當你一改 就不再共用了 所以才會發生你的狀況 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.169.153.177 ※ 編輯: jackace 來自: 1.169.153.177 (07/07 01:32)

07/09 22:58, , 1F
感謝您的指導!終於搞懂了!
07/09 22:58, 1F
文章代碼(AID): #1FznxFvb (CSSE)
討論串 (同標題文章)
文章代碼(AID): #1FznxFvb (CSSE)