Windows核心物件控點的繼承小總結

來源:互聯網
上載者:User

物件控點的繼承

 

跨進程邊界共用核心對象有三種常用的機制:為對象命名、複製物件控點,還有就是使用物件控點繼承。

 

Windows支援“物件控點的繼承”,而不是支援對象的繼承。(這裡順帶總結一下,核心對象本質上是一個記憶體塊,是作業系統核心分配,並只能由作業系統核心訪問。而控制代碼標識了所建立的核心對象,與進程相關。控制代碼的值大概可以認為是進程控制代碼表的一個索引值,標識核心對象在進程控制代碼表中的位置。進程控制代碼表,可以想像成一個由資料結構組成的數組。)

為了使用物件控點的繼承,需要做兩步工作。

第一步:建立一個可繼承的控制代碼,父進程必須分配並初始化一個SECURITY_ATTRIBUTES結構,並將並結構的一個成員bInheritHandle賦值為TRUE,並將該結構的地址傳給具體的Create函數。(將結構成員的bInheritHandle設為TRUE僅表示,該核心對象是可以繼承的,子進程可不可以繼承,還有看第二步的CreateProcess的調用參數)

 

第二步:由父進程產生子進程,這是通過調用CreateProcess函數,並往bInheritHandles參數傳TRUE。該值向系統資料表明,子進程可以繼承父進程控制代碼表中“可繼承的控制代碼”。(“可繼承的控制代碼”指的是,第一步中將成員bInheritHandle設為TRUE的對象。)

 

綜上所述就是:SECURITY_ATTRIBUTES結構的成員bInheritHandle僅決定自身在父進程建立子進程的可繼承性,其最終的是否會被繼承,還參照父進程在CreateProcess調用中bInheritHandles。因為這一個參數決定,子進程是否有繼承父進程“資產”的資格。如果連資格的木有的話,那些可以被他繼承的資產就木有什麼意義了。哈,寫到這裡,我突然想到一個比較重口味的比喻:A的老爸死了,正常來說,A可以繼承他老爸的財產(可繼承的對象的控制代碼),但是他老爸的老婆,他是不可以繼承的(不可繼承的對象的控制代碼)。現在來考慮另外一種情況,那就是A的老爸在死之前寫了遺囑,讓A不能繼承他的任何東西(CreateProcess中的bInheritHandles為FALSE),那麼A不能從他的老爸那裡得到任何東西。

 

如果想更加好地理解這兩個bInheritHandle的作用,可以參考《Windows核心編程 5th》P88的程式,那裡就很好的說明的這一種機制。而且還詳細說明了CreateProcess調用中psaProcess、psaThread的作用。

 

PS:上面大部分取自書中原話,小部分自己總結,一家之言,若有錯漏,請前輩朋友們指出,謝謝。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.