控制代碼和偽控制代碼

2021-05-25 02:19:30 字數 1718 閱讀 5649

控制代碼的由來:

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

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

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

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

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

getcurrentprocess()函式返回的是乙個偽控制代碼,其實就是$ffffffff。「偽控制代碼」相當於當前程序實控制代碼的標示。也就是說你在程序中使用這個"偽控制代碼", 那麼程式底層它就知道你要用的是當前程序的控制代碼,那麼它就會去使用當前程序的控制代碼。從避免了使用實控制代碼的一些麻煩,如要呼叫closehandle()等。

但是某些時候你需要用到程序的真實控制代碼,比如你要講這個程序控制代碼傳給其他程序去使用(例子如下),這時候就需要使用duplicatehandle()進行轉化。因為如果你傳的是"偽控制代碼",那麼程式底層又認識你要用的是當前程序的控制代碼。例如:

這樣不正確的,應該如下處理:

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

在系統中,物件分兩類:核心物件和使用者物件.如程序物件,執行緒物件,檔案對映物件等就是核心物件;而向視窗,選單等都是使用者物件.

兩者是有差別的,用於標示使用者物件的控制代碼是系統唯一的,也就是說,乙個程序完全可以對另外乙個程序中的使用者物件進行操作,比如兩個程序間通訊的方法之一,就是傳送訊息.正是由於視窗是使用者物件,所以控制代碼是系統唯一,通過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核心程式設計 控制代碼和偽控制代碼

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