1 /* $Id: proc.c,v 1.31 2000/03/16 01:14:37 ekohl Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/proc/proc.c
6 * PURPOSE: Process functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <ntdll/rtl.h>
17 #include <kernel32/proc.h>
18 #include <kernel32/thread.h>
21 #include <internal/i386/segment.h>
22 #include <internal/teb.h>
25 #include <kernel32/kernel32.h>
28 /* GLOBALS *******************************************************************/
30 WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle
;
32 LPSTARTUPINFO lpLocalStartupInfo
= NULL
;
36 RegisterWaitForInputIdle (
37 WaitForInputIdleType lpfnRegisterWaitForInputIdle
41 /* FUNCTIONS ****************************************************************/
58 LPFILETIME lpCreationTime
,
59 LPFILETIME lpExitTime
,
60 LPFILETIME lpKernelTime
,
64 DPRINT("GetProcessTimes is unimplemented\n");
69 HANDLE STDCALL
GetCurrentProcess (VOID
)
71 return((HANDLE
)NtCurrentProcess());
75 HANDLE STDCALL
GetCurrentThread (VOID
)
77 return((HANDLE
)NtCurrentThread());
81 DWORD STDCALL
GetCurrentProcessId (VOID
)
83 return((DWORD
)GetTeb()->Cid
.UniqueProcess
);
95 PROCESS_BASIC_INFORMATION ProcessBasic
;
98 errCode
= NtQueryInformationProcess(hProcess
,
99 ProcessBasicInformation
,
101 sizeof(PROCESS_BASIC_INFORMATION
),
103 if (!NT_SUCCESS(errCode
))
105 SetLastError(RtlNtStatusToDosError(errCode
));
108 memcpy(lpExitCode
, &ProcessBasic
.ExitStatus
, sizeof(DWORD
));
121 PROCESS_BASIC_INFORMATION ProcessBasic
;
124 errCode
= NtQueryInformationProcess(hProcess
,
125 ProcessBasicInformation
,
127 sizeof(PROCESS_BASIC_INFORMATION
),
129 if (!NT_SUCCESS(errCode
))
131 SetLastError(RtlNtStatusToDosError(errCode
));
134 memcpy( lpProcessId
,&ProcessBasic
.UniqueProcessId
,sizeof(DWORD
));
142 DWORD dwDesiredAccess
,
143 WINBOOL bInheritHandle
,
148 HANDLE ProcessHandle
;
149 OBJECT_ATTRIBUTES ObjectAttributes
;
152 ClientId
.UniqueProcess
= (HANDLE
)dwProcessId
;
153 ClientId
.UniqueThread
= INVALID_HANDLE_VALUE
;
155 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
156 ObjectAttributes
.RootDirectory
= (HANDLE
)NULL
;
157 ObjectAttributes
.SecurityDescriptor
= NULL
;
158 ObjectAttributes
.SecurityQualityOfService
= NULL
;
159 ObjectAttributes
.ObjectName
= NULL
;
161 if (bInheritHandle
== TRUE
)
162 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
164 ObjectAttributes
.Attributes
= 0;
166 errCode
= NtOpenProcess(&ProcessHandle
,
170 if (!NT_SUCCESS(errCode
))
172 SetLastError(RtlNtStatusToDosError(errCode
));
175 return ProcessHandle
;
186 STARTUPINFOA StartupInfo
;
187 PROCESS_INFORMATION ProcessInformation
;
191 StartupInfo
.cb
= sizeof(STARTUPINFOA
);
192 StartupInfo
.wShowWindow
= uCmdShow
;
193 StartupInfo
.dwFlags
= 0;
195 hInst
= (HINSTANCE
)CreateProcessA(NULL
,
204 &ProcessInformation
);
207 dosErr
= GetLastError();
210 if ( lpfnGlobalRegisterWaitForInputIdle
!= NULL
)
211 lpfnGlobalRegisterWaitForInputIdle(ProcessInformation
.hProcess
,10000);
212 NtClose(ProcessInformation
.hProcess
);
213 NtClose(ProcessInformation
.hThread
);
220 RegisterWaitForInputIdle (
221 WaitForInputIdleType lpfnRegisterWaitForInputIdle
224 lpfnGlobalRegisterWaitForInputIdle
= lpfnRegisterWaitForInputIdle
;
246 SleepEx (dwMilliseconds
, FALSE
);
254 DWORD dwMilliseconds
,
261 Interval
.QuadPart
= dwMilliseconds
* 1000;
263 errCode
= NtDelayExecution(bAlertable
,&Interval
);
264 if (!NT_SUCCESS(errCode
))
266 SetLastError(RtlNtStatusToDosError(errCode
));
276 LPSTARTUPINFOW lpStartupInfo
279 PRTL_USER_PROCESS_PARAMETERS Params
;
281 if (lpStartupInfo
== NULL
)
283 SetLastError(ERROR_INVALID_PARAMETER
);
287 Params
= NtCurrentPeb ()->ProcessParameters
;
289 lpStartupInfo
->cb
= sizeof(STARTUPINFOW
);
290 lpStartupInfo
->lpDesktop
= Params
->DesktopInfo
.Buffer
;
291 lpStartupInfo
->lpTitle
= Params
->WindowTitle
.Buffer
;
292 lpStartupInfo
->dwX
= Params
->StartingX
;
293 lpStartupInfo
->dwY
= Params
->StartingY
;
294 lpStartupInfo
->dwXSize
= Params
->CountX
;
295 lpStartupInfo
->dwYSize
= Params
->CountY
;
296 lpStartupInfo
->dwXCountChars
= Params
->CountCharsX
;
297 lpStartupInfo
->dwYCountChars
= Params
->CountCharsY
;
298 lpStartupInfo
->dwFillAttribute
= Params
->FillAttribute
;
299 lpStartupInfo
->dwFlags
= Params
->Flags
;
300 lpStartupInfo
->wShowWindow
= Params
->ShowWindowFlags
;
301 lpStartupInfo
->lpReserved
= Params
->ShellInfo
.Buffer
;
302 lpStartupInfo
->cbReserved2
= Params
->RuntimeData
.Length
;
303 lpStartupInfo
->lpReserved2
= (LPBYTE
)Params
->RuntimeData
.Buffer
;
305 lpStartupInfo
->hStdInput
= Params
->InputHandle
;
306 lpStartupInfo
->hStdOutput
= Params
->OutputHandle
;
307 lpStartupInfo
->hStdError
= Params
->ErrorHandle
;
314 LPSTARTUPINFOA lpStartupInfo
317 PRTL_USER_PROCESS_PARAMETERS Params
;
318 ANSI_STRING AnsiString
;
320 if (lpStartupInfo
== NULL
)
322 SetLastError(ERROR_INVALID_PARAMETER
);
326 Params
= NtCurrentPeb ()->ProcessParameters
;
328 RtlAcquirePebLock ();
330 if (lpLocalStartupInfo
== NULL
)
332 /* create new local startup info (ansi) */
333 lpLocalStartupInfo
= RtlAllocateHeap (RtlGetProcessHeap (),
335 sizeof(STARTUPINFOA
));
337 lpLocalStartupInfo
->cb
= sizeof(STARTUPINFOA
);
339 /* copy window title string */
340 RtlUnicodeStringToAnsiString (&AnsiString
,
341 &Params
->WindowTitle
,
343 lpLocalStartupInfo
->lpTitle
= AnsiString
.Buffer
;
345 /* copy desktop info string */
346 RtlUnicodeStringToAnsiString (&AnsiString
,
347 &Params
->DesktopInfo
,
349 lpLocalStartupInfo
->lpDesktop
= AnsiString
.Buffer
;
351 /* copy shell info string */
352 RtlUnicodeStringToAnsiString (&AnsiString
,
355 lpLocalStartupInfo
->lpReserved
= AnsiString
.Buffer
;
357 lpLocalStartupInfo
->dwX
= Params
->StartingX
;
358 lpLocalStartupInfo
->dwY
= Params
->StartingY
;
359 lpLocalStartupInfo
->dwXSize
= Params
->CountX
;
360 lpLocalStartupInfo
->dwYSize
= Params
->CountY
;
361 lpLocalStartupInfo
->dwXCountChars
= Params
->CountCharsX
;
362 lpLocalStartupInfo
->dwYCountChars
= Params
->CountCharsY
;
363 lpLocalStartupInfo
->dwFillAttribute
= Params
->FillAttribute
;
364 lpLocalStartupInfo
->dwFlags
= Params
->Flags
;
365 lpLocalStartupInfo
->wShowWindow
= Params
->ShowWindowFlags
;
366 lpLocalStartupInfo
->cbReserved2
= Params
->RuntimeData
.Length
;
367 lpLocalStartupInfo
->lpReserved2
= (LPBYTE
)Params
->RuntimeData
.Buffer
;
369 lpLocalStartupInfo
->hStdInput
= Params
->InputHandle
;
370 lpLocalStartupInfo
->hStdOutput
= Params
->OutputHandle
;
371 lpLocalStartupInfo
->hStdError
= Params
->ErrorHandle
;
374 RtlReleasePebLock ();
376 /* copy local startup info data to external startup info */
377 memcpy (lpStartupInfo
,
379 sizeof(STARTUPINFOA
));
385 FlushInstructionCache (
387 LPCVOID lpBaseAddress
,
393 errCode
= NtFlushInstructionCache(
395 (PVOID
) lpBaseAddress
,
397 if (!NT_SUCCESS(errCode
))
399 SetLastError(RtlNtStatusToDosError(errCode
));
412 NtTerminateProcess (NtCurrentProcess (),
426 errCode
= NtTerminateProcess(hProcess
, uExitCode
);
427 if (!NT_SUCCESS(errCode
))
429 SetLastError(RtlNtStatusToDosError(errCode
));
443 UNICODE_STRING MessageTextU
;
444 ANSI_STRING MessageText
;
446 RtlInitAnsiString (&MessageText
,
447 (LPSTR
)lpMessageText
);
449 RtlAnsiStringToUnicodeString (&MessageTextU
,
453 FatalAppExitW (uAction
,
454 MessageTextU
.Buffer
);
456 RtlFreeUnicodeString (&MessageTextU
);
464 LPCWSTR lpMessageText