3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/ntdll/rtl/process.c
6 * PURPOSE: Process functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
16 #include <napi/i386/segment.h>
17 #include <ntdll/ldr.h>
18 #include <ntdll/base.h>
19 #include <ntdll/rtl.h>
22 #include <ntdll/ntdll.h>
24 /* FUNCTIONS ****************************************************************/
26 static NTSTATUS RtlpCreateFirstThread
31 LPTHREAD_START_ROUTINE lpStartAddress
,
36 return RtlCreateUserThread
52 RtlpMapFile(PUNICODE_STRING ImageFileName
,
53 PRTL_USER_PROCESS_PARAMETERS Ppb
,
58 IO_STATUS_BLOCK IoStatusBlock
;
59 OBJECT_ATTRIBUTES ObjectAttributes
;
60 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
65 RtlDeNormalizeProcessParams (Ppb
);
67 // DbgPrint("ImagePathName %x\n", Ppb->ImagePathName.Buffer);
69 InitializeObjectAttributes(&ObjectAttributes
,
71 Attributes
& (OBJ_CASE_INSENSITIVE
| OBJ_INHERIT
),
75 RtlNormalizeProcessParams (Ppb
);
78 * Try to open the executable
81 Status
= NtOpenFile(&hFile
,
82 SYNCHRONIZE
|FILE_EXECUTE
|FILE_READ_DATA
,
85 FILE_SHARE_DELETE
|FILE_SHARE_READ
,
86 FILE_SYNCHRONOUS_IO_NONALERT
|FILE_NON_DIRECTORY_FILE
);
88 if (!NT_SUCCESS(Status
))
93 Status
= NtCreateSection(Section
,
102 if (!NT_SUCCESS(Status
))
107 return(STATUS_SUCCESS
);
110 static NTSTATUS
KlInitPeb (HANDLE ProcessHandle
,
111 PRTL_USER_PROCESS_PARAMETERS Ppb
,
112 PVOID
* ImageBaseAddress
)
122 /* create the Environment */
123 if (Ppb
->Environment
!= NULL
)
125 MEMORY_BASIC_INFORMATION MemInfo
;
127 Status
= NtQueryVirtualMemory (NtCurrentProcess (),
129 MemoryBasicInformation
,
131 sizeof(MEMORY_BASIC_INFORMATION
),
133 if (!NT_SUCCESS(Status
))
137 EnvSize
= MemInfo
.RegionSize
;
139 DPRINT("EnvironmentSize %ld\n", EnvSize
);
141 /* allocate and initialize new environment block */
144 Status
= NtAllocateVirtualMemory(ProcessHandle
,
148 MEM_RESERVE
| MEM_COMMIT
,
150 if (!NT_SUCCESS(Status
))
155 NtWriteVirtualMemory(ProcessHandle
,
161 DPRINT("EnvironmentPointer %p\n", EnvPtr
);
165 PpbSize
= Ppb
->AllocationSize
;
167 Status
= NtAllocateVirtualMemory(ProcessHandle
,
171 MEM_RESERVE
| MEM_COMMIT
,
173 if (!NT_SUCCESS(Status
))
178 DPRINT("Ppb->MaximumLength %x\n", Ppb
->AllocationSize
);
180 /* write process parameters block*/
181 RtlDeNormalizeProcessParams (Ppb
);
182 NtWriteVirtualMemory(ProcessHandle
,
188 RtlNormalizeProcessParams (Ppb
);
190 /* write pointer to environment */
191 Offset
= FIELD_OFFSET(RTL_USER_PROCESS_PARAMETERS
, Environment
);
192 NtWriteVirtualMemory(ProcessHandle
,
193 (PVOID
)(PpbBase
+ Offset
),
198 /* write pointer to process parameter block */
199 Offset
= FIELD_OFFSET(PEB
, ProcessParameters
);
200 NtWriteVirtualMemory(ProcessHandle
,
201 (PVOID
)(PEB_BASE
+ Offset
),
206 /* Read image base address. */
207 Offset
= FIELD_OFFSET(PEB
, ImageBaseAddress
);
208 NtReadVirtualMemory(ProcessHandle
,
209 (PVOID
)(PEB_BASE
+ Offset
),
214 return(STATUS_SUCCESS
);
221 RtlCreateUserProcess(PUNICODE_STRING ImageFileName
,
223 PRTL_USER_PROCESS_PARAMETERS ProcessParameters
,
224 PSECURITY_DESCRIPTOR ProcessSecurityDescriptor
,
225 PSECURITY_DESCRIPTOR ThreadSecurityDescriptor
,
226 HANDLE ParentProcess
,
227 BOOLEAN CurrentDirectory
,
229 HANDLE ExceptionPort
,
230 PRTL_PROCESS_INFO ProcessInfo
)
234 PROCESS_BASIC_INFORMATION ProcessBasicInfo
;
236 SECTION_IMAGE_INFORMATION Sii
;
238 PVOID ImageBaseAddress
;
240 DPRINT("RtlCreateUserProcess\n");
242 Status
= RtlpMapFile(ImageFileName
,
246 if( !NT_SUCCESS( Status
) )
250 * Create a new process
252 if (ParentProcess
== NULL
)
253 ParentProcess
= NtCurrentProcess();
255 Status
= NtCreateProcess(&(ProcessInfo
->ProcessHandle
),
263 if (!NT_SUCCESS(Status
))
270 * Get some information about the process
272 NtQueryInformationProcess(ProcessInfo
->ProcessHandle
,
273 ProcessBasicInformation
,
275 sizeof(ProcessBasicInfo
),
277 DPRINT("ProcessBasicInfo.UniqueProcessId %d\n",
278 ProcessBasicInfo
.UniqueProcessId
);
279 ProcessInfo
->ClientId
.UniqueProcess
= (HANDLE
)ProcessBasicInfo
.UniqueProcessId
;
282 * Create Process Environment Block
284 DPRINT("Creating peb\n");
285 KlInitPeb(ProcessInfo
->ProcessHandle
,
289 Status
= NtQuerySection(hSection
,
290 SectionImageInformation
,
294 if (!NT_SUCCESS(Status
) || ResultLength
!= sizeof(Sii
))
296 DPRINT("Failed to get section image information.\n");
301 DPRINT("Creating thread for process\n");
302 Status
= RtlpCreateFirstThread(ProcessInfo
->ProcessHandle
,
305 ImageBaseAddress
+ (ULONG
)Sii
.EntryPoint
,
306 &ProcessInfo
->ClientId
,
307 &ProcessInfo
->ThreadHandle
);
311 if (!NT_SUCCESS(Status
))
313 DPRINT("Failed to create thread\n");
317 return(STATUS_SUCCESS
);