国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Windows核心編程(第五版)筆記 第二十章 DLL高級技巧 (DLL Advanced...

第二十章 DLL高級技巧

1.概覽

 1.1動態(tài)加載DLL文件 LoadLibraryEx

                HMODULE LoadLibraryEx(

PCTSTR pszDLLPathName,

HANDLE hFile,

DWORD dwFlags);

              返回DLL加載到進程空間原首地址。

              dwFlags 可以有以下幾個值

              (1) DONT_RESOLVE_DLL_REFERENCES

                              建議永遠不要使有這個值,它的存在僅僅是為了向后兼容、

                              更多內容請訪問:http://blogs.msdn.com/oldnewthing/archive/2005/02/14/372266.aspx

              (2) LOAD_LIBRARY_AS_DATAFILE

                              把要加載的DLL文件以數(shù)據(jù)文件的形式加載到進程中。

                              GetModuleHandleGetProcAddress返回NULL

              (3) LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE

                              與前者相同,不同的時獨占打開,禁止其它進程訪問和修改該DLL中的內容。

              (4) LOAD_LIBRARY_AS_IMAGE_RESOURCE

                              不修改DLL中的RVA,以image的形式加載到進程中。常與LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE一起使用。

              (5) LOAD_WITH_ALTERED_SEARCH_PATH

                              修改DLL的加載路徑

 1.2 DLL的加載與卸載

              (1)加載

                              不要在同一進程中,同時使用LoadLIbraryLoadLibraryEx加載同一DLL文件。

                              DLL的引用計數(shù)是以進程為單位的。LoadLibrary會把DLL文件加載到內存,然后映射到進程空間中。

                              多次加載同一DLL只會增加引用計數(shù)而不會多次映射。當所有進程對DLL的引用計數(shù)都為0時,系統(tǒng)會在內存中釋放該DLL

              (2)卸載

                              FreeLibrary,FreeLibraryAndExitThread對當前進程的DLL的引用計數(shù)減1

              (3) GetProcAddress

                              取得函數(shù)地址。它只接受ANSI字符串。

2.DLL的入口函數(shù)

                2.1 DllMain

              BOOL WINAPI DllMain(

              HINSTANCE hInstDll, ""加載后在進程中的虛擬地址

              DWORD fdwReason, ""系統(tǒng)因何而調用該函數(shù)

              PVOID fImpLoad ""查看是隱工還是動態(tài)加載該DLL

 

              DLLsDllMain方法來初始化他們自已。DllMain中的代碼應盡量簡單,只做一些簡單的初始化工作。

              不要在DllMain中調用LoadLibrary,FreeLibraryShell, ODBC, COM, RPC, socket 函數(shù),從而避免不可預期的錯誤。

 

                2.2 fdwReason的值

               (1)DLL_PROCESS_ATTACH

               系統(tǒng)在為每個進程第一次加載該DLL時會,執(zhí)行DLL_PROCESS_ATTACH后面的語句來初始化DLL,DllMain的返回值僅由它決定。

 系統(tǒng)會忽略DLL_THREAD_ATTACH等執(zhí)行后DllMain的返回值。

               如果DllMain返回FALSE,系統(tǒng)會自動調用DLL_PROCESS_DETACH的代碼并解除DLL文件中進程中的內存映射。

               

               (2)DLL_PROCESS_DETACH

                              如果DLL是因進程終止而卸載其在進程中的映射,那么負責調用ExitProcess的線程會調用DllMainDLL_PROCESS_DETACH所對應的代碼。

                              如果DLL是因FreeLibraryFreeLibraryAndExitThread,而卸載其在進程中的映射,

那么FreeLibraryFreeLibraryAndExitThread會負責調用DllMainDLL_PROCESS_DETACH所對應的代碼。

                              如果DLL是因TerminateProcess而卸載其在進程中的映射,系統(tǒng)不會調用DllMainDLL_PROCESS_DETACH所對應的代碼。

              (3) DLL_THREAD_ATTACH

                              若進程是先加載的DLL,后創(chuàng)建的線程

                                              那么在進程中創(chuàng)建新線程時(主線程除外),系統(tǒng)會執(zhí)行該進程已載的所有DLLDllMainDLL_THREAD_ATTACH對應的代碼。

                              若進程是先創(chuàng)建的線程,后加載的DLL

                                              那么系統(tǒng)不會調用DLLDllMain中的代碼。

              (4) DLL_THREAD_DETACH

                              進程中的線程退出時,會先執(zhí)行所有已加載DLLDllMainDLL_THREAD_DETACH所對應的代碼。若該代碼中有死循環(huán),線程不會退出。

             

 2.3 同步化DllMain的調用

              同一時間只能有一個線程調用DllMain中的代碼,所以下面的代碼會導致死循環(huán)

BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad) {

 

   HANDLE hThread;

   DWORD dwThreadId;

 

   switch (fdwReason) {

   case DLL_PROCESS_ATTACH:

      // The DLL is being mapped into the process' address space.

 

      // Create a thread to do some stuff.

      hThread = CreateThread(NULL, 0, SomeFunction, NULL,

         0, &dwThreadId);// CreateThread DLL_THREAD_ATTACH中的代碼,但是由于當前線程并未執(zhí)行完畢,

//所以DLL_THREAD_ATTACH 中的代碼不會被執(zhí)行,且CreateThread永無不會返回。

 

      // Suspend our thread until the new thread terminates.

      WaitForSingleObject(hThread, INFINITE);

 

      // We no longer need access to the new thread.

      CloseHandle(hThread);

      break;

 

   case DLL_THREAD_ATTACH:

      // A thread is being created.

      break;

 

   case DLL_THREAD_DETACH:

      // A thread is exiting cleanly.

      break;

 

   case DLL_PROCESS_DETACH:

      // The DLL is being unmapped from the process' address space.

      break;

   }

   return(TRUE);

}

 

3.延時加載DLL

(1)延時加載DLL的限制

              延時加載是指當程序在運行時用到DLL中的函數(shù)時自動會自動加載DLL函數(shù),它與動態(tài)加載不同。

              http://msdn2.microsoft.com/en-us/library/yx1x886y(VS.80).aspx

 

4.已知的DLL (Known DLLs)

              位置:HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Control"Session Manager"KnownDLLs

              LoadLibrary在查找DLL會先去該位置查找有無相應的鍵值與DLL要對應,若有則根據(jù)鏈值去%SystemRoot%"System32加載鍵值對應的DLL

              若無則根據(jù)默認規(guī)去尋找DLL

 

5.Bind and Rebase Module

              它可以程序啟動的速度。ReBaseImage

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
DLL高級技術2
《Windows核心編程系列》二十談談DLL高級技術
關于dll的一些事
Inside DllMain
DLL木馬的寫法
DllMain詳解
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服