《Windows核心編程》——五 作業

前言

    Windows提供了一個作業(job)內核對象,它允許我們將進程組合在一起並創建一個“沙箱”來限制進程能夠做什麼。最好把作業對象想象成一個進程容器。但是,創建只包含一個進程的作業同樣非常有用,因爲這樣可以對進程施加平時不能施加的限制。

    如果進程已與一個作業關聯,就無法將當前進程或者它的任何子進程從作業中去除。這個安全特性可以確保進程無法擺脫對它的限制。

    關閉一個作業對象,不會迫使作業中的所有進程都終止運行。作業對象實際只是加了一個刪除標記,只有在作業中的所有進程都已經終止運行之後,纔會自動銷燬。關閉作業的句柄會導致所有進程都不可訪問此作業,即使這個作業仍然存在。

 

5.1 對作業中的進程施加限制(SetInformationJobObject)

    創建好一個作業之後,接着一般會根據作業中的進程能夠執行哪些操作來建立一個沙箱(即施加限制)。可以向作業應用施加以下幾種類型的限制:

    a. 基本限額和擴展基本限額,用於防止作業中的進程獨佔系統資源

    b. 基本的UI限制,用於防止作業中的進程更改用戶界面

    c. 安全限額,用於防止作業內的進程訪問安全資源(文件、註冊表子項等)

 

5.2 將進程放入作業中(AssginProcessToJobObject)

    在我們創建子進程之後且允許它運行之前,必須調用該函數顯示地將進程放入到一個作業中。該函數只允許將尚未分配給任何作業的一個進程分配給一個作業。一旦進程已經屬於作業的一部分,它就不能再移動到另外一個作業中,也不能成爲所謂”無業的“。另外當作業中的一個進程生成了另一個進程的時候,新進程將自動成爲父進程所屬於的作業的一部分。但可以一些方式改變該種行爲。

 

5.3 終止作業中所有的線程(TerminateJobObject)

    該函數類似於爲作業中的每一個進程調用TerminateProcess,將所有退出代碼設爲uExitCode。

    可以通過調用QueryInformationJobObject來查詢作業當前的限制,也可以用它來獲得作業的統計信息,還可以用它來同時查詢基本統計信息和I/O統計信息。

    對於那些不屬於任何作業的進程,我們可以使用GetProcessIoCounters函數來獲得未放入作業的那些進程的信息。

 

5.4 作業通知

    我們有時很想知道作業中的所有線程在何時終止運行,或者所有已分配的CPU時間是否已經到期,還想知道作業內部何時生成了一個新的進程,或者作業中的進程何時終止運行?

   

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章