核心物件的含義:
核心物件就是類似符號物件、事件物件、檔案物件、檔案對映物件、
i / o完成埠物件、作業物件、信箱物件、互斥物件、管道物件、程序物件,信標物件、執行緒
物件和等待計時器物件等
關於核心物件的注意點:
1.核心物件是核心而不是程序所擁有的
2.由於第1點的原因,核心物件的生存週期可能比建立他的程序週期還要長(只要核心的引用計數還沒變為0),舉個例子,我在某個程序a裡建立了乙個名字為」aa」的互斥量,程序b裡建立了乙個名為」aa」的互斥量,請記住,當第二次呼叫createmutex函式時,只是在該物件的引用計數上加1,當程序a退出,aa的計數從2變為1,當然不會退出,自然生存週期要比程序a要長
3.除了核心物件之外還有其他的物件比如gdi物件,使用者物件(選單,視窗,滑鼠游標,字型,刷子等等),如何區分建立的物件是核心物件呢,看其建立函式中有沒有安全屬性
4.由於核心物件的資料結構只能被核心訪問,因此應用程式無法在記憶體中找到這些資料結構並直接改變它們的內容,microsoft規定了這個限制條件,目的是為了確保核心物件狀態結構的一致
5.由於第4點引發第5點,怎樣操作核心物件呢,那好我給你一根繩子去牽著這個物件,從計算機的角度來說,這根繩子就是控制代碼,將控制代碼傳遞給windows函式就可以,那麼這裡舉個例子
通過createfile產生乙個檔案控制代碼hfile,那怎樣再檔案裡寫入內容呢,當然是使用writefile
控制代碼的含義:
核心物件是核心所擁有的,但是控制代碼確實與程序密切相關的,如果將程序a裡的某個控制代碼值傳遞給另外乙個程序中的執行緒,則這個執行緒所做的所有呼叫都可能失敗
這麼說大家可能不是很清楚
每個程序都有乙個核心物件的控制代碼表,該控制代碼表只用於核心物件而不用於使用者物件或者gdi物件,控制代碼的含義沒有明確的解釋,可能解釋為在表中的索引或者是其他值,但是可以確定的是通過這個值可以檢索到控制代碼的位置進而檢索到核心物件的位置,
當把這個控制代碼值傳遞給執行緒2的時候,由於這個控制代碼並不在核心物件中,所以當執行緒2對控制代碼進行操作時,由於在控制代碼表找不到該控制代碼,就有可能造成呼叫失敗
在這裡我們講下為什麼createthread之後要立馬呼叫closehandle關閉執行緒控制代碼,因為createthread之後,執行緒核心物件的引用計數是2,乙個是執行緒本身在引用核心物件,乙個是建立該執行緒的執行緒在引用核心物件,如果不關掉乙個計數,則執行緒結束後執行緒物件的引用計數為1,核心物件依然不會被銷毀
closehandle並不會結束執行緒或者程序,只是讓引用計數減1,另外還會清除控制代碼表裡的相關控制代碼
通過getcurrentthread也會得到當前的執行緒控制代碼,但是這個控制代碼是偽控制代碼,在控制代碼表中無法找到這個控制代碼,所以此時呼叫closehandle來關閉這個控制代碼,就會失敗
建立核心物件的函式有個例外,createfile失敗之後返回的不是null,而是invalid_handle_value(-1)
《Windows核心程式設計》筆記1 核心物件
由於.net framework中很多地方需要用到以前win32中的一些知識點,不了解其中的來朧去脈學習起來會比較吃力,於是準備用點時間補一下windows 核心方面的知識點,參考書本是經典的核心物件是核心分配的乙個記憶體塊,這種記憶體塊是乙個資料結構,表示核心物件的各種特徵。並且只能由核心來訪問。...
複習 windows物件管理(1)核心物件組織結構
好久沒來了!最近在整理以前的一些筆記,也希望把以前學過但沒記下來的東西補全,於是這是新一輪複習的第一篇。一 一些概念 xp下核心物件的布局結構如下 由低到高 object quota info object handle info object name info object creater in...
核心物件執行緒同步 信標核心物件
信標核心物件用於對資源進行計數。乙個使用數量 乙個是最大資源數量 用於標識信標能夠控制的資源的最大數量 乙個是當前資源數量 用於標識當前可以使用的資源的數量 如果當前資源的數量大於0,則發出信標訊號。如果當前資源數量是0,則不發出信標訊號。系統決不允許當前資源的數量為負值。當前資源數量決不能大於最大...