• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Klemens D. Morgenstern
3  *
4  * Distributed under the Boost Software License, Version 1.0.
5  * See http://www.boost.org/LICENSE_1_0.txt
6  */
7 
8 #ifndef BOOST_WINAPI_JOBS_HPP_INCLUDED_
9 #define BOOST_WINAPI_JOBS_HPP_INCLUDED_
10 
11 #include <boost/winapi/config.hpp>
12 
13 #ifdef BOOST_HAS_PRAGMA_ONCE
14 #pragma once
15 #endif
16 
17 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
18 
19 #include <boost/winapi/basic_types.hpp>
20 #include <boost/winapi/access_rights.hpp>
21 #include <boost/winapi/detail/header.hpp>
22 
23 #if !defined( BOOST_USE_WINDOWS_H )
24 extern "C" {
25 #if !defined( BOOST_NO_ANSI_APIS )
26 #if BOOST_WINAPI_PARTITION_DESKTOP
27 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC CreateJobObjectA(
28     ::_SECURITY_ATTRIBUTES* lpJobAttributes,
29     boost::winapi::LPCSTR_ lpName);
30 #endif
31 #endif
32 
33 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
34 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC CreateJobObjectW(
35     ::_SECURITY_ATTRIBUTES* lpJobAttributes,
36     boost::winapi::LPCWSTR_ lpName);
37 
38 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC AssignProcessToJobObject(
39     boost::winapi::HANDLE_ hJob,
40     boost::winapi::HANDLE_ hProcess);
41 
42 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
43 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC IsProcessInJob(
44     boost::winapi::HANDLE_ ProcessHandle,
45     boost::winapi::HANDLE_ JobHandle,
46     boost::winapi::PBOOL_ Result);
47 #endif
48 
49 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC TerminateJobObject(
50     boost::winapi::HANDLE_ hJob,
51     boost::winapi::UINT_ uExitCode);
52 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
53 } // extern "C"
54 #endif // !defined( BOOST_USE_WINDOWS_H )
55 
56 // MinGW does not declare OpenJobObjectA/W in headers but exports them from libraries
57 #if !defined( BOOST_USE_WINDOWS_H ) || defined( BOOST_WINAPI_IS_MINGW )
58 extern "C" {
59 #if !defined( BOOST_NO_ANSI_APIS )
60 #if BOOST_WINAPI_PARTITION_DESKTOP
61 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC OpenJobObjectA(
62     boost::winapi::DWORD_ dwDesiredAccess,
63     boost::winapi::BOOL_ bInheritHandles,
64     boost::winapi::LPCSTR_ lpName);
65 #endif
66 #endif
67 
68 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
69 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC OpenJobObjectW(
70     boost::winapi::DWORD_ dwDesiredAccess,
71     boost::winapi::BOOL_ bInheritHandles,
72     boost::winapi::LPCWSTR_ lpName);
73 #endif
74 } // extern "C"
75 #endif // !defined( BOOST_USE_WINDOWS_H ) || defined( BOOST_WINAPI_IS_MINGW )
76 
77 namespace boost {
78 namespace winapi {
79 
80 // MinGW does not define job constants
81 #if defined( BOOST_USE_WINDOWS_H ) && !defined( BOOST_WINAPI_IS_MINGW )
82 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_ASSIGN_PROCESS_ = JOB_OBJECT_ASSIGN_PROCESS;
83 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_SET_ATTRIBUTES_ = JOB_OBJECT_SET_ATTRIBUTES;
84 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_QUERY_ = JOB_OBJECT_QUERY;
85 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_TERMINATE_ = JOB_OBJECT_TERMINATE;
86 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_SET_SECURITY_ATTRIBUTES_ = JOB_OBJECT_SET_SECURITY_ATTRIBUTES;
87 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_ALL_ACCESS_ = JOB_OBJECT_ALL_ACCESS;
88 #else
89 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_ASSIGN_PROCESS_ = 0x0001;
90 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_SET_ATTRIBUTES_ = 0x0002;
91 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_QUERY_ = 0x0004;
92 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_TERMINATE_ = 0x0008;
93 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_SET_SECURITY_ATTRIBUTES_ = 0x0010;
94 BOOST_CONSTEXPR_OR_CONST DWORD_ JOB_OBJECT_ALL_ACCESS_ = (STANDARD_RIGHTS_REQUIRED_ | SYNCHRONIZE_ | 0x1F);
95 #endif
96 
97 #if BOOST_WINAPI_PARTITION_DESKTOP
98 #if !defined( BOOST_NO_ANSI_APIS )
CreateJobObjectA(LPSECURITY_ATTRIBUTES_ lpJobAttributes,LPCSTR_ lpName)99 BOOST_FORCEINLINE HANDLE_ CreateJobObjectA(LPSECURITY_ATTRIBUTES_ lpJobAttributes, LPCSTR_ lpName)
100 {
101     return ::CreateJobObjectA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpJobAttributes), lpName);
102 }
103 
create_job_object(LPSECURITY_ATTRIBUTES_ lpJobAttributes,LPCSTR_ lpName)104 BOOST_FORCEINLINE HANDLE_ create_job_object(LPSECURITY_ATTRIBUTES_ lpJobAttributes, LPCSTR_ lpName)
105 {
106     return ::CreateJobObjectA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpJobAttributes), lpName);
107 }
108 
109 using ::OpenJobObjectA;
110 
open_job_object(DWORD_ dwDesiredAccess,BOOL_ bInheritHandles,LPCSTR_ lpName)111 BOOST_FORCEINLINE HANDLE_ open_job_object(DWORD_ dwDesiredAccess, BOOL_ bInheritHandles, LPCSTR_ lpName)
112 {
113     return ::OpenJobObjectA(dwDesiredAccess, bInheritHandles, lpName);
114 }
115 #endif // !defined( BOOST_NO_ANSI_APIS )
116 #endif // BOOST_WINAPI_PARTITION_DESKTOP
117 
118 #if BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
119 using ::AssignProcessToJobObject;
CreateJobObjectW(LPSECURITY_ATTRIBUTES_ lpJobAttributes,LPCWSTR_ lpName)120 BOOST_FORCEINLINE HANDLE_ CreateJobObjectW(LPSECURITY_ATTRIBUTES_ lpJobAttributes, LPCWSTR_ lpName)
121 {
122     return ::CreateJobObjectW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpJobAttributes), lpName);
123 }
124 
create_job_object(LPSECURITY_ATTRIBUTES_ lpJobAttributes,LPCWSTR_ lpName)125 BOOST_FORCEINLINE HANDLE_ create_job_object(LPSECURITY_ATTRIBUTES_ lpJobAttributes, LPCWSTR_ lpName)
126 {
127     return ::CreateJobObjectW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpJobAttributes), lpName);
128 }
129 
open_job_object(DWORD_ dwDesiredAccess,BOOL_ bInheritHandles,LPCWSTR_ lpName)130 BOOST_FORCEINLINE HANDLE_ open_job_object(DWORD_ dwDesiredAccess, BOOL_ bInheritHandles, LPCWSTR_ lpName)
131 {
132     return ::OpenJobObjectW(dwDesiredAccess, bInheritHandles, lpName);
133 }
134 
135 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
136 using ::IsProcessInJob;
137 #endif
138 
139 using ::OpenJobObjectW;
140 using ::TerminateJobObject;
141 #endif // BOOST_WINAPI_PARTITION_DESKTOP || BOOST_WINAPI_PARTITION_SYSTEM
142 
143 } // namespace winapi
144 } // namespace boost
145 
146 #include <boost/winapi/detail/footer.hpp>
147 
148 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
149 #endif // BOOST_WINAPI_JOBS_HPP_INCLUDED_
150