2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ps/process.c
5 * PURPOSE: Process managment
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES ******************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/ob.h>
15 #include <internal/mm.h>
16 #include <internal/string.h>
19 #include <internal/debug.h>
21 /* GLOBALS ******************************************************************/
23 PEPROCESS SystemProcess
= NULL
;
24 HANDLE SystemProcessHandle
= NULL
;
26 POBJECT_TYPE PsProcessType
= NULL
;
28 /* FUNCTIONS *****************************************************************/
30 VOID
PsInitProcessManagment(VOID
)
32 ANSI_STRING AnsiString
;
36 * Register the process object type
39 PsProcessType
= ExAllocatePool(NonPagedPool
, sizeof(OBJECT_TYPE
));
41 PsProcessType
->TotalObjects
= 0;
42 PsProcessType
->TotalHandles
= 0;
43 PsProcessType
->MaxObjects
= ULONG_MAX
;
44 PsProcessType
->MaxHandles
= ULONG_MAX
;
45 PsProcessType
->PagedPoolCharge
= 0;
46 PsProcessType
->NonpagedPoolCharge
= sizeof(EPROCESS
);
47 PsProcessType
->Dump
= NULL
;
48 PsProcessType
->Open
= NULL
;
49 PsProcessType
->Close
= NULL
;
50 PsProcessType
->Delete
= NULL
;
51 PsProcessType
->Parse
= NULL
;
52 PsProcessType
->Security
= NULL
;
53 PsProcessType
->QueryName
= NULL
;
54 PsProcessType
->OkayToClose
= NULL
;
56 RtlInitAnsiString(&AnsiString
,"Process");
57 RtlAnsiStringToUnicodeString(&PsProcessType
->TypeName
,&AnsiString
,TRUE
);
60 * Initialize the system process
62 SystemProcess
= ObGenericCreateObject(NULL
,PROCESS_ALL_ACCESS
,NULL
,
64 KProcess
= &SystemProcess
->Pcb
;
66 InitializeListHead(&(KProcess
->MemoryAreaList
));
67 ObInitializeHandleTable(NULL
,FALSE
,KProcess
);
68 KProcess
->PageTableDirectory
= get_page_directory();
70 SystemProcessHandle
= ObInsertHandle(KProcess
,SystemProcess
,
71 PROCESS_ALL_ACCESS
,FALSE
);
74 PKPROCESS
KeGetCurrentProcess(VOID
)
76 * FUNCTION: Returns a pointer to the current process
79 return(&(PsGetCurrentProcess()->Pcb
));
82 struct _EPROCESS
* PsGetCurrentProcess(VOID
)
84 * FUNCTION: Returns a pointer to the current process
87 if (PsGetCurrentThread()==NULL
88 || PsGetCurrentThread()->ThreadsProcess
==NULL
)
90 return(SystemProcess
);
94 return(PsGetCurrentThread()->ThreadsProcess
);
98 NTSTATUS STDCALL
NtCreateProcess(
99 OUT PHANDLE ProcessHandle
,
100 IN ACCESS_MASK DesiredAccess
,
101 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
102 IN HANDLE ParentProcessHandle
,
103 IN BOOLEAN InheritObjectTable
,
104 IN HANDLE SectionHandle OPTIONAL
,
105 IN HANDLE DebugPort OPTIONAL
,
106 IN HANDLE ExceptionPort OPTIONAL
)
108 return(ZwCreateProcess(ProcessHandle
,
118 NTSTATUS STDCALL
ZwCreateProcess(
119 OUT PHANDLE ProcessHandle
,
120 IN ACCESS_MASK DesiredAccess
,
121 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
122 IN HANDLE ParentProcessHandle
,
123 IN BOOLEAN InheritObjectTable
,
124 IN HANDLE SectionHandle OPTIONAL
,
125 IN HANDLE DebugPort OPTIONAL
,
126 IN HANDLE ExceptionPort OPTIONAL
)
128 * FUNCTION: Creates a process.
130 * ProcessHandle (OUT) = Caller supplied storage for the resulting
132 * DesiredAccess = Specifies the allowed or desired access to the
133 * process can be a combination of
134 * STANDARD_RIGHTS_REQUIRED| ..
135 * ObjectAttribute = Initialized attributes for the object, contains
136 * the rootdirectory and the filename
137 * ParentProcess = Handle to the parent process.
138 * InheritObjectTable = Specifies to inherit the objects of the parent
140 * SectionHandle = Handle to a section object to back the image file
141 * DebugPort = Handle to a DebugPort if NULL the system default debug
143 * ExceptionPort = Handle to a exception port.
145 * This function maps to the win32 CreateProcess.
150 PEPROCESS ParentProcess
;
151 PULONG PageDirectory
;
152 PULONG CurrentPageDirectory
;
157 LARGE_INTEGER Offset
;
160 DPRINT("ZwCreateProcess(ObjectAttributes %x)\n",ObjectAttributes
);
162 Status
= ObReferenceObjectByHandle(ParentProcessHandle
,
163 PROCESS_CREATE_PROCESS
,
166 &ParentProcessHandle
,
169 if (Status
!= STATUS_SUCCESS
)
171 DPRINT("ZwCreateProcess() = %x\n",Status
);
175 Process
= ObGenericCreateObject(ProcessHandle
,
179 KeInitializeDispatcherHeader(&Process
->Pcb
.DispatcherHeader
,
183 KProcess
= &(Process
->Pcb
);
185 InitializeListHead(&(KProcess
->MemoryAreaList
));
186 ObInitializeHandleTable(KProcess
,InheritObjectTable
,KProcess
);
188 PageDirectory
= physical_to_linear((ULONG
)get_free_page());
189 KProcess
->PageTableDirectory
= PageDirectory
;
191 CurrentPageDirectory
= get_page_directory();
193 memset(PageDirectory
,0,PAGESIZE
);
194 for (i
=768;i
<1024;i
++)
196 PageDirectory
[i
]=CurrentPageDirectory
[i
];
200 * FIXME: I don't what I'm supposed to know with a section handle
202 if (SectionHandle
!= NULL
)
204 DbgPrint("ZwCreateProcess() non-NULL SectionHandle\n");
205 return(STATUS_UNSUCCESSFUL
);
208 Process
->Pcb
.ProcessState
= PROCESS_STATE_ACTIVE
;
210 return(STATUS_SUCCESS
);
214 NTSTATUS STDCALL
NtOpenProcess (OUT PHANDLE ProcessHandle
,
215 IN ACCESS_MASK DesiredAccess
,
216 IN POBJECT_ATTRIBUTES ObjectAttributes
,
217 IN PCLIENT_ID ClientId
)
219 return(ZwOpenProcess(ProcessHandle
,
225 NTSTATUS STDCALL
ZwOpenProcess (OUT PHANDLE ProcessHandle
,
226 IN ACCESS_MASK DesiredAccess
,
227 IN POBJECT_ATTRIBUTES ObjectAttributes
,
228 IN PCLIENT_ID ClientId
)
233 NTSTATUS STDCALL
NtQueryInformationProcess(IN HANDLE ProcessHandle
,
234 IN CINT ProcessInformationClass
,
235 OUT PVOID ProcessInformation
,
236 IN ULONG ProcessInformationLength
,
237 OUT PULONG ReturnLength
)
239 return(ZwQueryInformationProcess(ProcessHandle
,
240 ProcessInformationClass
,
242 ProcessInformationLength
,
246 NTSTATUS STDCALL
ZwQueryInformationProcess(IN HANDLE ProcessHandle
,
247 IN CINT ProcessInformationClass
,
248 OUT PVOID ProcessInformation
,
249 IN ULONG ProcessInformationLength
,
250 OUT PULONG ReturnLength
)
255 Status
= ObReferenceObjectByHandle(ProcessHandle
,
256 PROCESS_QUERY_INFORMATION
,
261 if (Status
!= STATUS_SUCCESS
)
266 switch (ProcessInformationClass
)
268 case ProcessBasicInformation
:
269 case ProcessQuotaLimits
:
270 case ProcessIoCounters
:
271 case ProcessVmCounters
:
273 case ProcessBasePriority
:
274 case ProcessRaisePriority
:
275 case ProcessDebugPort
:
276 case ProcessExceptionPort
:
277 case ProcessAccessToken
:
278 case ProcessLdtInformation
:
280 case ProcessDefaultHardErrorMode
:
281 case ProcessIoPortHandlers
:
282 case ProcessWorkingSetWatch
:
283 case ProcessUserModeIOPL
:
284 case ProcessEnableAlignmentFaultFixup
:
285 case ProcessPriorityClass
:
286 case ProcessWx86Information
:
287 case ProcessHandleCount
:
288 case ProcessAffinityMask
:
290 Status
= STATUS_NOT_IMPLEMENTED
;
295 NTSTATUS STDCALL
NtSetInformationProcess(IN HANDLE ProcessHandle
,
296 IN CINT ProcessInformationClass
,
297 IN PVOID ProcessInformation
,
298 IN ULONG ProcessInformationLength
)
300 return(ZwSetInformationProcess(ProcessHandle
,
301 ProcessInformationClass
,
303 ProcessInformationLength
));
306 NTSTATUS STDCALL
ZwSetInformationProcess(IN HANDLE ProcessHandle
,
307 IN CINT ProcessInformationClass
,
308 IN PVOID ProcessInformation
,
309 IN ULONG ProcessInformationLength
)