作业

——Windows核心编程学习手札系列之五

Windows提供作业内核对象,可以将进程组合在千毫 ,并创建一个“沙框”以便限制进程能够进行的操作。作业可视为进程的容器,windows98不支持作业的操作。创建作业内核对象的函数是Handle CraeteJobObject(PSECURITY_ATTRIBUTES psa,PCTSTR pszName);与其他内核对象一样,第一个参数将安全信息与作业对象关联起来,并告诉系统是否使返回的句柄成为可继承的句柄;第二个参数是给对象命名,便于另一个进程通过函数HANDLE OpenJobObject(DWORD dwDesiredAccess,BOOL bInheritHandle,PCTSTR pszName)进行访问;如不再访问代码中的作业对象,通过调用CloseHandle来关闭它的句柄。

进程创建后,通常需要设置“沙框”,限制其只能进行一定范围内的限制,对作业可以加上如下一些类型的限制:基本限制和扩展基本限制,用于防止作业中的进程垄断系统的资源;基本的UI限制,用于防止作业中的进程改变用户界面;安全性限制,用于防止作业中的进程访问保密资源(文件、注册表子关键字等)。调用函数

HANDLE SetInformationJobObject(HANDLE hJob,

JOBOBJECTINFOCLASS jobObjectInformationClass,

PVOID pJobObjectInformation,

DWORD cbJobObjectInformationLength),可以给作业加上各种限制。

第一个参数用于标识要限制的作业,第二个参数是枚举类型,用于指明要使用的限制类型,第三个参数包含限制设置值的数据结构的地址,第四个参数指明该结构的大小。一旦作业设置了条件,可以通过函数

BOOL QueryInformationJobObject(HANDLE hJob,

JOBOBJECTINFOCLASS JobObjectInformationClass,

PVOID pvJobObjectInformation,

DWORD cbJobObjectInformationLength,

PDWORD pdwReturnLength)查询已设置的限制。要为该函数传递作业的句柄,包括用于指明限制信息的枚举类型、函数初始化的数据结构地址、以及包含该结构的数据块大小,最后一个参数告诉你有多少字节将放入缓存。

函数BOOL AssignProcessToJobObject(HANDLE hJob,HANDLE hProcess)用于告诉系统将进程(由hProcess标识)视为现有作业(由hJob标识)的一部分。该函数只运行将尚未被赋予任何作业的进程赋予给一个作业。一旦一个进程成为一个作业的组成部分,就不能转到另一个作业,并且不能是无作业的进程,此外当作为作业一部分的进程生成另一个进程时,新进程将自动成为父作业的组成部分。要撤消作业中的进程,需要调用BOOL TerminateJobObject(HANDLE hJob,UINT uExitCode)函数,类似为每个进程调用TerminateProcess函数,将它们所有退出代码设置为uExitCode。

下面的代码演示了创建作业并设置基本和UI两种设置,并将CMD进程加入到沙框,具体代码如下:

#define  _WIN32_WINNT  0x0500

#include <Windows.h>

void   StartRestrictedProcess(void)

{

//Create   a   job   kernel   object.

HANDLE   hjob   =   CreateJobObject(NULL,NULL);

//Place   some   restrictions   on   processes   in   the   job.

//First,set   some   basic   restrictions.

JOBOBJECT_BASIC_LIMIT_INFORMATION   jobli   =   {   0   };

//The   process   always   runs   in   the   idle   priority   class.

jobli.PriorityClass   =   IDLE_PRIORITY_CLASS;

//The   job   cannot   use   more   than   1   second   of   CPU   time.

jobli.PerJobUserTimeLimit.QuadPart   =   10000000;

//1   sec   in   100-ns   intervals

//These   are   the   only   2   restrictions   I   want   placed   on   the   job   (process).

jobli.LimitFlags   =   JOB_OBJECT_LIMIT_PRIORITY_CLASS   |

JOB_OBJECT_LIMIT_JOB_TIME;

SetInformationJobObject(hjob,

JobObjectBasicLimitInformation,

&jobli,   sizeof(jobli));

//Second,   set   some   UI   restrictions.

JOBOBJECT_BASIC_UI_RESTRICTIONS   jobuir;

jobuir.UIRestrictionsClass   =   JOB_OBJECT_UILIMIT_NONE;

//A   fancy   zero

//The   process   can't   log   off   the   system.

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;

SetInformationJobObject(hjob,JobObjectBasicUIRestrictions,

&jobuir,   sizeof(jobuir));

//Spawn   the   process   that   is   to   be   in   the   job.

//Note:   You   must   first   spawn   the   process   and   then   place   the   process   in

//the   job.   This   means   that   the   process's   thread   must   be   initially

//suspended   so   that   it   can't   execute   any   code   outside

//of   the   job's   restrictions.

STARTUPINFO   si   =   {   sizeof(si)   };

PROCESS_INFORMATION   pi;

CreateProcess(NULL,   "CMD",   NULL,   NULL,   FALSE,

CREATE_SUSPENDED,   NULL,   NULL,   &si,   &pi);

//Place   the   process   in   the   job.

//Note:if   this   process   spawns   any   children,the   children   are

//automatically   part   of   the   same   job.

AssignProcessToJobObject(hjob,pi.hProcess);

//Now   we   can   allow   the   child   process's   thread   to   execute   code.

ResumeThread(pi.hThread);

CloseHandle(pi.hThread);

//Wait   for   the   process   to   terminate   or   for   all   the   job's

//allotted   CPU   time   to   be   used.

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   terminated...

printf("the process has terminated!");

break;

case   1:

//All   of   the   job's   allotted   CPU   time   was   used...

printf("CPU time has used!");

break;

}

