winston 发表于 2012-3-17 22:49:19

《Windows核心编程》学习笔记(10)– Job

1.Windows提供了一个作业(job )内核对象,它允许你将进程组合在一起并创建一个“沙箱”来 限制进程能够做什么。最好将作业对象想象成一个进程容器。但是,即使作业中只包含一个进程,也是非常有用的,因为这样可以对进程施加平时不能施加的限制。
例程:#include <iostream> #include <string> #include <windows.h> #include <tchar.h>using namespace std; int _tmain(int argc, _TCHAR* argv[]) {    //询问一下当前进程是否已在作业中   BOOL bInJob;    IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);    if(bInJob)    {          wcout << TEXT("currecnt process is already in Job!") << endl;          system("PAUSE");          return 0;    }    //为作业设一些安全限制,可设置的条件相当之多和复杂   JOBOBJECT_BASIC_LIMIT_INFORMATION jbli = {0};    jbli.PriorityClass = IDLE_PRIORITY_CLASS;    jbli.PerJobUserTimeLimit.QuadPart = 1000;    JOBOBJECT_BASIC_UI_RESTRICTIONS jbur;    jbur.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE|          JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_HANDLES;    //创建一个作业   HANDLE hJob = CreateJobObject(NULL, TEXT("SomeJob"));    //把安全限制和作业关联起来   SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &jbli, sizeof(jbli));    SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &jbur, sizeof(jbur));    //创建进程,并把之加入作业中   STARTUPINFO si = {sizeof(si)};    PROCESS_INFORMATIONpi;    TCHAR cmd[] = TEXT("NOTEPAD");    if( CreateProcess(NULL, cmd, NULL, NULL, FALSE,         CREATE_SUSPENDED | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi) )    {          AssignProcessToJobObject(hJob, pi.hProcess);          ResumeThread(pi.hThread);          CloseHandle(pi.hThread);          //等待作业或进程结束,再进行统计         HANDLE hdls[] = { pi.hProcess, hJob };          DWORD dwCondition = WaitForMultipleObjects(sizeof(hdls) / sizeof(HANDLE), hdls, FALSE, INFINITE);          switch(dwCondition - WAIT_OBJECT_0)          {          case 0:            //do something here             break;          case 1:             //do something here             break;          }          FILETIME CreationTime, ExitTime, KernelTime, UserTime;          GetProcessTimes(pi.hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime);          wcout << TEXT("Kernel = ") << KernelTime.dwLowDateTime / 1000 << " and User = "             << UserTime.dwLowDateTime / 10000 << endl;          CloseHandle(pi.hProcess);    }    CloseHandle(hJob);    system("PAUSE");    return 0; }

2. 创建好一个作业之后,接着一般需要限制作业中的进程能做的事情;换言之,现在要设置 一个“沙箱”。
可以通过调用以下代码向作业应用限制:
BOOL SetInformationJobObject( HANDLE hJob, JOBOBJECTINFOCLASS JobObjectInformationClass, PVOID pJobObjectInformation, DWORD cbJobObjectInformationSize);

第一个参数指定要限制的作业。第二个参数是一个枚举类型,指定了要应用的限制的类型。第 三个参数是一个数据结构的地址,数据结构中包含了具体的限制设置。第四个参数指出此数据 结构的大小(用于版本控制)。



另外的API内容有:1.         对作业中的进程进行限制。用SetInformationJobObject函数,参数复杂,详细的就见书或MSDN吧。2.         终止作业,TerminateJobObject函数。3.         查询统计信息,QueryInformationJobObject。4.         和完成端口结合进行使用。

页: [1]
查看完整版本: 《Windows核心编程》学习笔记(10)– Job