Github

https://github.com/gongluck/Windows-Core-Program.git

  1. //第5章 作业.cpp: 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "第5章 作业.h"
  5. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  6. _In_opt_ HINSTANCE hPrevInstance,
  7. _In_ LPWSTR lpCmdLine,
  8. _In_ int nCmdShow)
  9. {
  10. //在调试一个作业(Job)程序时发现,如下代码总是返回TRUE,无论是从VS中启动调试还是从资源管理器中启动。
  11. //原来,从资源管理器或者VS中启动程序时,系统会自动把该进程放到一个作业(Job)中。知道了这一点,要想让这段代码返回FALSE,只要从CMD中启动该程序即可。
  12. BOOL bInJob;
  13. IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);
  14. if (bInJob)
  15. MessageBox(nullptr, TEXT("process already in a job"), TEXT("info"), MB_OK);
  16. else
  17. MessageBox(nullptr, TEXT("process not in a job"), TEXT("info"), MB_OK);
  18. BOOL bret;
  19. HANDLE hJob = CreateJobObject(nullptr, TEXT("第5章 作业"));
  20. JOBOBJECT_BASIC_LIMIT_INFORMATION basiclimit = { 0 };
  21. //作业(进程沙盒)限制
  22. //JobObjectBasicLimitInformation、JobObjectExtendedLimitInformation、JobObjectBasicUIRestrictions、JobObjectSecurityLimitInformation
  23. //UserHandleGrantAccess授予或禁止一个Job中的进程访问施加了UI限制的用户对象的句柄的权限.当授予了访问权限,所有相关联的进程都可以在随后识别和使用这个句柄.当访问被拒绝,该进程不能在使用该句柄.
  24. basiclimit.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME;
  25. basiclimit.PriorityClass = IDLE_PRIORITY_CLASS;//指定关联进程的优先级类
  26. basiclimit.PerJobUserTimeLimit.QuadPart = 100000;//分配给进程的最大用户模式时间(100纳秒)
  27. bret = SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &basiclimit, sizeof(basiclimit));
  28. bret = QueryInformationJobObject(hJob, JobObjectBasicLimitInformation, &basiclimit, sizeof(basiclimit), nullptr);
  29. JOBOBJECT_END_OF_JOB_TIME_INFORMATION endoftime;
  30. endoftime.EndOfJobTimeAction = JOB_OBJECT_POST_AT_END_OF_JOB;//到期不终止进程(If no completion port is associated with the job when the time limit has been exceeded, the action taken is the same as for JOB_OBJECT_TERMINATE_AT_END_OF_JOB。)JOB_OBJECT_TERMINATE_AT_END_OF_JOB(到期终止进程)
  31. bret = SetInformationJobObject(hJob, JobObjectEndOfJobTimeInformation, &endoftime, sizeof(endoftime));
  32. bret = QueryInformationJobObject(hJob, JobObjectEndOfJobTimeInformation, &endoftime, sizeof(endoftime), nullptr);
  33. //将进程放入作业中,只能添加未运行的“无业”进程
  34. STARTUPINFO si = { 0 };
  35. si.cb = sizeof(si);
  36. PROCESS_INFORMATION pi = { 0 };
  37. bret = CreateProcess(TEXT("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE"), nullptr, nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, nullptr, &si, &pi);
  38. bret = AssignProcessToJobObject(hJob, pi.hProcess);
  39. ResumeThread(pi.hThread);
  40. //查询作业(进程)统计信息
  41. JOBOBJECT_BASIC_ACCOUNTING_INFORMATION accountinfo = { 0 };
  42. bret = QueryInformationJobObject(hJob, JobObjectBasicAccountingInformation, &accountinfo, sizeof(accountinfo), nullptr);
  43. FILETIME c, e, k, u;
  44. bret = GetProcessTimes(pi.hProcess, &c, &e, &k, &u);
  45. JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION ioaccountinfo = { 0 };
  46. bret = QueryInformationJobObject(hJob, JobObjectBasicAndIoAccountingInformation, &ioaccountinfo, sizeof(ioaccountinfo), nullptr);
  47. IO_COUNTERS ioconters;
  48. bret = GetProcessIoCounters(pi.hProcess, &ioconters);
  49. //查询作业内进程
  50. const int max = 10;
  51. DWORD cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) + (max - 1) * sizeof(ULONG_PTR);
  52. PJOBOBJECT_BASIC_PROCESS_ID_LIST pidlist = (PJOBOBJECT_BASIC_PROCESS_ID_LIST)malloc(cb);
  53. pidlist->NumberOfAssignedProcesses = max;
  54. bret = QueryInformationJobObject(hJob, JobObjectBasicProcessIdList, pidlist, cb, &cb);
  55. for (int i = 0; i < pidlist->NumberOfProcessIdsInList; ++i)
  56. {
  57. pidlist->ProcessIdList[i];
  58. }
  59. free(pidlist);
  60. pidlist = nullptr;
  61. //已分配的CPU时间到期时,作业状态变成已触发
  62. WaitForSingleObject(hJob, INFINITE);
  63. system("pause");
  64. //终止作业中所有的进程
  65. bret = TerminateJobObject(hJob, 0);
  66. CloseHandle(pi.hProcess);
  67. pi.hProcess = nullptr;
  68. CloseHandle(pi.hThread);
  69. pi.hThread = nullptr;
  70. system("pause");
  71. return 0;
  72. }

