Windows编程之做业篇

    由于Windows没有维护进程中父子关系(仅仅在建立子进程的一瞬间具备父子关系),因此想经过父进程来控制子进程是很困难的。为此,Windows推出了一个特殊的内核对象---做业(Job),做业就像是一个自然“沙箱”,能够对其中的进程进行时间、内存以及权限等限制。git

  •     做业使用步骤
    1. 首先须要建立做业内核对象,经过一下函数来建立做业内核对象
      HANDLE CreateJobObject(
        PSECURITY_ATTRIBUTES pas,
        PCTSTR pszName
      );

      与其余内核对象同样的,第一个参数用于指定做业对象的安全信息,以及是否可继承windows

    2. 其次,是对做业中的进程进行设限,具体经过SetInformationJobObject()来实现安全

      BOOL SetInformationJobObject(
        HANDLE hJob,
        JOBOBJECTINFOCLASS JobObjectInformationClass,
        PVOID pJobObjectInformation,
        DWORD cbJobObjectInformationSize
      );

      第一个参数用于指定设限的做业,第二个参数用于指定设限的类型,第三个参数用于指向存储具体设限内容的数据结构,第四个参数表示此数据结构的大小。具体内容请参看https://msdn.microsoft.com/en-us/library/windows/desktop/ms686216(v=vs.85).aspx数据结构

    3. 设置好限制以后,咱们须要建立进程,就像日常同样建立进程,可是须要设置CREATE_SUSPENDED这个标志。若是不设置,子进程会在建立完成后当即开始执行代码,即逃离沙箱,若是想真正的限制住它,就须要让它在建立完成后不执行任何代码,再经过AssignProcessToJobObject()将进程放入沙箱(做业)函数

      BOOL AssignProcessToJobObject(
        HANDLE hJob,
        HANDLE hProcess
      );

                 

    4. 当进程建立完成并放入做业中后,咱们须要将挂起的进程恢复运行,经过ResumeThread()便可.net

      DWORD WINAPI ResumeThread(
        HANDLE hThread
      );

               

    5. 最后,想要在做业所属进程中知道子进程什么时候结束,能够简单地用WaitForSingleObject()来获取进程内核对象的触发状态。对于内核对象而言,拥有触发与未触发两个状态,当达到触发状态时,WaitForSingleObject()会捕捉到并返回。而对于进程内核对象而言,只有当进程结束时它的内存对象才会变成触发状态。code

      DWORD WaitForSingleObject( 
        HANDLE hHandle,
        DWORD dwMilliseconds
      );

                    

  • PS:当设置的时间限制和内存限制过小,会出现参数错误而致使设限失败,而若是内存限制小于进程须要的内存空间时,会出现应用程序错误   orm

  • PS:具体参考代码请前往 https://git.oschina.net/Explorer0/codes 处,若有错误,敬请指出~对象

相关文章
相关标签/搜索