作业——Windows核心编程学习手札系列之五
作業
——Windows核心編程學習手札系列之五
Windows提供作業內核對象,可以將進程組合在千毫 ,并創建一個“沙框”以便限制進程能夠進行的操作。作業可視為進程的容器,windows98不支持作業的操作。創建作業內核對象的函數是Handle CraeteJobObject(PSECURITY_ATTRIBUTES psa,PCTSTR pszName);與其他內核對象一樣,第一個參數將安全信息與作業對象關聯起來,并告訴系統是否使返回的句柄成為可繼承的句柄;第二個參數是給對象命名,便于另一個進程通過函數HANDLE OpenJobObject(DWORD dwDesiredAccess,BOOL bInheritHandle,PCTSTR pszName)進行訪問;如不再訪問代碼中的作業對象,通過調用CloseHandle來關閉它的句柄。
進程創建后,通常需要設置“沙框”,限制其只能進行一定范圍內的限制,對作業可以加上如下一些類型的限制:基本限制和擴展基本限制,用于防止作業中的進程壟斷系統的資源;基本的UI限制,用于防止作業中的進程改變用戶界面;安全性限制,用于防止作業中的進程訪問保密資源(文件、注冊表子關鍵字等)。調用函數
HANDLE SetInformationJobObject(HANDLE hJob,
JOBOBJECTINFOCLASS jobObjectInformationClass,
PVOID pJobObjectInformation,
DWORD cbJobObjectInformationLength),可以給作業加上各種限制。
第一個參數用于標識要限制的作業,第二個參數是枚舉類型,用于指明要使用的限制類型,第三個參數包含限制設置值的數據結構的地址,第四個參數指明該結構的大小。一旦作業設置了條件,可以通過函數
BOOL QueryInformationJobObject(HANDLE hJob,
?????????? JOBOBJECTINFOCLASS JobObjectInformationClass,
?????????? PVOID pvJobObjectInformation,
?????????? DWORD cbJobObjectInformationLength,
?????????? PDWORD pdwReturnLength)查詢已設置的限制。要為該函數傳遞作業的句柄,包括用于指明限制信息的枚舉類型、函數初始化的數據結構地址、以及包含該結構的數據塊大小,最后一個參數告訴你有多少字節將放入緩存。
函數BOOL AssignProcessToJobObject(HANDLE hJob,HANDLE hProcess)用于告訴系統將進程(由hProcess標識)視為現有作業(由hJob標識)的一部分。該函數只運行將尚未被賦予任何作業的進程賦予給一個作業。一旦一個進程成為一個作業的組成部分,就不能轉到另一個作業,并且不能是無作業的進程,此外當作為作業一部分的進程生成另一個進程時,新進程將自動成為父作業的組成部分。要撤消作業中的進程,需要調用BOOL TerminateJobObject(HANDLE hJob,UINT uExitCode)函數,類似為每個進程調用TerminateProcess函數,將它們所有退出代碼設置為uExitCode。
下面的代碼演示了創建作業并設置基本和UI兩種設置,并將CMD進程加入到沙框,具體代碼如下:
#define? _WIN32_WINNT? 0x0500
#include <Windows.h>
void?? StartRestrictedProcess(void)????
{??
?????? //Create?? a?? job?? kernel?? object.?
?????? HANDLE?? hjob?? =?? CreateJobObject(NULL,NULL);??
??????
?????? //Place?? some?? restrictions?? on?? processes?? in?? the?? job.??
?????? //First,set?? some?? basic?? restrictions.??
?????? JOBOBJECT_BASIC_LIMIT_INFORMATION?? jobli?? =?? {?? 0?? };??
?????? //The?? process?? always?? runs?? in?? the?? idle?? priority?? class.?
?????? jobli.PriorityClass?? =?? IDLE_PRIORITY_CLASS;??
??????
?????? //The?? job?? cannot?? use?? more?? than?? 1?? second?? of?? CPU?? time.??
?????? jobli.PerJobUserTimeLimit.QuadPart?? =?? 10000000;??????
?????? //1?? sec?? in?? 100-ns?? intervals
??????
?????? //These?? are?? the?? only?? 2?? restrictions?? I?? want?? placed?? on?? the?? job?? (process).
?????? jobli.LimitFlags?? =?? JOB_OBJECT_LIMIT_PRIORITY_CLASS?? |????
????????????????????????????????????????????? JOB_OBJECT_LIMIT_JOB_TIME;??
??????
?????? SetInformationJobObject(hjob,????
????????????? JobObjectBasicLimitInformation,????
????????????? &jobli,?? sizeof(jobli));??
??????
?????? //Second,?? set?? some?? UI?? restrictions.
?????? JOBOBJECT_BASIC_UI_RESTRICTIONS?? jobuir;??
?????? jobuir.UIRestrictionsClass?? =?? JOB_OBJECT_UILIMIT_NONE;?
?????? //A?? fancy?? zero??
??????
?????? //The?? process?? can't?? log?? off?? the?? system.??
?????? jobuir.UIRestrictionsClass?? |=?? JOB_OBJECT_UILIMIT_EXITWINDOWS;
?????? //The?? process?? can't?? access?? USER?? objects????
?????? //(such?? as?? other?? windows)?? in?? the?? system.?
?????? jobuir.UIRestrictionsClass?? |=?? JOB_OBJECT_UILIMIT_HANDLES;?
??????
?????? SetInformationJobObject(hjob,JobObjectBasicUIRestrictions,????
???????????? ?&jobuir,?? sizeof(jobuir));
??????
?????? //Spawn?? the?? process?? that?? is?? to?? be?? in?? the?? job.??
?????? //Note:?? You?? must?? first?? spawn?? the?? process?? and?? then?? place?? the?? process?? in??
?????? //the?? job.?? This?? means?? that?? the?? process's?? thread?? must?? be?? initially??
??? //suspended?? so?? that?? it?? can't?? execute?? any?? code?? outside????
??? //of?? the?? job's?? restrictions.?
?????? STARTUPINFO?? si?? =?? {?? sizeof(si)?? };?
?????? PROCESS_INFORMATION?? pi;??
?????? CreateProcess(NULL,?? "CMD",?? NULL,?? NULL,?? FALSE,????
????????????? CREATE_SUSPENDED,?? NULL,?? NULL,?? &si,?? &pi);??
??? //Place?? the?? process?? in?? the?? job.??
??? //Note:if?? this?? process?? spawns?? any?? children,the?? children?? are??? ?
??? //automatically?? part?? of?? the?? same?? job.??
??? AssignProcessToJobObject(hjob,pi.hProcess);??
???
??? //Now?? we?? can?? allow?? the?? child?? process's?? thread?? to?? execute?? code.??
??? ResumeThread(pi.hThread);??
??? CloseHandle(pi.hThread);??
???
??? //Wait?? for?? the?? process?? to?? terminate?? or?? for?? all?? the?? job's????
??? //allotted?? CPU?? time?? to?? be?? used.??
??? HANDLE?? h[2];??
??? h[0]?? =?? pi.hProcess;??
??? h[1]?? =?? hjob;??
??? DWORD?? dw?? =?? WaitForMultipleObjects(2,h,FALSE,INFINITE);??
??? switch(?? dw-WAIT_OBJECT_0?? )????
??? {
?????? case?? 0:??
????????????? //The?? process?? has?? terminated...
????????????? printf("the process has terminated!");
????????????? break;
?????? case?? 1:??
????????????? //All?? of?? the?? job's?? allotted?? CPU?? time?? was?? used...??
????????????? printf("CPU time has used!");
????????????? break;??
?????? }??
??? //Clean?? up?? properly.??
??? CloseHandle(pi.hProcess);??
??? CloseHandle(hjob);??
}??
?
?
int main(int argc, char* argv[])
{
?????? //printf("Hello World!/n");
?????? StartRestrictedProcess();??
?????? return 0;
}
??????????????? 如非???????? 2008-12-15
總結
以上是生活随笔為你收集整理的作业——Windows核心编程学习手札系列之五的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内核对象——Windows核心编程学习手
- 下一篇: 线程基础知识——Windows核心编程学