1 /* $Id: proc.c,v 1.32 2000/04/25 23:22:54 ea 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>
19 #include <kernel32/error.h>
22 #include <internal/i386/segment.h>
23 #include <internal/teb.h>
24 #include <ntdll/csr.h>
28 #include <kernel32/kernel32.h>
31 /* GLOBALS *******************************************************************/
33 WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle
;
35 LPSTARTUPINFO lpLocalStartupInfo
= NULL
;
39 RegisterWaitForInputIdle (
40 WaitForInputIdleType lpfnRegisterWaitForInputIdle
44 /* FUNCTIONS ****************************************************************/
61 LPFILETIME lpCreationTime
,
62 LPFILETIME lpExitTime
,
63 LPFILETIME lpKernelTime
,
68 KERNEL_USER_TIMES Kut
;
70 Status
= NtQueryInformationProcess (
77 if (!NT_SUCCESS(Status
))
79 SetLastErrorByStatus (Status
);
83 lpCreationTime
->dwLowDateTime
= Kut
.CreateTime
.u
.LowPart
;
84 lpCreationTime
->dwHighDateTime
= Kut
.CreateTime
.u
.HighPart
;
86 lpExitTime
->dwLowDateTime
= Kut
.ExitTime
.u
.LowPart
;
87 lpExitTime
->dwHighDateTime
= Kut
.ExitTime
.u
.HighPart
;
89 lpKernelTime
->dwLowDateTime
= Kut
.KernelTime
.u
.LowPart
;
90 lpKernelTime
->dwHighDateTime
= Kut
.KernelTime
.u
.HighPart
;
92 lpUserTime
->dwLowDateTime
= Kut
.UserTime
.u
.LowPart
;
93 lpUserTime
->dwHighDateTime
= Kut
.UserTime
.u
.HighPart
;
99 HANDLE STDCALL
GetCurrentProcess (VOID
)
101 return((HANDLE
)NtCurrentProcess());
105 HANDLE STDCALL
GetCurrentThread (VOID
)
107 return((HANDLE
)NtCurrentThread());
111 DWORD STDCALL
GetCurrentProcessId (VOID
)
113 return((DWORD
)GetTeb()->Cid
.UniqueProcess
);
125 PROCESS_BASIC_INFORMATION ProcessBasic
;
128 errCode
= NtQueryInformationProcess(hProcess
,
129 ProcessBasicInformation
,
131 sizeof(PROCESS_BASIC_INFORMATION
),
133 if (!NT_SUCCESS(errCode
))
135 SetLastErrorByStatus (errCode
);
138 memcpy(lpExitCode
, &ProcessBasic
.ExitStatus
, sizeof(DWORD
));
151 PROCESS_BASIC_INFORMATION ProcessBasic
;
154 errCode
= NtQueryInformationProcess(hProcess
,
155 ProcessBasicInformation
,
157 sizeof(PROCESS_BASIC_INFORMATION
),
159 if (!NT_SUCCESS(errCode
))
161 SetLastErrorByStatus (errCode
);
164 memcpy( lpProcessId
,&ProcessBasic
.UniqueProcessId
,sizeof(DWORD
));
172 DWORD dwDesiredAccess
,
173 WINBOOL bInheritHandle
,
178 HANDLE ProcessHandle
;
179 OBJECT_ATTRIBUTES ObjectAttributes
;
182 ClientId
.UniqueProcess
= (HANDLE
)dwProcessId
;
183 ClientId
.UniqueThread
= INVALID_HANDLE_VALUE
;
185 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
186 ObjectAttributes
.RootDirectory
= (HANDLE
)NULL
;
187 ObjectAttributes
.SecurityDescriptor
= NULL
;
188 ObjectAttributes
.SecurityQualityOfService
= NULL
;
189 ObjectAttributes
.ObjectName
= NULL
;
191 if (bInheritHandle
== TRUE
)
192 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
194 ObjectAttributes
.Attributes
= 0;
196 errCode
= NtOpenProcess(&ProcessHandle
,
200 if (!NT_SUCCESS(errCode
))
202 SetLastErrorByStatus (errCode
);
205 return ProcessHandle
;
216 STARTUPINFOA StartupInfo
;
217 PROCESS_INFORMATION ProcessInformation
;
221 StartupInfo
.cb
= sizeof(STARTUPINFOA
);
222 StartupInfo
.wShowWindow
= uCmdShow
;
223 StartupInfo
.dwFlags
= 0;
225 hInst
= (HINSTANCE
)CreateProcessA(NULL
,
234 &ProcessInformation
);
237 dosErr
= GetLastError();
240 if (NULL
!= lpfnGlobalRegisterWaitForInputIdle
)
242 lpfnGlobalRegisterWaitForInputIdle (
243 ProcessInformation
.hProcess
,
247 NtClose (ProcessInformation
.hProcess
);
248 NtClose (ProcessInformation
.hThread
);
255 RegisterWaitForInputIdle (
256 WaitForInputIdleType lpfnRegisterWaitForInputIdle
259 lpfnGlobalRegisterWaitForInputIdle
= lpfnRegisterWaitForInputIdle
;
281 SleepEx (dwMilliseconds
, FALSE
);
289 DWORD dwMilliseconds
,
296 Interval
.QuadPart
= dwMilliseconds
* 1000;
298 errCode
= NtDelayExecution (bAlertable
, & Interval
);
299 if (!NT_SUCCESS(errCode
))
301 SetLastErrorByStatus (errCode
);
311 LPSTARTUPINFOW lpStartupInfo
314 PRTL_USER_PROCESS_PARAMETERS Params
;
316 if (lpStartupInfo
== NULL
)
318 SetLastError(ERROR_INVALID_PARAMETER
);
322 Params
= NtCurrentPeb ()->ProcessParameters
;
324 lpStartupInfo
->cb
= sizeof(STARTUPINFOW
);
325 lpStartupInfo
->lpDesktop
= Params
->DesktopInfo
.Buffer
;
326 lpStartupInfo
->lpTitle
= Params
->WindowTitle
.Buffer
;
327 lpStartupInfo
->dwX
= Params
->StartingX
;
328 lpStartupInfo
->dwY
= Params
->StartingY
;
329 lpStartupInfo
->dwXSize
= Params
->CountX
;
330 lpStartupInfo
->dwYSize
= Params
->CountY
;
331 lpStartupInfo
->dwXCountChars
= Params
->CountCharsX
;
332 lpStartupInfo
->dwYCountChars
= Params
->CountCharsY
;
333 lpStartupInfo
->dwFillAttribute
= Params
->FillAttribute
;
334 lpStartupInfo
->dwFlags
= Params
->Flags
;
335 lpStartupInfo
->wShowWindow
= Params
->ShowWindowFlags
;
336 lpStartupInfo
->lpReserved
= Params
->ShellInfo
.Buffer
;
337 lpStartupInfo
->cbReserved2
= Params
->RuntimeData
.Length
;
338 lpStartupInfo
->lpReserved2
= (LPBYTE
)Params
->RuntimeData
.Buffer
;
340 lpStartupInfo
->hStdInput
= Params
->InputHandle
;
341 lpStartupInfo
->hStdOutput
= Params
->OutputHandle
;
342 lpStartupInfo
->hStdError
= Params
->ErrorHandle
;
349 LPSTARTUPINFOA lpStartupInfo
352 PRTL_USER_PROCESS_PARAMETERS Params
;
353 ANSI_STRING AnsiString
;
355 if (lpStartupInfo
== NULL
)
357 SetLastError(ERROR_INVALID_PARAMETER
);
361 Params
= NtCurrentPeb ()->ProcessParameters
;
363 RtlAcquirePebLock ();
365 if (lpLocalStartupInfo
== NULL
)
367 /* create new local startup info (ansi) */
368 lpLocalStartupInfo
= RtlAllocateHeap (RtlGetProcessHeap (),
370 sizeof(STARTUPINFOA
));
372 lpLocalStartupInfo
->cb
= sizeof(STARTUPINFOA
);
374 /* copy window title string */
375 RtlUnicodeStringToAnsiString (&AnsiString
,
376 &Params
->WindowTitle
,
378 lpLocalStartupInfo
->lpTitle
= AnsiString
.Buffer
;
380 /* copy desktop info string */
381 RtlUnicodeStringToAnsiString (&AnsiString
,
382 &Params
->DesktopInfo
,
384 lpLocalStartupInfo
->lpDesktop
= AnsiString
.Buffer
;
386 /* copy shell info string */
387 RtlUnicodeStringToAnsiString (&AnsiString
,
390 lpLocalStartupInfo
->lpReserved
= AnsiString
.Buffer
;
392 lpLocalStartupInfo
->dwX
= Params
->StartingX
;
393 lpLocalStartupInfo
->dwY
= Params
->StartingY
;
394 lpLocalStartupInfo
->dwXSize
= Params
->CountX
;
395 lpLocalStartupInfo
->dwYSize
= Params
->CountY
;
396 lpLocalStartupInfo
->dwXCountChars
= Params
->CountCharsX
;
397 lpLocalStartupInfo
->dwYCountChars
= Params
->CountCharsY
;
398 lpLocalStartupInfo
->dwFillAttribute
= Params
->FillAttribute
;
399 lpLocalStartupInfo
->dwFlags
= Params
->Flags
;
400 lpLocalStartupInfo
->wShowWindow
= Params
->ShowWindowFlags
;
401 lpLocalStartupInfo
->cbReserved2
= Params
->RuntimeData
.Length
;
402 lpLocalStartupInfo
->lpReserved2
= (LPBYTE
)Params
->RuntimeData
.Buffer
;
404 lpLocalStartupInfo
->hStdInput
= Params
->InputHandle
;
405 lpLocalStartupInfo
->hStdOutput
= Params
->OutputHandle
;
406 lpLocalStartupInfo
->hStdError
= Params
->ErrorHandle
;
409 RtlReleasePebLock ();
411 /* copy local startup info data to external startup info */
412 memcpy (lpStartupInfo
,
414 sizeof(STARTUPINFOA
));
420 FlushInstructionCache (
422 LPCVOID lpBaseAddress
,
428 errCode
= NtFlushInstructionCache (
430 (PVOID
) lpBaseAddress
,
432 if (!NT_SUCCESS(errCode
))
434 SetLastErrorByStatus (errCode
);
447 NtTerminateProcess (NtCurrentProcess (),
461 errCode
= NtTerminateProcess (hProcess
, uExitCode
);
462 if (!NT_SUCCESS(errCode
))
464 SetLastErrorByStatus (errCode
);
478 UNICODE_STRING MessageTextU
;
479 ANSI_STRING MessageText
;
481 RtlInitAnsiString (& MessageText
,
482 (LPSTR
) lpMessageText
);
484 RtlAnsiStringToUnicodeString (& MessageTextU
,
488 FatalAppExitW (uAction
,
489 MessageTextU
.Buffer
);
491 RtlFreeUnicodeString (&MessageTextU
);
499 LPCWSTR lpMessageText
513 DWORD CsrPriorityClass
;
516 Status
= NtDuplicateObject (
521 (PROCESS_SET_INFORMATION
| PROCESS_QUERY_INFORMATION
),
525 if (!NT_SUCCESS(Status
))
527 SetLastErrorByStatus (Status
);
528 return (0); /* ERROR */
530 /* Ask CSRSS to set it */
531 CsrSetPriorityClass (
535 NtClose (hProcessTmp
);
536 /* Translate CSR->W32 priorities */
537 switch (CsrPriorityClass
)
539 case CSR_PRIORITY_CLASS_NORMAL
:
540 return (NORMAL_PRIORITY_CLASS
); /* 32 */
541 case CSR_PRIORITY_CLASS_IDLE
:
542 return (IDLE_PRIORITY_CLASS
); /* 64 */
543 case CSR_PRIORITY_CLASS_HIGH
:
544 return (HIGH_PRIORITY_CLASS
); /* 128 */
545 case CSR_PRIORITY_CLASS_REALTIME
:
546 return (REALTIME_PRIORITY_CLASS
); /* 256 */
548 SetLastError (ERROR_ACCESS_DENIED
);
549 return (0); /* ERROR */
558 DWORD dwPriorityClass
562 DWORD CsrPriorityClass
;
565 switch (dwPriorityClass
)
567 case NORMAL_PRIORITY_CLASS
: /* 32 */
568 CsrPriorityClass
= CSR_PRIORITY_CLASS_NORMAL
;
570 case IDLE_PRIORITY_CLASS
: /* 64 */
571 CsrPriorityClass
= CSR_PRIORITY_CLASS_IDLE
;
573 case HIGH_PRIORITY_CLASS
: /* 128 */
574 CsrPriorityClass
= CSR_PRIORITY_CLASS_HIGH
;
576 case REALTIME_PRIORITY_CLASS
: /* 256 */
577 CsrPriorityClass
= CSR_PRIORITY_CLASS_REALTIME
;
580 SetLastError (ERROR_INVALID_PARAMETER
);
583 Status
= NtDuplicateObject (
588 (PROCESS_SET_INFORMATION
| PROCESS_QUERY_INFORMATION
),
592 if (!NT_SUCCESS(Status
))
594 SetLastErrorByStatus (Status
);
595 return (FALSE
); /* ERROR */
597 /* Ask CSRSS to set it */
598 Status
= CsrSetPriorityClass (
602 NtClose (hProcessTmp
);
603 if (!NT_SUCCESS(Status
))
605 SetLastErrorByStatus (Status
);