//Clean   up   properly.

CloseHandle(pi.hProcess);

CloseHandle(hjob);

}

int main(int argc, char* argv[])

{

//printf("Hello World!/n");

StartRestrictedProcess();

return 0;

}

如非         2008-12-15

作业——Windows核心编程学习手札系列之五相关推荐

  1. 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七

    线程的调度.优先级和亲缘性 --Windows核心编程学习手札系列之七 每个线程都拥有一个上下文结构,在线程的内核对象中,记录线程上次运行时该线程的CPU寄存器状态.Windows会每隔20ms左右查 ...

  2. 线程基础知识——Windows核心编程学习手札系列之六

    线程基础知识 --Windows核心编程学习手札系列之六 线程与进程一样由两部分构成:一是线程的内核对象,操作系统用它来对线程实施管理,也是系统用来存放线程统计信息的地方:二是线程堆栈,用于维护线程在 ...

  3. 内核对象——Windows核心编程学习手札系列之三

    内核对象 --Windows核心编程学习手札系列之三 内核对象可供系统和应用程序使用来管理各种各样的资源,如进程.线程.文件等,是内核分配的一个内存块,只能又内核访问,该内存块是一种数据结构,它的成员 ...

  4. 进程——Windows核心编程学习手札系列之四

    进程 --Windows核心编程学习手札系列之四 进程是一个正在运行的程序的实例,有两个部分组成:一个是操作系统用来管理进程的内核对象,内核对象是系统用来存放关于进程的统计信息的地方:另一个是地址空间 ...

  5. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  6. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  7. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  8. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  9. 结束处理程序——Windows核心编程学习手札之二十三

    结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...

最新文章

  1. Dubbo原理何源码解析之服务暴露
  2. 2017-2-23 C#基础 中间变量
  3. 一。深入了解JDK1.8 从Package java.io开始
  4. gnome mysql client_configure: error: Not found mysqlclient library
  5. Eclipse配置关联Tomcat并运行项目
  6. C语言中的EOF符号常量
  7. 手风琴特效这么飒,能用 JavaScript 实现吗?
  8. 【AI视野·今日Robot 机器人论文速览 第二十四期】Thu, 30 Sep 2021
  9. C#反射设置属性值和获取属性值
  10. 将视频抽取成图片,并对图片进行批量命名opencv代码
  11. iOS获取手机卡IMSI信息
  12. Webpack+Babel+React环境搭建
  13. PHP添加网站版权信息,如何将版权和作者信息添加到用PHP创建的图像?
  14. 如何用python处理图片_用Python简单处理图片
  15. java关键字const_java基础知识(三)java关键字
  16. 傲腾服务器系统,服务器装傲腾内存
  17. ETL调度工具 taskctl-> Designer 设计IDE环境
  18. SqlServer2012中使用动态sql语句
  19. HpSocket源码使用
  20. 超高精度UWB其实并不贵——UWB定位基站成本详解

热门文章

  1. mysql 密码加密windows_Windows下mysql数据库的安装及8.0以上版本设置密码的命令(简易教学)...
  2. mysql 生成数列_PHP生成器的创建和使用
  3. rsync常用的三种用法
  4. git 解决多人修改相同的文件导致的冲突
  5. .NET: 使用.NET Core CLI开发应用程序
  6. SSM框架的简单搭建
  7. 《编程珠玑》 读书笔记
  8. smooth_L1_loss_layer.cu解读 caffe源码初认识
  9. Sencha Touch2 -- 11.1:定义具有关联关系的模型
  10. [转载]一个Spectral Clustering方法的小结