Job.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #pragma once
  2. #include <windows.h>
  3. #include <malloc.h>
  4. class CJob {
  5. public:
  6. CJob(HANDLE hJob = NULL);
  7. ~CJob();
  8. operator HANDLE() const { return(m_hJob); }
  9. BOOL Create(PSECURITY_ATTRIBUTES psa = NULL, PCTSTR pszName = NULL);
  10. BOOL Open(PCTSTR pszName, DWORD dwDesiredAccess, BOOL fInheritHandle = FALSE);
  11. BOOL AssignProcess(HANDLE hProcess);
  12. BOOL Terminate(UINT uExitCode = 0);
  13. BOOL SetExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli, BOOL fPreserveJobTime = FALSE);
  14. BOOL SetBasicUIRestrictions(DWORD fdwLimits);
  15. BOOL GrantUserHandleAccess(HANDLE hUserObj, BOOL fGrant = TRUE);
  16. BOOL SetSecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli);
  17. BOOL QueryExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli);
  18. BOOL QueryBasicUIRestrictions(PDWORD pfdwRestrictions);
  19. BOOL QuerySecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli);
  20. BOOL QueryBasicAccountingInfo(PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION pjobai);
  21. BOOL QueryBasicProcessIdList(DWORD dwMaxProcesses, PDWORD pdwProcessIdList, PDWORD pdwProcessesReturned = NULL);
  22. BOOL AssociateCompletionPort(HANDLE hIOCP, ULONG_PTR CompKey);
  23. BOOL QueryAssociatedCompletionPort(PJOBOBJECT_ASSOCIATE_COMPLETION_PORT pjoacp);
  24. BOOL SetEndOfJobInfo(DWORD fdwEndOfJobInfo = JOB_OBJECT_TERMINATE_AT_END_OF_JOB);
  25. BOOL QueryEndOfJobTimeInfo(PDWORD pfdwEndOfJobTimeInfo);
  26. private:
  27. HANDLE m_hJob;
  28. };
  29. inline CJob::CJob(HANDLE hJob) {
  30. m_hJob = hJob;
  31. }
  32. inline CJob::~CJob() {
  33. if (m_hJob != NULL) {
  34. CloseHandle(m_hJob);
  35. }
  36. }
  37. inline BOOL CJob::Create(PSECURITY_ATTRIBUTES psa, PCTSTR pszName) {
  38. m_hJob = CreateJobObject(psa, pszName);
  39. return (m_hJob != NULL);
  40. }
  41. inline BOOL CJob::Open(PCTSTR pszName, DWORD dwDesiredAccess, BOOL fInheritHandle) {
  42. m_hJob = OpenJobObject(dwDesiredAccess, fInheritHandle, pszName);
  43. return (m_hJob != NULL);
  44. }
  45. inline BOOL CJob::AssignProcess(HANDLE hProcess) {
  46. return (AssignProcessToJobObject(m_hJob, hProcess));
  47. }
  48. inline BOOL CJob::AssociateCompletionPort(HANDLE hIOCP, ULONG_PTR CompKey) {
  49. JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp = { (PVOID)CompKey, hIOCP };
  50. return (SetInformationJobObject(m_hJob, JobObjectAssociateCompletionPortInformation, &joacp, sizeof(joacp)));
  51. }
  52. inline BOOL CJob::SetExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli, BOOL fPreserveJobTime) {
  53. if (fPreserveJobTime) {
  54. pjoeli->BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME;
  55. }
  56. const DWORD fdwFlagTest = (JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME | JOB_OBJECT_LIMIT_JOB_TIME);
  57. if ((pjoeli->BasicLimitInformation.LimitFlags & fdwFlagTest) == fdwFlagTest) {
  58. DebugBreak();
  59. }
  60. return (SetInformationJobObject(m_hJob, JobObjectExtendedLimitInformation, pjoeli, sizeof(*pjoeli)));
  61. }
  62. inline BOOL CJob::SetBasicUIRestrictions(DWORD fdwLimits) {
  63. JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir = { fdwLimits };
  64. return (SetInformationJobObject(m_hJob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir)));
  65. }
  66. inline BOOL CJob::SetEndOfJobInfo(DWORD fdwEndOfJobInfo) {
  67. JOBOBJECT_END_OF_JOB_TIME_INFORMATION joeojti = { fdwEndOfJobInfo };
  68. joeojti.EndOfJobTimeAction = fdwEndOfJobInfo;
  69. return (SetInformationJobObject(m_hJob, JobObjectEndOfJobTimeInformation, &joeojti, sizeof(joeojti)));
  70. }
  71. inline BOOL CJob::SetSecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli) {
  72. return (SetInformationJobObject(m_hJob, JobObjectSecurityLimitInformation, pjosli, sizeof(*pjosli)));
  73. }
  74. inline BOOL CJob::QueryAssociatedCompletionPort(PJOBOBJECT_ASSOCIATE_COMPLETION_PORT pjoacp) {
  75. return (QueryInformationJobObject(m_hJob, JobObjectAssociateCompletionPortInformation, pjoacp, sizeof(*pjoacp), NULL));
  76. }
  77. inline BOOL CJob::QueryBasicAccountingInfo(PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION pjobai) {
  78. return (QueryInformationJobObject(m_hJob, JobObjectBasicAndIoAccountingInformation, pjobai, sizeof(*pjobai), NULL));
  79. }
  80. inline BOOL CJob::QueryExtendedLimitInfo(PJOBOBJECT_EXTENDED_LIMIT_INFORMATION pjoeli) {
  81. return (QueryInformationJobObject(m_hJob, JobObjectExtendedLimitInformation, pjoeli, sizeof(*pjoeli), NULL));
  82. }
  83. inline BOOL CJob::QueryBasicProcessIdList(DWORD dwMaxProcesses, PDWORD pdwProcessIdList, PDWORD pdwProcessesReturned) {
  84. DWORD cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) + (sizeof(DWORD) * (dwMaxProcesses - 1));
  85. PJOBOBJECT_BASIC_PROCESS_ID_LIST pjobpil = (PJOBOBJECT_BASIC_PROCESS_ID_LIST)_alloca(cb);
  86. BOOL fOk = (pjobpil != NULL);
  87. if (fOk) {
  88. pjobpil->NumberOfProcessIdsInList = dwMaxProcesses;
  89. fOk = ::QueryInformationJobObject(m_hJob, JobObjectBasicProcessIdList, pjobpil, cb, NULL);
  90. if (fOk) {
  91. if (pdwProcessesReturned != NULL) {
  92. *pdwProcessesReturned = pjobpil->NumberOfProcessIdsInList;
  93. }
  94. CopyMemory(pdwProcessIdList, pjobpil->ProcessIdList, sizeof(DWORD) * pjobpil->NumberOfProcessIdsInList);
  95. }
  96. }
  97. return fOk;
  98. }
  99. inline BOOL CJob::QueryBasicUIRestrictions(PDWORD pfdwRestrictions) {
  100. JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
  101. BOOL fOk = QueryInformationJobObject(m_hJob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir), NULL);
  102. if (fOk) {
  103. *pfdwRestrictions = jobuir.UIRestrictionsClass;
  104. }
  105. return fOk;
  106. }
  107. inline BOOL CJob::QueryEndOfJobTimeInfo(PDWORD pfdwEndOfJobTimeInfo) {
  108. JOBOBJECT_END_OF_JOB_TIME_INFORMATION joeojti;
  109. BOOL fOk = QueryInformationJobObject(m_hJob, JobObjectBasicUIRestrictions, &joeojti, sizeof(joeojti), NULL);
  110. if (fOk) {
  111. *pfdwEndOfJobTimeInfo = joeojti.EndOfJobTimeAction;
  112. }
  113. return fOk;
  114. }
  115. inline BOOL CJob::QuerySecurityLimitInfo(PJOBOBJECT_SECURITY_LIMIT_INFORMATION pjosli) {
  116. return (QueryInformationJobObject(m_hJob, JobObjectSecurityLimitInformation, pjosli, sizeof(*pjosli), NULL));
  117. }
  118. inline BOOL CJob::Terminate(UINT uExitCode) {
  119. return (TerminateJobObject(m_hJob, uExitCode));
  120. }
  121. inline BOOL CJob::GrantUserHandleAccess(HANDLE hUserObj, BOOL fGrant) {
  122. return (UserHandleGrantAccess(hUserObj, m_hJob, fGrant));
  123. }