Windows核心程式設計 控制代碼和偽控制代碼

2022-09-08 07:21:09 字數 1858 閱讀 2593

getcurrentprocess(), duplicatehandle()

window中為什麼會有控制代碼的概念:

從visual c++的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標:typedef void* handle;

但是這並不說明任何問題,因為控制代碼遠遠不只是指向任意資料型別的指標。它是指向資料物件指標的指標。控制代碼的使用**於早期的windows,當時它只能在有限記憶體的機器中允許(因為當時記憶體昂貴也儲存小)。為了留出足夠的空間記憶體以執行其他程式,windows經常將物件在記憶體中移動。但是如果程序已經有了指向該物件的指標,移動該物件就將使得指標無效。

為了處理這一問題,microsoft使用系統指標以跟蹤物件。程式不是直接使用指標,而是使用控制代碼,讓它引用包含真實物件的位址。通過這一方法,windows可以安全按照需要移動物件,然後更新參考中的指標,從而允許程序安全地訪問物件。

當程序需要使用控制代碼訪問物件時,它呼叫globallocl()以鎖定記憶體的物件。這時windows將返回物件的實際位址,從而程序可以安全讀寫該物件。只要物件被程序鎖定,windows就不會去移動它。控制代碼包含的不只是物件的位址;比如,它還包含鎖計數器,標識著多少程序已經請求過物件的位址。只要這個鎖計數器大於0,windows就不會移動該物件。

這個思想擴充套件到大部分物件上,包括檔案,也由其控制代碼標識。

這時,控制代碼就是指向物件的指標,而該物件包含指向另乙個物件的指標。這對於現在的機器有些奇怪。當windows從單個分時共享程式向多工作業系統轉變時,有如此之多的遺留**需要在新的作業系統上執行,於是控制代碼在這一轉變中保留下來了。 

getcurrentprocess():

getcurrentprocess得到得到的稱之為"偽控制代碼"

只是乙個標識,你可以發現,其實就是返回$ffffffff,

每個程序得控制代碼都是一樣

得,只是實用於程序內部得使用.

如果你想得到實際得控制代碼,在程序間進行通訊,必需要進行轉化,

呼叫duplicatehandle,注意,得實控制代碼使用完成以後,你必須要呼叫closehandle去關閉.

其實,你應該明白了為何"偽控制代碼"得存在,就是使用簡單,不用關閉,

不會造成記憶體洩漏.

同樣道理,getcurrentthread也是偽控制代碼,其值永遠是$fffffffe,只是適用於執行緒內部得使用.

duplicatehandle() :

在系統中,物件分兩類:核心物件和使用者物件.如程序物件,執行緒物件,檔案對映

物件等就是核心物件;而向視窗,選單等都是使用者物件.

兩者是有差別的,用於標示使用者物件的控制代碼是系統唯一的,也就是說,乙個程序

完全可以對另外乙個程序中的使用者物件進行操作,比如兩個程序間通訊的方法之一,

就是傳送訊息.正是由於視窗是使用者物件,所以控制代碼是系統唯一,通過findwindow(),

得到另外乙個程序的視窗控制代碼,然後用sendmessage(),讓hwnd的視窗過程來處理消

息,實現了程序間的通訊.因此,對於使用者物件,你根本不用duplicatehandle(),直接

把控制代碼拿來用就行了.

而核心物件則不一樣.核心物件是為了加強系統的穩定性,因此,

核心物件控制代碼是

程序相關的,在每乙個程序中都有乙個核心物件表,每乙個物件的索引(不完全是)作為內和物件的控制代碼,從而實現程序相關.同乙個物件在不同的程序中可能有不同的索引,即控制代碼.對核心物件進行操作時,系統還要進行安全檢驗,看一下你是否有權來操作這個物件.因此你不能同使用者物件一樣,直接把控制代碼拿過來用.比方說,你想操作另乙個程序中的檔案對映物件,這個檔案對映物件控制代碼在那個程序中假設是0x000001,但在你的程序中,很有可能0x00000001時表示另乙個核心物件,此時的操作就永遠不會成功,甚至會產生災難性的後果.此時,就有必要用duplicatehandle().

Windows核心程式設計 控制代碼和偽控制代碼

getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...

Windows核心程式設計 控制代碼和偽控制代碼

getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...

windows核心程式設計 核心物件和控制代碼洩漏

1 什麼是核心物件?核心物件是作業系統分配的乙個記憶體塊,該記憶體塊是乙個資料結構,用於管理物件的各種資訊。當應用程式要與系統裝置進行互動的時候,將使用到核心物件,出於安全的考慮,程序是不能直接訪問核心物件的,作業系統提供了對應的函式來對它們進行訪問。訪問符號物件 事件物件 檔案物件 作業物件 互斥...