ReactOS 0.4.17-dev-804-g023d8af
job.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/job.c
5 * PURPOSE: Job functions
6 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
7 * UPDATE HISTORY:
8 * Created 9/23/2004
9 */
10
11/* INCLUDES *******************************************************************/
12
13#include <k32.h>
14#include <winspool.h>
15
16#define NDEBUG
17#include <debug.h>
18
19/* FUNCTIONS ******************************************************************/
20
21/*
22 * @implemented
23 */
27 _In_ LPSECURITY_ATTRIBUTES lpJobAttributes,
29{
30 /* Call the W(ide) function */
31 ConvertWin32AnsiObjectApiToUnicodeApi(JobObject, lpName, lpJobAttributes);
32}
33
34/*
35 * @implemented
36 */
40 _In_ LPSECURITY_ATTRIBUTES lpJobAttributes,
42{
43 /* Create the NT object */
44 CreateNtObjectFromWin32Api(JobObject, JobObject, JOB_OBJECT_ALL_ACCESS, lpJobAttributes, lpName);
45}
46
47/*
48 * @implemented
49 */
53 _In_ DWORD dwDesiredAccess,
56{
57 /* Open the NT object */
58 OpenNtObjectFromWin32Api(JobObject, dwDesiredAccess, bInheritHandle, lpName);
59}
60
61
62/*
63 * @implemented
64 */
68 _In_ DWORD dwDesiredAccess,
71{
72 /* Call the W(ide) function */
74}
75
76/*
77 * @implemented
78 */
79BOOL
83 _In_opt_ HANDLE JobHandle,
85{
87
89 if (NT_SUCCESS(Status))
90 {
92 return TRUE;
93 }
94
96 return FALSE;
97}
98
99/*
100 * @implemented
101 */
102BOOL
103WINAPI
105 _In_ HANDLE hJob,
107{
109
111 if (!NT_SUCCESS(Status))
112 {
114 return FALSE;
115 }
116
117 return TRUE;
118}
119
120/*
121 * @implemented
122 */
123BOOL
124WINAPI
126 _In_opt_ HANDLE hJob,
127 _In_ JOBOBJECTINFOCLASS JobObjectInformationClass,
128 _Out_writes_bytes_to_(cbJobObjectInformationLength, *lpReturnLength)
129 LPVOID lpJobObjectInformation,
130 _In_ DWORD cbJobObjectInformationLength,
131 _Out_opt_ LPDWORD lpReturnLength)
132{
134 PVOID JobInfo;
136 ULONG ExpectedSize;
137
138 if (JobObjectInformationClass == JobObjectBasicLimitInformation)
139 {
140 ExpectedSize = sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION);
141 JobInfo = &LocalInfo;
142 }
143 else if (JobObjectInformationClass == JobObjectExtendedLimitInformation)
144 {
145 ExpectedSize = sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION);
146 JobInfo = &LocalInfo;
147 }
148 else
149 {
150 ExpectedSize = cbJobObjectInformationLength;
151 JobInfo = lpJobObjectInformation;
152 }
153
154 if (cbJobObjectInformationLength != ExpectedSize)
155 {
157 return FALSE;
158 }
159
161 JobObjectInformationClass,
162 JobInfo,
163 ExpectedSize,
164 lpReturnLength);
165 if (NT_SUCCESS(Status))
166 {
167 if (JobInfo != &LocalInfo) return TRUE;
168
169 switch (LocalInfo.BasicLimitInformation.PriorityClass)
170 {
174 break;
175
179 break;
180
184 break;
185
189 break;
190
194 break;
195
199 break;
200
201 default:
204 break;
205 }
206
207 RtlCopyMemory(lpJobObjectInformation, &LocalInfo, ExpectedSize);
208 return TRUE;
209 }
210
212 return FALSE;
213}
214
215/*
216 * @implemented
217 */
218BOOL
219WINAPI
221 _In_ HANDLE hJob,
222 _In_ JOBOBJECTINFOCLASS JobObjectInformationClass,
223 _In_reads_bytes_(cbJobObjectInformationLength) LPVOID lpJobObjectInformation,
224 _In_ DWORD cbJobObjectInformationLength)
225{
227 PVOID JobInfo;
229 ULONG ExpectedSize;
230 PVOID State = NULL;
232
233 if (JobObjectInformationClass == JobObjectBasicLimitInformation)
234 {
235 ExpectedSize = sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION);
236 JobInfo = &LocalInfo;
237 }
238 else if (JobObjectInformationClass == JobObjectExtendedLimitInformation)
239 {
240 ExpectedSize = sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION);
241 JobInfo = &LocalInfo;
242 }
243 else
244 {
245 ExpectedSize = cbJobObjectInformationLength;
246 JobInfo = lpJobObjectInformation;
247 }
248
249 if (cbJobObjectInformationLength != ExpectedSize)
250 {
252 return FALSE;
253 }
254
255 if (JobInfo == &LocalInfo)
256 {
257 RtlCopyMemory(&LocalInfo, lpJobObjectInformation, ExpectedSize);
258
259 if (LocalInfo.BasicLimitInformation.LimitFlags &
261 {
262 switch (LocalInfo.BasicLimitInformation.PriorityClass)
263 {
267 break;
268
272 break;
273
277 break;
278
282 break;
283
287 break;
288
292 break;
293
294 default:
297 break;
298 }
299 }
300
301 if (LocalInfo.BasicLimitInformation.LimitFlags &
303 {
305 }
306 }
307
309 JobObjectInformationClass,
310 JobInfo,
311 ExpectedSize);
312 if (NT_SUCCESS(Status))
313 {
315 return TRUE;
316 }
317
319 return FALSE;
320}
321
322/*
323 * @implemented
324 */
325BOOL
326WINAPI
328 _In_ HANDLE hJob,
329 _In_ UINT uExitCode)
330{
332
333 Status = NtTerminateJobObject(hJob, uExitCode);
334 if (!NT_SUCCESS(Status))
335 {
337 return FALSE;
338 }
339
340 return TRUE;
341}
342
343/*
344 * @implemented
345 */
346BOOL
347WINAPI
349 IN PJOB_SET_ARRAY UserJobSet,
350 IN ULONG Flags)
351{
353
354 Status = NtCreateJobSet(NumJob, UserJobSet, Flags);
355 if (!NT_SUCCESS(Status))
356 {
358 return FALSE;
359 }
360
361 return TRUE;
362}
363
364/* EOF */
LONG NTSTATUS
Definition: precomp.h:26
#define ConvertWin32AnsiObjectApiToUnicodeApi(obj, name,...)
Definition: base_x.h:54
#define ConvertOpenWin32AnsiObjectApiToUnicodeApi(obj, acc, inh, name)
Definition: base_x.h:86
#define CreateNtObjectFromWin32Api(obj, ntobj, access, sec, name,...)
Definition: base_x.h:135
#define OpenNtObjectFromWin32Api(ntobj, acc, inh, name)
Definition: base_x.h:143
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
BOOL WINAPI TerminateJobObject(_In_ HANDLE hJob, _In_ UINT uExitCode)
Definition: job.c:327
BOOL WINAPI SetInformationJobObject(_In_ HANDLE hJob, _In_ JOBOBJECTINFOCLASS JobObjectInformationClass, _In_reads_bytes_(cbJobObjectInformationLength) LPVOID lpJobObjectInformation, _In_ DWORD cbJobObjectInformationLength)
Definition: job.c:220
HANDLE WINAPI CreateJobObjectW(_In_ LPSECURITY_ATTRIBUTES lpJobAttributes, _In_ LPCWSTR lpName)
Definition: job.c:39
BOOL WINAPI IsProcessInJob(_In_ HANDLE ProcessHandle, _In_opt_ HANDLE JobHandle, _Out_ PBOOL Result)
Definition: job.c:81
BOOL WINAPI CreateJobSet(IN ULONG NumJob, IN PJOB_SET_ARRAY UserJobSet, IN ULONG Flags)
Definition: job.c:348
BOOL WINAPI AssignProcessToJobObject(_In_ HANDLE hJob, _In_ HANDLE hProcess)
Definition: job.c:104
HANDLE WINAPI OpenJobObjectA(_In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCSTR lpName)
Definition: job.c:67
BOOL WINAPI QueryInformationJobObject(_In_opt_ HANDLE hJob, _In_ JOBOBJECTINFOCLASS JobObjectInformationClass, _Out_writes_bytes_to_(cbJobObjectInformationLength, *lpReturnLength) LPVOID lpJobObjectInformation, _In_ DWORD cbJobObjectInformationLength, _Out_opt_ LPDWORD lpReturnLength)
Definition: job.c:125
HANDLE WINAPI OpenJobObjectW(_In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCWSTR lpName)
Definition: job.c:52
HANDLE WINAPI CreateJobObjectA(_In_ LPSECURITY_ATTRIBUTES lpJobAttributes, _In_ LPCSTR lpName)
Definition: job.c:26
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:24
unsigned int UINT
Definition: sysinfo.c:13
#define PROCESS_PRIORITY_CLASS_IDLE
Definition: pstypes.h:103
#define JOB_OBJECT_ALL_ACCESS
Definition: pstypes.h:201
#define JOB_OBJECT_LIMIT_WORKINGSET
Definition: pstypes.h:208
#define PROCESS_PRIORITY_CLASS_NORMAL
Definition: pstypes.h:104
#define PROCESS_PRIORITY_CLASS_HIGH
Definition: pstypes.h:105
#define PROCESS_PRIORITY_CLASS_ABOVE_NORMAL
Definition: pstypes.h:108
enum _JOBOBJECTINFOCLASS JOBOBJECTINFOCLASS
#define JOB_OBJECT_LIMIT_PRIORITY_CLASS
Definition: pstypes.h:213
@ JobObjectBasicLimitInformation
Definition: pstypes.h:493
@ JobObjectExtendedLimitInformation
Definition: pstypes.h:500
struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION JOBOBJECT_EXTENDED_LIMIT_INFORMATION
#define PROCESS_PRIORITY_CLASS_BELOW_NORMAL
Definition: pstypes.h:107
#define PROCESS_PRIORITY_CLASS_REALTIME
Definition: pstypes.h:106
struct _JOBOBJECT_BASIC_LIMIT_INFORMATION JOBOBJECT_BASIC_LIMIT_INFORMATION
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
BOOL * PBOOL
Definition: minwindef.h:137
#define SE_INC_BASE_PRIORITY_PRIVILEGE
Definition: security.c:568
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:407
NTSYSAPI NTSTATUS NTAPI RtlAcquirePrivilege(_In_ PULONG Privilege, _In_ ULONG NumPriv, _In_ ULONG Flags, _Out_ PVOID *ReturnedState)
NTSYSAPI VOID NTAPI RtlReleasePrivilege(_In_ PVOID ReturnedState)
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _Out_opt_
Definition: no_sal2.h:214
#define _Out_writes_bytes_to_(s, c)
Definition: no_sal2.h:190
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
static BOOL bInheritHandle
Definition: pipe.c:110
NTSTATUS NTAPI NtSetInformationJobObject(_In_ HANDLE JobHandle, _In_ JOBOBJECTINFOCLASS JobInformationClass, _In_reads_bytes_(JobInformationLength) PVOID JobInformation, _In_ ULONG JobInformationLength)
Definition: job.c:2406
NTSTATUS NTAPI NtTerminateJobObject(_In_ HANDLE JobHandle, _In_ NTSTATUS ExitStatus)
Definition: job.c:2118
NTSTATUS NTAPI NtQueryInformationJobObject(_In_opt_ HANDLE JobHandle, _In_ JOBOBJECTINFOCLASS JobInformationClass, _Out_writes_bytes_(JobInformationLength) PVOID JobInformation, _In_ ULONG JobInformationLength, _Out_opt_ PULONG ReturnLength)
Definition: job.c:2179
NTSTATUS NTAPI NtIsProcessInJob(_In_ HANDLE ProcessHandle, _In_opt_ HANDLE JobHandle)
Definition: job.c:2014
NTSTATUS NTAPI NtAssignProcessToJobObject(_In_ HANDLE JobHandle, _In_ HANDLE ProcessHandle)
Definition: job.c:1928
NTSTATUS NTAPI NtCreateJobSet(IN ULONG NumJob, IN PJOB_SET_ARRAY UserJobSet, IN ULONG Flags)
Definition: job.c:1834
#define STATUS_PROCESS_IN_JOB
Definition: ntstatus.h:161
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:167
JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation
Definition: pstypes.h:1741
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t * LPDWORD
Definition: typedefs.h:59
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable)
Definition: user_lib.cpp:531
#define NORMAL_PRIORITY_CLASS
Definition: winbase.h:186
#define REALTIME_PRIORITY_CLASS
Definition: winbase.h:189
#define BELOW_NORMAL_PRIORITY_CLASS
Definition: winbase.h:195
_In_ LPCSTR lpName
Definition: winbase.h:2519
#define HIGH_PRIORITY_CLASS
Definition: winbase.h:188
#define IDLE_PRIORITY_CLASS
Definition: winbase.h:187
#define ABOVE_NORMAL_PRIORITY_CLASS
Definition: winbase.h:196
#define WINAPI
Definition: msvc.h:6
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409