`
mmdev
  • 浏览: 13239465 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【Windows核心编程】Windows核心编程 -- 作业

 
阅读更多
场景: 用VS创建一个c++项目时候,通常生成一个.exe程序,而.exe程序可能生成更多进程。如果用户希望提前停止构建进程,则VS必须想法终止.exe及所有子进程。
一,作业

Windows提供了一个作业(job)内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。最好将作业对象想象成一个进程容器。但是创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制。

1) 验证当前进程是否在一个现有的作业控制之下:

BOOL IsProcessInJob(

HANDLE hProcess,

HANDLE hJob,

PBOOL pbInJob);

使用:IsProcessInJob(GetCurrentProcess(),NULL,&bInJob);

如果bInJob==True 则在当前作业控制之下

2)如果进程已与一个作业关联,就无法将当前进程或者它的任何子进程从作业中去除。这个安全特性可以确保进程无法摆脱对它施加的限制。然后,通过以下调用来创建一个新的作业内核对象:
HANDLE CreateJobObject(

PSECURITY_ATTRIBUTES psa,

PCTSTR pszName);

最后一个参数对此作业对象进行命名,使其能够由另一个进程通过OpenJobObject函数进行访问,如下所示:

3) 访问

HANDLE OpenJobObject(

DWORD dwDesiredAccess,

BOOL bInheritHandle,

PCTSTR pszName);

示例:

HANDLE hJob=CreateJobObject(NULL,TEXT("tian")); //Create a named job object

AssignProcessToJobObject(hJob,GetCurrentProcess()); //put our own process in job

CloseHandle(hJob); //close the job

hJob=OpenJobObject(JOB_OBJECT_ALL_ACCESS,FALSE,TEXT("tian")); //open the exitint job

二,对作业中的进程施加限制

创建好一个作业之后,接着一般会根据作业中的进程能够执行哪些操作来建立一个沙箱(即施加限制)。可以向作业应用以下几种类型的限制:

  • 基本限额和扩展基本限额,用于防止作业中的进程独占系统资源;
  • 基本UI限制,用于防止作业内的进程更改用户界面;
  • 安全限额,用于防止作业内的进程访问安全资源(文件。注册表子项等);

可以通过以下函数向作业施加限制:

BOOL SetInformationJobObject(

HANDLE hJob, //要限制的作业

JOBOBJECTINFOCLASS JobObjectInformationClass, //枚举类型,制定要施加到限制类型

PVOID pJobObjectInformation,// 数据结构地址,具体到限制设置

DWORD cbJobObjectInformationSize);//数据结构大小

限制类型

第二个参数的值

第三个参数所对应的数据结构(struct)

基本限额

JobObjectBasicLimitInformation

JOBOBJECT_BASIC_LIMIT_INFORMATION

扩展后的基本限额

JobObjectExtendedLimitInformation

JOBOBJECT_EXTENDED_LIMIT_INFORMATION

基本的UI限额

JobObjectBasicUIRestrictions

JOBOBJECT_BASIC_UI_RESTRICTIONS

安全限额

JobObjectSecurityLimitInformation

JOBOBJECT_SECURITY_LIMIT_INFORMATION

三,将进程放入作业中

我们在将进程放入作业中时,常常调用CreateProcess来创建进程,且传入CREATE_SUSPENDED标志,暂时挂起进程。

注意:如果允许子进程立即开始执行代码,它会逃离我们的“沙箱”,成功地做些我们禁止它做的事情。所以,在创建子进程且允许它运行之前,必须调用一下函数,将进程显示地放入新建的作业中:

BOOL AssignProcessToJobObject(

HANDLE hJob,

HANDLE hProcess);

这个函数将向系统表明将此进程当作现有作业的一部分。注意,这个函数只允许将尚未分配给任何作业的一个进程分配给一个作业。一旦一个进程分配到一个作业中,它就不能分配到其他作业中。

在调用了AssignProcessToJobObject之后,再调用ResumeThread,使进程的线程可以在作业的限制下执行代码。

四,终止作业中的所有进程

BOOL TerminateJobObject(

HANDLE hJob,

UINT uExitCode);

这类似于为作业内的每一个进程调用TerminateProcess,将所有退出代码设为uExitCode。

五,作业通知

如果只是关心所分配的CPU时间是否已经过期,那么可以非常简单的获得这个通知,作业中进程如果还没有用完已分配的CPU时间,作业就处于未触发的状态,一旦作业用完所分配的时间windows就会强行杀死作业中所有的进程,触发作业对象 。

WaitForSingleObject()可以轻松捕获这个事件。







分享到:
评论

相关推荐

    Windows编程大作业

    Windows编程主要涉及Win32 API,这是Microsoft为Windows操作系统提供的核心编程接口。开发者可以通过调用这些API函数来实现窗口管理、事件处理、图形绘制等功能。在这个射击游戏中,可能会用到如CreateWindow、...

    Windows 核心编程第五版(英文原版) pdf

    《Windows 核心编程第五版》(Windows Via C/C++)是由Jeffrey Richter和Christophe Nasarre合著的,这本书主要关注于如何通过C/C++编程语言来深入Windows操作系统的核心编程。本书的英文原版PDF为那些希望深入理解...

    C++作业-画圆-放大-windows-MFC.pdf

    这些函数都是Windows编程中处理用户输入和定时任务的核心机制。 3. 画圆的GDI函数:在文件中可以看到使用了Ellipse函数,这是GDI(图形设备接口)的一个函数,用于在指定的矩形内绘制一个椭圆,实际效果是画一个圆...

    windows程序设计大作业-飞机大战

    这个大作业涉及到的知识点广泛,涵盖了Windows编程的核心概念和技术。 1. **Windows程序开发环境**:此项目使用了Visual Studio IDE,通过`.vcxproj`和`.filters`文件可以看出,这是一款基于C++语言的Windows应用...

    多任务编程---1 windows内核对象

    在探讨Windows多任务编程时,内核对象是一个核心概念,对于深入理解Windows操作系统的工作原理至关重要。本文将围绕这一主题展开,详细介绍Windows内核对象的基本概念、类型以及如何在实际编程中创建与使用这些对象...

    资源专区-课程设计-编程作业-C#资源

    C#的核心是面向对象编程(OOP),支持类、对象、接口、抽象类、继承、多态和封装等概念。通过这些特性,开发者可以构建模块化、可维护的代码。 3. **泛型** C#引入了泛型,允许开发者创建可重用的类型安全的数据...

    Windows编程入门——字节跳动.pptx

    Windows 操作系统的特点包括视窗界面、Unicode、进程、线程、作业、虚拟内存、内核态 / 用户态、对象与句柄、注册表等。 Windows 基本编程理论 Windows 编程的基本理论包括微软开发者网络 MSDN、API 调用与状态...

    windows-hadoop-bin

    在Windows上配置Hadoop和Spark时,往往需要手动下载这些WinUtils工具,将其添加到系统路径,以便正确地运行Spark作业。这个压缩包提供的就是这些必要的工具,帮助开发者在Windows环境下搭建和测试Hadoop和Spark的...

    windows 核心系统编程(第五版 中文)4-6章

    ### Windows核心系统编程(第五版中文)4-6章知识点概览 #### 第4章 进程 **主要内容概述:** 本章详细介绍了进程的概念、创建、终止等关键操作,并探讨了与进程相关的多种属性及如何对其进行管理和操作。 **详细...

    资源专区-课程设计-编程作业-【数据库实战】-QQ屏幕截图工具的设计与实现

    该编程作业的核心知识点包括: 1. **图形用户界面(GUI)设计**:QQ屏幕截图工具的用户界面设计是其直观易用的关键。开发者需要使用如Java Swing、JavaFX、Qt、wxWidgets或Python的Tkinter等库来创建窗口、按钮、...

    精通Windows.API-函数、接口、编程实例.pdf

    2.3 Windows API核心DLL 21 2.3.1 Kernel32.dll 21 2.3.2 User32.dll 21 2.3.3 Gdi32.dll 22 2.3.4 标准C函数 22 2.3.5 其他Dll 22 2.4 Unicode和多字节 22 2.4.1 W版本和A版本的API 24 2.4.2 ...

    c++大作业 (windows程序设计)

    作业涵盖了一些核心的C++编程知识,以及Windows API的使用。 1. **C++基础**:C++的基础知识包括变量、数据类型、运算符、控制结构(如if语句和循环)、函数、数组、指针等。这些是任何C++程序员必备的基本功,用于...

    windows 编程课件windows 编程课件

    这个Windows编程课件很可能是按照这些主题组织的,包含了理论讲解、实例演示和可能的作业,旨在帮助学习者逐步掌握Windows编程。通过深入学习和实践,你可以创建自己的Windows应用程序,甚至构建更高级的系统级组件...

    hadoop-2.9.2-Windows.zip

    1. **Hadoop架构**:Hadoop主要由两个核心组件组成——HDFS(Hadoop Distributed File System)和MapReduce。HDFS是一个分布式文件系统,用于存储大量数据;MapReduce则是一种并行处理模型,用于对HDFS中的数据进行...

    尚硅谷大数据之Scala语言核心编程.pdf

    在尚硅谷出版的《大数据之Scala语言核心编程》中,首先介绍了学习Scala语言的原因和Scala语言诞生的小故事。Scala诞生是为了提供一种更加简洁高效的编程方式,能够在同一套系统中处理结构化和非结构化数据。该书中还...

    Programming-Windows-with-MFC.zip_Programming with C

    《编程Windows与MFC》是由Jeff Prosise撰写的一本关于使用C++编程的专著,主要聚焦于Microsoft Foundation Classes (MFC)库的应用。MFC是微软为简化Windows应用程序开发而设计的一个C++类库,它封装了Windows API,...

    examen- flores castro guido_Windows编程_源码

    描述提到的是编程任务“deber de programación numer o6”,这可能是一个课程作业或者项目的一部分,要求进行特定的Windows平台开发。 在Windows编程中,开发者通常会使用API(应用程序接口)提供的函数来创建和...

    jdk-8u91-windows-x64.zip

    对于大数据和云计算项目,Java是广泛使用的编程语言,因为其跨平台性、稳定性和丰富的开源库,尤其在大数据处理框架如Hadoop和Spark,以及云计算平台如OpenShift和Google App Engine中。 在大数据场景下,Java可以...

    2020网络工程与编程实践-作业要求1

    这篇文档是关于2020年网络工程与编程实践课程的作业要求,主要涉及网络通信、前端开发和数据库管理等多个IT领域。以下是根据标题、描述和标签生成的相关知识点: 1. **网络协议**:FTP(文件传输协议)、SMTP(简单...

Global site tag (gtag.js) - Google Analytics