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>
15 #include <napi/i386/segment.h>
16 #include <ntdll/ldr.h>
17 #include <ntdll/base.h>
18 #include <ntdll/rtl.h>
21 #include <ntdll/ntdll.h>
23 /* FUNCTIONS ****************************************************************/
25 static NTSTATUS RtlpCreateFirstThread
30 LPTHREAD_START_ROUTINE lpStartAddress,
35 return RtlCreateUserThread
51 RtlpMapFile(PRTL_USER_PROCESS_PARAMETERS Ppb,
57 IO_STATUS_BLOCK IoStatusBlock;
58 OBJECT_ATTRIBUTES ObjectAttributes;
59 PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
67 RtlDeNormalizeProcessParams (Ppb);
69 // DbgPrint("ImagePathName %x\n", Ppb->ImagePathName.Buffer);
71 InitializeObjectAttributes(&ObjectAttributes,
72 &(Ppb->ImagePathName),
73 Attributes & (OBJ_CASE_INSENSITIVE | OBJ_INHERIT),
77 RtlNormalizeProcessParams (Ppb);
82 // DbgPrint("ImagePathName %x\n", Ppb->ImagePathName.Buffer);
83 // DbgPrint("ImagePathName %S\n", Ppb->ImagePathName.Buffer);
84 s = wcsrchr(Ppb->ImagePathName.Buffer, '\\');
87 s = Ppb->ImagePathName.Buffer;
98 for (i = 0; i < 8; i++)
100 ImageFileName[i] = (CHAR)(s[i]);
108 * Try to open the executable
111 Status = NtOpenFile(&hFile,
112 SYNCHRONIZE|FILE_EXECUTE|FILE_READ_DATA,
115 FILE_SHARE_DELETE|FILE_SHARE_READ,
116 FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE);
118 if (!NT_SUCCESS(Status))
123 Status = NtCreateSection(Section,
132 if (!NT_SUCCESS(Status))
137 return(STATUS_SUCCESS);
140 static NTSTATUS KlInitPeb (HANDLE ProcessHandle,
141 PRTL_USER_PROCESS_PARAMETERS Ppb,
142 PVOID* ImageBaseAddress)
152 /* create the Environment */
153 if (Ppb->Environment != NULL)
155 MEMORY_BASIC_INFORMATION MemInfo;
157 Status = NtQueryVirtualMemory (NtCurrentProcess (),
159 MemoryBasicInformation,
161 sizeof(MEMORY_BASIC_INFORMATION),
163 if (!NT_SUCCESS(Status))
167 EnvSize = MemInfo.RegionSize;
169 DPRINT("EnvironmentSize %ld\n", EnvSize);
171 /* allocate and initialize new environment block */
174 Status = NtAllocateVirtualMemory(ProcessHandle,
178 MEM_RESERVE | MEM_COMMIT,
180 if (!NT_SUCCESS(Status))
185 NtWriteVirtualMemory(ProcessHandle,
191 DPRINT("EnvironmentPointer %p\n", EnvPtr);
195 PpbSize = Ppb->AllocationSize;
197 Status = NtAllocateVirtualMemory(ProcessHandle,
201 MEM_RESERVE | MEM_COMMIT,
203 if (!NT_SUCCESS(Status))
208 DPRINT("Ppb->MaximumLength %x\n", Ppb->AllocationSize);
210 /* write process parameters block*/
211 RtlDeNormalizeProcessParams (Ppb);
212 NtWriteVirtualMemory(ProcessHandle,
218 RtlNormalizeProcessParams (Ppb);
220 /* write pointer to environment */
221 Offset = FIELD_OFFSET(RTL_USER_PROCESS_PARAMETERS, Environment);
222 NtWriteVirtualMemory(ProcessHandle,
223 (PVOID)(PpbBase + Offset),
228 /* write pointer to process parameter block */
229 Offset = FIELD_OFFSET(PEB, ProcessParameters);
230 NtWriteVirtualMemory(ProcessHandle,
231 (PVOID)(PEB_BASE + Offset),
236 /* Read image base address. */
237 Offset = FIELD_OFFSET(PEB, ImageBaseAddress);
238 NtReadVirtualMemory(ProcessHandle,
239 (PVOID)(PEB_BASE + Offset),
244 return(STATUS_SUCCESS);
251 RtlCreateUserProcess(PUNICODE_STRING ImageFileName,
253 PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
254 PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
255 PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
256 HANDLE ParentProcess,
257 BOOLEAN CurrentDirectory,
259 HANDLE ExceptionPort,
260 PRTL_PROCESS_INFO ProcessInfo)
264 PROCESS_BASIC_INFORMATION ProcessBasicInfo;
267 SECTION_IMAGE_INFORMATION Sii;
269 PVOID ImageBaseAddress;
271 DPRINT("RtlCreateUserProcess\n");
273 Status = RtlpMapFile(ProcessParameters,
277 if( !NT_SUCCESS( Status ) )
281 * Create a new process
283 if (ParentProcess == NULL)
284 ParentProcess = NtCurrentProcess();
286 Status = NtCreateProcess(&(ProcessInfo->ProcessHandle),
294 if (!NT_SUCCESS(Status))
301 * Get some information about the process
303 NtQueryInformationProcess(ProcessInfo->ProcessHandle,
304 ProcessBasicInformation,
306 sizeof(ProcessBasicInfo),
308 DPRINT("ProcessBasicInfo.UniqueProcessId %d\n",
309 ProcessBasicInfo.UniqueProcessId);
310 ProcessInfo->ClientId.UniqueProcess = (HANDLE)ProcessBasicInfo.UniqueProcessId;
312 Status = NtSetInformationProcess(ProcessInfo->ProcessHandle,
313 ProcessImageFileName,
318 * Create Process Environment Block
320 DPRINT("Creating peb\n");
321 KlInitPeb(ProcessInfo->ProcessHandle,
325 Status = NtQuerySection(hSection,
326 SectionImageInformation,
330 if (!NT_SUCCESS(Status) || ResultLength != sizeof(Sii))
332 DPRINT("Failed to get section image information.\n");
337 DPRINT("Creating thread for process\n");
338 Status = RtlpCreateFirstThread(ProcessInfo->ProcessHandle,
341 ImageBaseAddress + (ULONG)Sii.EntryPoint,
342 &ProcessInfo->ClientId,
343 &ProcessInfo->ThreadHandle);
344 if (!NT_SUCCESS(Status))
346 DPRINT("Failed to create thread\n");
351 return(STATUS_SUCCESS);