windows內核初識--2

1.進程內核對象

進程的定義:一個內核對象+一個地址空間。

進程與線程 :

  • 進程是惰性的,從來不做事。全部事情讓線程做
  • 進程可以有一個或多個線程。
  • 進程一啓動就自動創建一個線程,這個線程稱爲主線程。
  • 單CPU多線程同步運行,操作系統會輪詢調度給每個線程調度時間,從而營造“併發”運行假象。多CPU則可以實現真正併發。

2.進程實例句柄

任何加載到進程地址空間中的可執行文件或者DLL文件都被賦予了一個實例句柄。 在Windows中有很多需要傳入moudle的函數: DWORD WINAPI  GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename,  DWORD nSize  );

如何獲得hModule句柄?

1.WinMain(HINSTACE  hInstan, …),main函數第一個參數就是當前進程的實例句柄.

2.傳入NULL獲取當前進程文件的全路徑。

3.通過HMODULE GetModulehandle(PTCTSTR pszMoudle)獲取加載到進程中的dll句柄。

4.通過函數地址獲得當前module句柄 :

BOOL WINAPI GetModuleHandleExW(DWORD    dwFlags, LPCWSTR ModuleName, HMODULE* phModule ); 在dwFlags傳入GET_MODULE_HANDLE_EX_FLAG_FROM_ADRESS標識,將當前函數地址作爲第二個參數傳入,即可獲得當前鏈接庫module.

3.進程命令行和環境變量

系統在創建進程時,會傳一個命令行給進程,該命令行幾乎總是非空的。

第一個標記總是用於創建該進程的可執行性文件名稱。許多類型的應用程序會忽略該標記後傳給主函數。例如C運行庫執行GUI程序時。

可以通過GetCommoandLine()函數獲取命令行,我們可以通過命令行實現進程間的通信。

進程環境變量

進程都有與之關聯的環境塊,由該進程分配的內存,用於存儲環境變量,如下字符串:

用戶登錄Windows時,系統會創建外殼程序,並將一組環境字符串與之關聯,主要通過如下注冊表讀取: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment HKEY_CURRENT_USER\Environment

修改電腦環境變量生效:

增加或改動環境變量,爲了保證更改對所有應用程序生效,需要註銷重新登錄。

部分進程(資源管理器、任務欄等)可以接受WM_SETTINGCHANGE消息,可以發送該消息是指立即生效,如下: SendMessage(HWND_BROADCAST, WM_SETTINGCHAGE,0,TEXT(“Environment”))

進程環境變量的繼承與修改

通常,子進程會集承父進程的環境變量,不過也可以在創建子進程時指定繼承的環境變量。 我們平時創建的應用程序都是外殼進程的子進程,因此自動繼承了“我的電腦的環境變量”。

因爲環境變量是在進程內部分配的內存,因此我們可以再進程中修改環境變量,而不影響器父進程,windows函數如下: SetEnvironmentVariable(PTSCTR pszName, PCTSTR pszValue);

可以增加、修改或刪除某個環境變量的值,刪除時將pszValue設爲NULL。

4.進程驅動器和目錄

當前驅動器和目錄:

操作系統內部記錄着一個進程的當前驅動器和目錄,可以通過GetCurrentDirectorySetCurrentDirectory()兩個函數獲取和設置當前目錄。

進程的當前目錄:

系統記錄着進程的當前驅動器和目錄,但是未記錄各個驅動器的當前目錄。

其通過進程的環境變量記錄,例如一個進程可以有如下環境變量:

=C:=C:\Program Files =D:=D:\Aaa

上面表明進程在C盤下的當前目錄爲\Program Files,在D盤下的當前目錄Aaa 。

舉例: 當前進程當前目錄爲C:\Program Files,而我們調用CreateFile打開D:1.txt,那麼系統就會查找環境變量=D:,如果該環境變量存在,且是Aaa那麼就嘗試打開D:\Aaa\1.txt,如果不存在該環境變量或不打開失敗則嘗試打開D盤根目錄下的1.txt文件。

設置或獲得指定盤符的當前目錄

GetFullPathName(“C:”, MAX_PATH, szDir, NULL);

通過設置環境變量值或c運行庫函數_chdir(),設置指定盤符的當前目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章