Windows核心程式設計之一

2021-08-13 17:32:31 字數 1562 閱讀 5268

作業系統核心是指大多數作業系統的核心部分。它由作業系統中用於管理儲存器、檔案、外設和系統資源的那些部分組成。作業系統核心通常執行程序,並提供程序間的通訊。

核心物件

每個核心物件都只是乙個記憶體塊,它由作業系統核心分配,並只能由作業系統核心訪問。這個記憶體塊是乙個資料結構,其成員維護著與物件相關的資訊。少數成員(安全描述符和使用計數器等)是所有物件都有的,但其他大多數成員都是不同型別的物件特有的。

使用計數

作業系統核心知道當前有多少個程序正在使用乙個特定的核心物件,因為每個物件都包含乙個使用計數(usage count)。初次建立乙個物件的時候,其使用計數被設為1,另乙個程序獲得對現有核心物件的訪問後,使用計數就會遞增。程序終止執行後,作業系統核心將自動遞減此程序仍然開啟的所有核心物件的使用計數,如果一旦物件的使用計數變成0,作業系統核心就會銷毀該物件。

核心物件的安全性

核心物件可以用乙個安全描述符(security descriptor,sd)來保護。安全描述符描述了誰擁有物件,哪些組和使用者被允許訪問或使用物件,哪些組和使用者被拒絕訪問此物件。用於建立核心物件的所有函式幾乎都有指向security_atttributes結構的指標作為引數,大多數應用程式只是為了這個引數傳入null,這樣建立的核心物件具有預設的安全性,具體包括哪些預設的安全性,要取決於當前程序的安全令牌(security token)。

建立乙個核心物件

乙個程序在初始化時,系統將為它分配乙個控制代碼表(handle table)。這個控制代碼表僅供核心物件使用。

程序的控制代碼表的結構 索引

指向核心物件記憶體塊的指標

訪問掩碼標誌1

0x????????

0x????????

0x????????

20x????????

0x????????

0x????????

...

乙個程序首次初始化的時候,其控制代碼表為空。當程序內的乙個執行緒呼叫乙個會建立核心物件的函式時,核心將為這個物件分配並初始化乙個記憶體塊。然後核心掃瞄程序的控制代碼表,查詢乙個空白的記錄項,對其進行初始化。具體地說,指標成員會被設定成核心物件的資料結構的內部記憶體位址,訪問掩碼將被設定成擁有完全訪問許可權,標誌也會設定。

用於建立核心物件的任何函式都會返回乙個與程序相關的控制代碼,這個控制代碼可由同乙個程序中執行的所有執行緒使用。系統用索引來表示核心物件的資訊儲存在程序控制代碼表中的具體位置,要得到實際的索引值,控制代碼值實際應該除以4(或右移兩位,以忽略windows作業系統內部使用的最後兩位)。

呼叫乙個函式時,如果它接受乙個核心物件控制代碼作為引數,就必須把create*函式返回的值傳給它。在內部,這個函式會查詢程序的控制代碼表,獲得目標核心物件的位址,然後以一種恰當的方式來操縱物件的資料結構。

關閉核心物件

無論以什麼方式建立核心物件,我們都要呼叫closehandle向系統表明我們已經結束使用物件,如下

bool closehandle(handle hobject);

在內部,該函式首先檢查主調程序的控制代碼表,驗證「傳給函式的控制代碼值」標識的是「程序確實有權訪問的乙個物件」。如果控制代碼是有效的,系統就將獲得核心物件的資料結構的位址,並將結構中的「使用計數」成員遞減。如果使用計數變成0,記憶體物件將被銷毀,並從記憶體中去除。

windows核心程式設計之核心物件

由於不是計算機科班出身,一直對於程序和執行緒沒有深入的了解,現開始看windows核心程式設計,將具體內容整理一下,以加深印象。1 核心物件,即作業系統維護的乙個資料結構,內部維護該物件的各種資料資訊,常見的核心物件有 用於建立程序的程序核心物件,用於建立執行緒的執行緒核心物件,建立檔案的檔案核心物...

windows核心程式設計之程序 1

我對程序的理解,由於程序是不活潑的,活潑的是程序裡面的執行緒。所以,程序相當於乙個容器,只有裡面有東西 執行緒 該容器才有存在的必要,如果裡面的東西用光了 執行緒全部終止執行 瓶子就被 程序的位址空間就被系統 或重新分配給新的程序 多工搶占式作業系統 每個程序都有執行緒,每個執行緒都有自己的cpu暫...

windows核心程式設計之程序 3

獲取系統版本的函式 getversion返回乙個dword型別的值,高子返回ms dos版本號,低字返回windows版本號 本來按照邏輯來說應該是低字的高位元組返回windows的主版本號,低位元組返回此版本號,但是編寫該 程式設計師犯了乙個小錯誤,主版本號和次版本號的位置弄反了,高位元組返回次版...