这类似于为作业内的每一个进程调用TerminateProcess,将所有退出代码设为uExitCode。
下边是一个windows核心编程中的一段事例代码---StartRestrictedProcess函数, 该函数将一个进程放入一个作业中,以限制此进程具体能够做那些事情,如下所示:
void StartRestrictedProcess() //我的博客:http://blog.csdn.net/windows_nt { //检查进程是否已经在某一个作业中,如果已经加入某个作业,将不能再加入其他作业中。 BOOL bInJob = FALSE; //IsProcessInJob(GetCurrentProcess(), NULL, &bInJob); if (bInJob) { MessageBox(GetActiveWindow(), _T("Process already in a job"), NULL, MB_ICONINFORMATION | MB_OK); return; } //创建作业 HANDLE hjob = CreateJobObject(NULL, _T("Wintellect_RestrictedProcessJob")); //为作业中的进程设置一些限制 //限制1,基本限额 JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 }; //设置进程只有在CPU空闲时运行 jobli.PriorityClass = IDLE_PRIORITY_CLASS; //设置作业使用CPU的时间不能超过1秒。 jobli.PerJobUserTimeLimit.QuadPart = 10000; //以上两项是我们为作业中的进程设置的限制。 jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME; //将限制添加到作业中 SetInformationJobObject(hjob, JobObjectBasicLimitInformation, &jobli, sizeof(jobli)); //限制2,基本的UI限制 JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir; jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE; // A fancy zero //设置作业中的进程不能注销windows。 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; BOOL bUIInfo = SetInformationJobObject(hjob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir)); if(bUIInfo) { printf(_T("UI限制设定成功\n")); } //启动新的进程,并添加到作业中 //进程的线程必须初始化为暂停(suspended),以保证进程不能在作业外执行任何代码 STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; TCHAR szCmdLine[8]; strcpy(szCmdLine, _T("CMD")); BOOL bResult = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); //将创建的进程加入到作业中,注意,若此进程新建其他的子进程,新建的子进程自动加入作业中。 AssignProcessToJobObject(hjob, pi.hProcess); ResumeThread(pi.hThread); //现在我们可以让新建的进程执行代码了 CloseHandle(pi.hThread); //等待进程终止或为作业分配的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: printf(_T("进程终止\n")); break; case 1: printf(_T("分配给CPU的作业时间用完\n")); break; } PILETIME CreationTime; PILETIME ExitTime; PILETIME KernelTime; PILETIME 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); //Clean up properly CloseHandle(pi.hProcess); CloseHandle(hjob); }
我再提供一个比较复杂,比较实用点的程序,下边这个程序用vc6.0编译的话需要配置SDK环境(想配置SDK环境的可参考我上一篇"windows核心编程学习-查看系统中的错误代码的含义"中有简单的介绍),我是在配置好的前提下编写的程序。不想麻烦的话,也可以直接用vs2010等版本直接打开,即可编译通过。
本篇文章的真正核心在下边的事例程序,上边的只是一些简单的介绍
http://download.csdn.net/detail/windows_nt/5407067