1 // Copyright (c) 2016 Klemens D. Morgenstern
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_
7 #define BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_
9 #include <boost/winapi/config.hpp>
10 #include <boost/winapi/basic_types.hpp>
11 #include <boost/winapi/dll.hpp>
13 namespace boost { namespace process { namespace detail { namespace windows { namespace workaround {
15 //this import workaround is to keep it a header-only library. and enums cannot be imported from the winapi.
20 typedef enum _JOBOBJECTINFOCLASS_ {
21 JobObjectBasicAccountingInformation_ = 1, JobObjectBasicLimitInformation_,
22 JobObjectBasicProcessIdList_, JobObjectBasicUIRestrictions_,
23 JobObjectSecurityLimitInformation_, JobObjectEndOfJobTimeInformation_,
24 JobObjectAssociateCompletionPortInformation_, JobObjectBasicAndIoAccountingInformation_,
25 JobObjectExtendedLimitInformation_, JobObjectJobSetInformation_,
26 JobObjectGroupInformation_,
27 JobObjectNotificationLimitInformation_,
28 JobObjectLimitViolationInformation_,
29 JobObjectGroupInformationEx_,
30 JobObjectCpuRateControlInformation_,
31 JobObjectCompletionFilter_,
32 JobObjectCompletionCounter_,
33 JobObjectReserved1Information_ = 18,
34 JobObjectReserved2Information_,
35 JobObjectReserved3Information_,
36 JobObjectReserved4Information_,
37 JobObjectReserved5Information_,
38 JobObjectReserved6Information_,
39 JobObjectReserved7Information_,
40 JobObjectReserved8Information_,
41 MaxJobObjectInfoClass_
42 } JOBOBJECTINFOCLASS_;
44 typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION_ {
45 ::boost::winapi::LARGE_INTEGER_ PerProcessUserTimeLimit;
46 ::boost::winapi::LARGE_INTEGER_ PerJobUserTimeLimit;
47 ::boost::winapi::DWORD_ LimitFlags;
48 ::boost::winapi::SIZE_T_ MinimumWorkingSetSize;
49 ::boost::winapi::SIZE_T_ MaximumWorkingSetSize;
50 ::boost::winapi::DWORD_ ActiveProcessLimit;
51 ::boost::winapi::ULONG_PTR_ Affinity;
52 ::boost::winapi::DWORD_ PriorityClass;
53 ::boost::winapi::DWORD_ SchedulingClass;
54 } JOBOBJECT_BASIC_LIMIT_INFORMATION_;
57 typedef struct _IO_COUNTERS_ {
58 ::boost::winapi::ULONGLONG_ ReadOperationCount;
59 ::boost::winapi::ULONGLONG_ WriteOperationCount;
60 ::boost::winapi::ULONGLONG_ OtherOperationCount;
61 ::boost::winapi::ULONGLONG_ ReadTransferCount;
62 ::boost::winapi::ULONGLONG_ WriteTransferCount;
63 ::boost::winapi::ULONGLONG_ OtherTransferCount;
67 typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION_ {
68 JOBOBJECT_BASIC_LIMIT_INFORMATION_ BasicLimitInformation;
70 ::boost::winapi::SIZE_T_ ProcessMemoryLimit;
71 ::boost::winapi::SIZE_T_ JobMemoryLimit;
72 ::boost::winapi::SIZE_T_ PeakProcessMemoryUsed;
73 ::boost::winapi::SIZE_T_ PeakJobMemoryUsed;
74 } JOBOBJECT_EXTENDED_LIMIT_INFORMATION_;
77 /*BOOL WINAPI QueryInformationJobObject(
79 _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
80 _Out_ LPVOID lpJobObjectInfo,
81 _In_ DWORD cbJobObjectInfoLength,
82 _Out_opt_ LPDWORD lpReturnLength
85 typedef ::boost::winapi::BOOL_ ( WINAPI *query_information_job_object_p)(
86 ::boost::winapi::HANDLE_,
89 ::boost::winapi::DWORD_,
90 ::boost::winapi::DWORD_ *);
93 inline ::boost::winapi::BOOL_ WINAPI query_information_job_object(
94 ::boost::winapi::HANDLE_ hJob,
95 JOBOBJECTINFOCLASS_ JobObjectInfoClass,
96 void * lpJobObjectInfo,
97 ::boost::winapi::DWORD_ cbJobObjectInfoLength,
98 ::boost::winapi::DWORD_ *lpReturnLength)
100 static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle("Kernel32.dll");
101 static query_information_job_object_p f = reinterpret_cast<query_information_job_object_p>(::boost::winapi::get_proc_address(h, "QueryInformationJobObject"));
103 return (*f)(hJob, JobObjectInfoClass, lpJobObjectInfo, cbJobObjectInfoLength, lpReturnLength);
106 /*BOOL WINAPI SetInformationJobObject(
108 _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
109 _In_ LPVOID lpJobObjectInfo,
110 _In_ DWORD cbJobObjectInfoLength
113 typedef ::boost::winapi::BOOL_ ( WINAPI *set_information_job_object_p)(
114 ::boost::winapi::HANDLE_,
117 ::boost::winapi::DWORD_);
121 inline ::boost::winapi::BOOL_ WINAPI set_information_job_object(
122 ::boost::winapi::HANDLE_ hJob,
123 JOBOBJECTINFOCLASS_ JobObjectInfoClass,
124 void * lpJobObjectInfo,
125 ::boost::winapi::DWORD_ cbJobObjectInfoLength)
127 static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle("Kernel32.dll");
128 static set_information_job_object_p f = reinterpret_cast<set_information_job_object_p>(::boost::winapi::get_proc_address(h, "SetInformationJobObject"));
130 return (*f)(hJob, JobObjectInfoClass, lpJobObjectInfo, cbJobObjectInfoLength);
133 constexpr static ::boost::winapi::DWORD_ JOB_OBJECT_LIMIT_BREAKAWAY_OK_ = 0x00000800;
139 #endif /* BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_ */