每個核心物件都只是乙個記憶體塊,它由作業系統核心分配,並只能由作業系統核心訪問,這個記憶體塊是乙個資料結構,其成員維護著於物件相關的資訊。少數成員是所有物件都有的,像安全描述符和使用計數等;大多數成員是特有的,像程序物件的程序id,檔案物件的位元組偏移量。
由於核心物件的資料結構只能由作業系統核心訪問,所以應用程式不能再記憶體中定位這些資料結構並直接更改其內容。所以windows提供了一組函式,讓應用程式可以操作這些核心物件,呼叫乙個會建立核心物件的函式後,函式會返回乙個控制代碼,為了讓作業系統知道我們要對那個核心物件進行操作,我們將這個控制代碼傳給各種windows函式就可以了。
核心物件是屬於作業系統的,而不是程序,所以我們在程序中建立了乙個核心物件,然後程序終止,而建立的核心物件在有些情況下(另乙個程序正在使用這個物件)是不會被銷毀的。那麼作業系統怎麼判斷該不該銷毀乙個核心物件呢?
每乙個核心物件都包含乙個使用計數,初次建立的時候這個數為一,再有程序對它訪問時,這個數就加一。相對的,有乙個對它訪問的程序終止,這個使用計數就減一,當這個數為0時系統就自動銷毀這個核心物件。
每個核心物件還有乙個相同的成員,就是安全描述符,安全描述符描述了誰擁有物件(通常誰建立誰擁有),描述了哪些使用者可以訪問或使用該物件。
應用程式除了使用核心物件,還需要使用其他的物件(菜飯,視窗,滑鼠游標等),這些屬於使用者/gdi物件,檢視建立這個物件的函式是區別該物件是使用者/gdi物件還是核心物件最方便的方法。建立核心物件的函式都需要我們傳入乙個安全屬性資訊的引數(psecurity_attributes),而建立使用者/gdi物件的函式就沒有。
在乙個程序初始化時,系統將為它分配乙個只能讓核心物件使用的控制代碼表,它是乙個由資料結構組成的陣列,每乙個資料結構都包含乙個指向核心物件的指標,乙個訪問掩碼和一些標誌。
乙個程序首次初始化時,它的控制代碼表為空,當程序呼叫乙個可以建立核心物件的函式時,這個記憶體塊就會在控制代碼表中記錄,指標成員會被設定成核心物件的資料結構的內部記憶體位址,訪問掩碼將被設定成擁有完全訪問許可權,標誌也會設定。
所有建立核心物件的函式都會返回乙個與程序相關的控制代碼,這個控制代碼可由同乙個程序中執行的所有執行緒使用。
如果呼叫乙個引數中有核心物件的控制代碼時,在內部,這個函式會查詢程序的控制代碼表,獲得該核心物件的位址,如果傳入的控制代碼是無效的,函式失敗getlasterror會返回6.
呼叫函式建立核心物件時,呼叫失敗會返回0,原因可能時系統記憶體不夠,或者遇到了乙個安全問題。
不管用什麼方法建立的核心物件,最後我們都要用closehandle()結束核心物件,該函式首先會檢查控制代碼表,驗證傳入的控制代碼真實存在,如果控制代碼有效,就把「使用計數」遞減。如果使用計數為0,核心物件就被銷毀,並從記憶體中去除。如果控制代碼不存在closehandle函式就返回false,getlasterror函式返回8(指定了無效的控制代碼)。假如沒用closehandle函式也不一定發生洩漏核心物件,在應用程式執行時,可能會發生,但當程序終止執行,系統能保證一切都被正確清除。
windows核心程式設計筆記(一)
1.setwindowredraw 設定視窗的可重繪狀態 這個函式是不是把整個視窗 包括視窗控制項 的和重繪相關的訊號 遮蔽掉了?2.combobox setitemdata 巨集 函式原型 int combobox setitemdata hwnd hwndctl,空間控制代碼 int index...
windows程式設計筆記3
1.imouse getsystemmetrics sm mousepresent 檢查滑鼠是否安裝 cbuttons getsystemmetrics sm cmousebuttons 檢查滑鼠鍵個數 wdnclass.hcursor loadcursor null,idc arrow 指定視窗的...
《Windows核心程式設計》筆記1 核心物件
由於.net framework中很多地方需要用到以前win32中的一些知識點,不了解其中的來朧去脈學習起來會比較吃力,於是準備用點時間補一下windows 核心方面的知識點,參考書本是經典的核心物件是核心分配的乙個記憶體塊,這種記憶體塊是乙個資料結構,表示核心物件的各種特徵。並且只能由核心來訪問。...