windows核心编程-将进程放入Job

本文介绍如何使用Windows作业对象来限制进程资源使用,包括创建作业、添加进程、设置资源限制及UI限制等步骤,并提供了一个完整的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 作业对象的基本方法
1、调用CreateJobObject创建一个作业
2、调用AssignProcessToObject方法可以将进程添加到作业对象中
3、调用TerminateJobObject方法可以将作业对象中所有的进程全部关闭
4、在需要时还可以通过OpenJobObject方法打开一个特定名称的作业对象的句柄
1、通过SetInformationJobObject向作业中施加限制

自己学习的参考视频: 点击打开链接

BOOL WINAPI SetInformationJobObject(
  _In_ HANDLE             hJob,   //指定要限制的作业
  _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,  //枚举类型,即要施加限制的类型
  _In_ LPVOID             lpJobObjectInfo, //数据结构的地址
  _In_ DWORD              cbJobObjectInfoLength //数据结构的大小
);





2、JOBOBJECT_BASIC_LIMIT_INFORMATION结构体

typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  LARGE_INTEGER PerProcessUserTimeLimit;
  LARGE_INTEGER PerJobUserTimeLimit;
  DWORD         LimitFlags;
  SIZE_T        MinimumWorkingSetSize;
  SIZE_T        MaximumWorkingSetSize;
  DWORD         ActiveProcessLimit;
  ULONG_PTR     Affinity;
  DWORD         PriorityClass;
  DWORD         SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;


#include<windows.h>
#include<tchar.h>
#include<Strsafe.h>
/*
这个函数实现,将进程放入作业(job)中,以限制此进程具体能够做哪些事情
*/
void StartRectrictedProcess()
{
	BOOL bInJob = FALSE;
	IsProcessInJob(GetCurrentProcess(),NULL,&bInJob); //验证当前进程是否在一个现有的作业控制下工作,第二个参数是hJob,NULL默认当前进程
	if (bInJob)
	{
		MessageBox(NULL,L"Process is in Job!",TEXT(""),MB_ICONINFORMATION | MB_OK);
		return;
	}
	HANDLE hJob = CreateJobObject(NULL,TEXT("Wintellect_RestrictedProcessInJob"));//创建一个job句柄,第一个参数为安全描述符

	JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = {0};//First set some basic restrictions
	jobli.PriorityClass = IDLE_PRIORITY_CLASS;  //此优先级表示进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断

	jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME;

	jobli.PerJobUserTimeLimit.QuadPart = 10000; //job不能运行超过1s的CPU时间
	SetInformationJobObject(hJob,JobObjectBasicLimitInformation,&jobli,sizeof(jobli));

	JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir; //Second set some ui restrictions
	jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE; //初始0
	jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS; //process can't log off the windows
	jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;//不允许其他用户访问

	SetInformationJobObject(hJob,JobObjectBasicUIRestrictions,&jobuir,sizeof(jobuir));

	STARTUPINFO si = {sizeof(si)};
	PROCESS_INFORMATION pi;
	TCHAR szCmdLine[8];
	_tcscpy_s(szCmdLine,_countof(szCmdLine),TEXT("CMD"));

	BOOL bResult = CreateProcess(NULL,szCmdLine,NULL,NULL,FALSE,CREATE_SUSPENDED | CREATE_NEW_CONSOLE,NULL,
		NULL,&si,&pi);

	//把进程装入Job中
	AssignProcessToJobObject(hJob,pi.hProcess);

	//让子进程执行代码
	ResumeThread(pi.hThread);
	CloseHandle(pi.hThread);

	//等待进程结束或者所有JOB的CPU时间耗尽
	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 terminate
		break;
	case 1:
		//All of the job's allotted CPU time was used
		break;
	}

	FILETIME CreationTime;
	FILETIME ExitTime;
	FILETIME KernelTime;
	FILETIME UserTime;

	TCHAR szInfo[MAX_PATH];
	GetProcessTimes(pi.hProcess,&CreationTime,&ExitTime,&KernelTime,&UserTime);
	StringCchPrintf(szInfo,_countof(szInfo),
		TEXT("Kernel=%u | User=%u\n"),KernelTime.dwLowDateTime/1000,UserTime.dwLowDateTime/1000);
	MessageBox(GetActiveWindow(),szInfo,TEXT("Restricted Process times"),MB_ICONINFORMATION | MB_OK);

	CloseHandle(pi.hProcess);
	CloseHandle(hJob);
}


int _tmain()
{
	StartRectrictedProcess();
	_gettchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值