Windows核心编程:第5章 作业的更多相关文章

  1. Windows核心编程 第五章 作业(上)

    第5章 作 业 通常,必须将一组进程当作单个实体来处理.例如,当让 Microsoft Developer Studio为你创建一个应用程序项目时,它会生成 C l . e x e,C l . e x ...

  2. Windows核心编程 第五章 作业(下)

    5.4 查询作业统计信息 前面已经介绍了如何使用 Q u e r y I n f o r m a t i o n J o b O b j e c t函数来获取对作业的当前限制信息.也可以使用它来获取关 ...

  3. windows核心编程 第5章job lab示例程序 解决小技巧

    看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里”         用process explorer程序查看 ...

  4. windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题

    // 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...

  5. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  6. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  7. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  8. windows核心编程---第六章 线程的调度

    每个线程都有一个CONTEXT结构,保存在线程内核对象中.大约每隔20ms windows就会查看所有当前存在的线程内核对象.并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入c ...

  9. windows核心编程---第四章 进程

    上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构.操作系统内核通过 ...

  10. Windows核心编程 第27章 硬件输入模型和局部输入状态

    第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...

随机推荐

  1. 使用iTEXT库生成pdf

    iTEXT下载地址 https://sourceforge.net/projects/itext/files/ 选择绿色的按钮,下载最新版本,解压后是一些jar包 为了使用方便,将文件夹放到JAVA_ ...

  2. 解析vue2.0中render:h=>h(App)的具体意思

    render:h=>h(App)是ES6中的箭头函数写法,等价于render:function(h){return h(App);}. 注意点:1.箭头函数中的this是 指向 包裹this所在 ...

  3. python上下文管理协议

    所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...

  4. 清华大学 TUNA 协会

    https://tuna.moe/ 技术,实力,优越感,环境..,镜像

  5. C语言基础第五次作业

    题目7-2 统计一行文本的单词个数 1.实验代码 #include <stdio.h> int main() { char a; ,countword=; ){ scanf("% ...

  6. MZOJ 1344 工作依赖

    这道题并不是很难,关键在于读入; 其余只需一个遍历;(考的时候傻逼兮兮的没写出来) 另外,学到了一个 isdigit()用来判断是否是0-9的数字; #include <bits/stdc++. ...

  7. samba服务和nginx服务

    一  samba服务 1 samba的功能:samba是一个网络服务器,是连接linux和windows之间共享文件的. 2 samba服务的启动,停止和重启: (1) 要启动Samba服务,只需用户 ...

  8. C中的volatile用法[转载]

    volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进 ...

  9. C语言三种方法调用数组

    #include <stdio.h> /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *** ...

  10. Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)

    一.Mybatisplus通用(公共方法)CRUD,一共17种(3.0.3版),2.3系列也是这么多,这个新版本一定程度进行了改造和删减. 二.构造器UML图(3.0.3)-----实体包装器,主要用 ...