2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/process/job.c
5 * PURPOSE: Job functions
6 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
11 /* INCLUDES *******************************************************************/
18 /* FUNCTIONS ******************************************************************/
25 CreateJobObjectA(IN LPSECURITY_ATTRIBUTES lpJobAttributes
,
28 /* Call the W(ide) function */
29 ConvertWin32AnsiObjectApiToUnicodeApi(JobObject
, lpName
, lpJobAttributes
);
37 CreateJobObjectW(IN LPSECURITY_ATTRIBUTES lpJobAttributes
,
40 /* Create the NT object */
41 CreateNtObjectFromWin32Api(JobObject
, JobObject
, JOB
, lpJobAttributes
, lpName
);
49 OpenJobObjectW(IN DWORD dwDesiredAccess
,
50 IN BOOL bInheritHandle
,
53 /* Open the NT object */
54 OpenNtObjectFromWin32Api(JobObject
, dwDesiredAccess
, bInheritHandle
, lpName
);
63 OpenJobObjectA(IN DWORD dwDesiredAccess
,
64 IN BOOL bInheritHandle
,
67 /* Call the W(ide) function */
68 ConvertOpenWin32AnsiObjectApiToUnicodeApi(JobObject
, dwDesiredAccess
, bInheritHandle
, lpName
);
76 IsProcessInJob(IN HANDLE ProcessHandle
,
82 Status
= NtIsProcessInJob(ProcessHandle
, JobHandle
);
83 if (NT_SUCCESS(Status
))
85 *Result
= (Status
== STATUS_PROCESS_IN_JOB
);
89 BaseSetLastNTError(Status
);
98 AssignProcessToJobObject(IN HANDLE hJob
,
103 Status
= NtAssignProcessToJobObject(hJob
, hProcess
);
104 if (!NT_SUCCESS(Status
))
106 BaseSetLastNTError(Status
);
118 QueryInformationJobObject(IN HANDLE hJob
,
119 IN JOBOBJECTINFOCLASS JobObjectInformationClass
,
120 IN LPVOID lpJobObjectInformation
,
121 IN DWORD cbJobObjectInformationLength
,
122 OUT LPDWORD lpReturnLength
)
126 JOBOBJECT_EXTENDED_LIMIT_INFORMATION LocalInfo
;
129 if (JobObjectInformationClass
== JobObjectBasicLimitInformation
)
131 ExpectedSize
= sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION
);
132 JobInfo
= &LocalInfo
;
134 else if (JobObjectInformationClass
== JobObjectExtendedLimitInformation
)
136 ExpectedSize
= sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION
);
137 JobInfo
= &LocalInfo
;
141 ExpectedSize
= cbJobObjectInformationLength
;
142 JobInfo
= lpJobObjectInformation
;
145 if (cbJobObjectInformationLength
!= ExpectedSize
)
147 BaseSetLastNTError(STATUS_INFO_LENGTH_MISMATCH
);
151 Status
= NtQueryInformationJobObject(hJob
,
152 JobObjectInformationClass
,
156 if (NT_SUCCESS(Status
))
158 if (JobInfo
!= &LocalInfo
) return TRUE
;
160 switch (LocalInfo
.BasicLimitInformation
.PriorityClass
)
162 case PROCESS_PRIORITY_CLASS_IDLE
:
163 LocalInfo
.BasicLimitInformation
.PriorityClass
=
167 case PROCESS_PRIORITY_CLASS_BELOW_NORMAL
:
168 LocalInfo
.BasicLimitInformation
.PriorityClass
=
169 BELOW_NORMAL_PRIORITY_CLASS
;
172 case PROCESS_PRIORITY_CLASS_NORMAL
:
173 LocalInfo
.BasicLimitInformation
.PriorityClass
=
174 NORMAL_PRIORITY_CLASS
;
177 case PROCESS_PRIORITY_CLASS_ABOVE_NORMAL
:
178 LocalInfo
.BasicLimitInformation
.PriorityClass
=
179 ABOVE_NORMAL_PRIORITY_CLASS
;
182 case PROCESS_PRIORITY_CLASS_HIGH
:
183 LocalInfo
.BasicLimitInformation
.PriorityClass
=
187 case PROCESS_PRIORITY_CLASS_REALTIME
:
188 LocalInfo
.BasicLimitInformation
.PriorityClass
=
189 REALTIME_PRIORITY_CLASS
;
193 LocalInfo
.BasicLimitInformation
.PriorityClass
=
194 NORMAL_PRIORITY_CLASS
;
198 RtlCopyMemory(lpJobObjectInformation
, &LocalInfo
, ExpectedSize
);
202 BaseSetLastNTError(Status
);
211 SetInformationJobObject(IN HANDLE hJob
,
212 IN JOBOBJECTINFOCLASS JobObjectInformationClass
,
213 IN LPVOID lpJobObjectInformation
,
214 IN DWORD cbJobObjectInformationLength
)
218 JOBOBJECT_EXTENDED_LIMIT_INFORMATION LocalInfo
;
221 ULONG Privilege
= SE_INC_BASE_PRIORITY_PRIVILEGE
;
223 if (JobObjectInformationClass
== JobObjectBasicLimitInformation
)
225 ExpectedSize
= sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION
);
226 JobInfo
= &LocalInfo
;
228 else if (JobObjectInformationClass
== JobObjectExtendedLimitInformation
)
230 ExpectedSize
= sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION
);
231 JobInfo
= &LocalInfo
;
235 ExpectedSize
= cbJobObjectInformationLength
;
236 JobInfo
= lpJobObjectInformation
;
239 if (cbJobObjectInformationLength
!= ExpectedSize
)
241 BaseSetLastNTError(STATUS_INFO_LENGTH_MISMATCH
);
245 if (JobInfo
== &LocalInfo
)
247 RtlCopyMemory(&LocalInfo
, lpJobObjectInformation
, ExpectedSize
);
249 if (LocalInfo
.BasicLimitInformation
.LimitFlags
&
250 JOB_OBJECT_LIMIT_PRIORITY_CLASS
)
252 switch (LocalInfo
.BasicLimitInformation
.PriorityClass
)
254 case IDLE_PRIORITY_CLASS
:
255 LocalInfo
.BasicLimitInformation
.PriorityClass
=
256 PROCESS_PRIORITY_CLASS_IDLE
;
259 case BELOW_NORMAL_PRIORITY_CLASS
:
260 LocalInfo
.BasicLimitInformation
.PriorityClass
=
261 PROCESS_PRIORITY_CLASS_BELOW_NORMAL
;
264 case NORMAL_PRIORITY_CLASS
:
265 LocalInfo
.BasicLimitInformation
.PriorityClass
=
266 PROCESS_PRIORITY_CLASS_NORMAL
;
269 case ABOVE_NORMAL_PRIORITY_CLASS
:
270 LocalInfo
.BasicLimitInformation
.PriorityClass
=
271 PROCESS_PRIORITY_CLASS_ABOVE_NORMAL
;
274 case HIGH_PRIORITY_CLASS
:
275 LocalInfo
.BasicLimitInformation
.PriorityClass
=
276 PROCESS_PRIORITY_CLASS_HIGH
;
279 case REALTIME_PRIORITY_CLASS
:
280 LocalInfo
.BasicLimitInformation
.PriorityClass
=
281 PROCESS_PRIORITY_CLASS_REALTIME
;
285 LocalInfo
.BasicLimitInformation
.PriorityClass
=
286 PROCESS_PRIORITY_CLASS_NORMAL
;
291 if (LocalInfo
.BasicLimitInformation
.LimitFlags
&
292 JOB_OBJECT_LIMIT_WORKINGSET
)
294 Status
= RtlAcquirePrivilege(&Privilege
, TRUE
, FALSE
, &State
);
298 Status
= NtSetInformationJobObject(hJob
,
299 JobObjectInformationClass
,
302 if (NT_SUCCESS(Status
))
304 if (State
!= NULL
) RtlReleasePrivilege(State
);
308 BaseSetLastNTError(Status
);
317 TerminateJobObject(IN HANDLE hJob
,
322 Status
= NtTerminateJobObject(hJob
, uExitCode
);
323 if (!NT_SUCCESS(Status
))
325 BaseSetLastNTError(Status
);
337 CreateJobSet(IN ULONG NumJob
,
338 IN PJOB_SET_ARRAY UserJobSet
,
343 Status
= NtCreateJobSet(NumJob
, UserJobSet
, Flags
);
344 if (!NT_SUCCESS(Status
))
346 BaseSetLastNTError(Status
);