Windows核心编程-作业

Windows提供了作业内核对象,允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么,最好将作业对象想象成一个进程容器。作业的创建过程如下:

VOID StartRestrictedProcess(VOID)
{
BOOL bInJob = FALSE;
IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);//判断当前的进程是否在别的作业内核之中
if (bInJob)
{
MessageBox(NULL, _T("Process is already in  a job"), _T(" "), MB_ICONINFORMATION | MB_OK);
return;
}


HANDLE hJob = CreateJobObject(NULL, _T("RestrictedProcessJob"));//创建一个作业内核对象


JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };//设置作业的基本限额
jobli.PriorityClass = IDLE_PRIORITY_CLASS;
jobli.PerJobUserTimeLimit.QuadPart = 10000;
jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME;
SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &jobli, sizeof(jobli));


JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;//设置作业的UI限制
jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_EXITWINDOWS;
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS;
SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir));


STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR szCmdLine[8];
_tcscpy_s(szCmdLine, _countof(szCmdLine), _T("CMD"));
BOOL bResult = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);//创建CMD进程
AssignProcessToJobObject(hJob, pi.hProcess);//将进程放到该作业当中
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);


HANDLE h[2];
h[0] = pi.hProcess;
h[1] = hJob;
DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);
switch (dw - WAIT_OBJECT_0)
{
case 0:
_tprintf(_T("The process has terminated\n"));
break;
case 1:
_tprintf(_T("All of the jobs allocated CPU time was used\n"));
break;
default:
break;
}


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


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

}


运行效果如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值