日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

作业——Windows核心编程学习手札系列之五

發布時間:2025/4/16 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 作业——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核心编程学习手札系列之五的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。