注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

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

2010-10-13 21:56:34|  分类: 《Windows核心编 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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_INFORMATION  pi; 

     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); 


第一个参数指定要限制的作业。第二个参数是一个枚举类型,指定了要应用的限制的类型。第 

三个参数是一个数据结构的地址,数据结构中包含了具体的限制设置。第四个参数指出此数据 

结构的大小(用于版本控制)。

2010年10月13日 - fly - 天嗎荇箜


另外的API内容有:

1.         对作业中的进程进行限制。用SetInformationJobObject函数,参数复杂,详细的就见书或MSDN吧。

2.         终止作业,TerminateJobObject函数。

3.         查询统计信息,QueryInformationJobObject

4.         和完成端口结合进行使用。

  评论这张
 
阅读(883)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018