2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ps/jobs.c
5 * PURPOSE: Job Native Functions
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
11 /* Note: Jobs are only supported on Win2K+ */
12 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
17 /* GLOBALS *******************************************************************/
19 POBJECT_TYPE EXPORTED PsJobType
= NULL
;
21 LIST_ENTRY PsJobListHead
;
22 static KSPIN_LOCK PsJobListLock
;
24 static GENERIC_MAPPING PiJobMapping
= {STANDARD_RIGHTS_READ
| JOB_OBJECT_QUERY
,
25 STANDARD_RIGHTS_WRITE
| JOB_OBJECT_ASSIGN_PROCESS
| JOB_OBJECT_SET_ATTRIBUTES
| JOB_OBJECT_TERMINATE
| JOB_OBJECT_SET_SECURITY_ATTRIBUTES
,
26 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
,
27 STANDARD_RIGHTS_ALL
| JOB_OBJECT_ALL_ACCESS
};
29 /* FUNCTIONS *****************************************************************/
32 PiDeleteJob(PVOID ObjectBody
)
35 PEJOB Job
= (PEJOB
)ObjectBody
;
37 KeAcquireSpinLock(&PsJobListLock
, &oldIrql
);
38 RemoveEntryList(&Job
->JobLinks
);
39 KeReleaseSpinLock(&PsJobListLock
, oldIrql
);
43 PsInitJobManagment(VOID
)
45 PsJobType
= ExAllocatePool(NonPagedPool
, sizeof(OBJECT_TYPE
));
47 PsJobType
->Tag
= TAG('E', 'J', 'O', 'B');
48 PsJobType
->TotalObjects
= 0;
49 PsJobType
->TotalHandles
= 0;
50 PsJobType
->MaxObjects
= ULONG_MAX
;
51 PsJobType
->MaxHandles
= ULONG_MAX
;
52 PsJobType
->PagedPoolCharge
= 0;
53 PsJobType
->NonpagedPoolCharge
= sizeof(EJOB
);
54 PsJobType
->Mapping
= &PiJobMapping
;
55 PsJobType
->Dump
= NULL
;
56 PsJobType
->Open
= NULL
;
57 PsJobType
->Close
= NULL
;
58 PsJobType
->Delete
= PiDeleteJob
;
59 PsJobType
->Parse
= NULL
;
60 PsJobType
->Security
= NULL
;
61 PsJobType
->QueryName
= NULL
;
62 PsJobType
->OkayToClose
= NULL
;
63 PsJobType
->Create
= NULL
;
64 PsJobType
->DuplicationNotify
= NULL
;
66 RtlRosInitUnicodeStringFromLiteral(&PsJobType
->TypeName
, L
"Job");
68 ObpCreateTypeObject(PsJobType
);
70 InitializeListHead(&PsJobListHead
);
71 KeInitializeSpinLock(&PsJobListLock
);
79 NtAssignProcessToJobObject(HANDLE JobHandle
,
83 return STATUS_NOT_IMPLEMENTED
;
92 NtCreateJobObject(PHANDLE JobHandle
,
93 ACCESS_MASK DesiredAccess
,
94 POBJECT_ATTRIBUTES ObjectAttributes
)
97 return STATUS_NOT_IMPLEMENTED
;
106 NtIsProcessInJob(IN HANDLE ProcessHandle
,
107 IN HANDLE JobHandle OPTIONAL
)
109 KPROCESSOR_MODE PreviousMode
;
113 PreviousMode
= ExGetPreviousMode();
115 Status
= ObReferenceObjectByHandle(ProcessHandle
,
116 PROCESS_QUERY_INFORMATION
,
121 if(NT_SUCCESS(Status
))
123 /* FIXME - make sure the job object doesn't get exchanged or deleted while trying to
124 reference it, e.g. by locking it somehow until it is referenced... */
126 PEJOB ProcessJob
= Process
->Job
;
128 if(ProcessJob
!= NULL
)
130 if(JobHandle
== NULL
)
132 /* the process is assigned to a job */
133 Status
= STATUS_PROCESS_IN_JOB
;
135 else /* JobHandle != NULL */
139 /* get the job object and compare the object pointer with the one assigned to the process */
140 Status
= ObReferenceObjectByHandle(JobHandle
,
146 if(NT_SUCCESS(Status
))
148 Status
= ((ProcessJob
== JobObject
) ? STATUS_PROCESS_IN_JOB
: STATUS_PROCESS_NOT_IN_JOB
);
149 ObDereferenceObject(JobObject
);
155 /* the process is not assigned to any job */
156 Status
= STATUS_PROCESS_NOT_IN_JOB
;
158 ObDereferenceObject(Process
);
170 NtOpenJobObject(PHANDLE JobHandle
,
171 ACCESS_MASK DesiredAccess
,
172 POBJECT_ATTRIBUTES ObjectAttributes
)
175 return STATUS_NOT_IMPLEMENTED
;
184 NtQueryInformationJobObject(HANDLE JobHandle
,
185 JOBOBJECTINFOCLASS JobInformationClass
,
186 PVOID JobInformation
,
187 ULONG JobInformationLength
,
191 return STATUS_NOT_IMPLEMENTED
;
200 NtSetInformationJobObject(HANDLE JobHandle
,
201 JOBOBJECTINFOCLASS JobInformationClass
,
202 PVOID JobInformation
,
203 ULONG JobInformationLength
)
206 return STATUS_NOT_IMPLEMENTED
;
215 NtTerminateJobObject(HANDLE JobHandle
,
219 return STATUS_NOT_IMPLEMENTED
;
228 PsGetJobLock(PEJOB Job
)
231 return (PVOID
)&Job
->JobLock
;
240 PsGetJobSessionId(PEJOB Job
)
243 return (PVOID
)Job
->SessionId
;
252 PsGetJobUIRestrictionsClass(PEJOB Job
)
255 return Job
->UIRestrictionsClass
;
264 PsSetJobUIRestrictionsClass(PEJOB Job
,
265 ULONG UIRestrictionsClass
)
268 InterlockedExchangeUL(&Job
->UIRestrictionsClass
, UIRestrictionsClass
);
269 /* FIXME - walk through the job process list and update the restrictions? */