2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/proc/proc.c
5 * PURPOSE: Process functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 #include <kernel32/proc.h>
13 #include <kernel32/thread.h>
19 extern NT_PEB
*CurrentPeb
;
22 WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle
;
24 VOID
RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle
);
28 GetProcessId(HANDLE hProcess
, LPDWORD lpProcessId
);
31 NT_PEB
*GetCurrentPeb(VOID
)
33 if ( CurrentPeb
!= NULL
)
35 else // hack to be able to return a process environment any time.
39 HANDLE STDCALL
GetCurrentProcess(VOID
)
41 return (HANDLE
)NtCurrentProcess();
44 HANDLE STDCALL
GetCurrentThread(VOID
)
46 return (HANDLE
)NtCurrentThread();
51 GetCurrentProcessId(VOID
)
54 return (DWORD
)(GetTeb()->Cid
).UniqueProcess
;
59 unsigned char CommandLineA
[MAX_PATH
];
70 CommandLineW
= GetCommandLineW();
71 while ((CommandLineW
[i
])!=0 && i
< MAX_PATH
)
73 CommandLineA
[i
] = (unsigned char)CommandLineW
[i
];
85 return GetCurrentPeb()->StartupInfo
->CommandLine
;
97 PROCESS_BASIC_INFORMATION ProcessBasic
;
100 errCode
= NtQueryInformationProcess(hProcess
,ProcessBasicInformation
,&ProcessBasic
,sizeof(PROCESS_BASIC_INFORMATION
),&BytesWritten
);
101 if ( !NT_SUCCESS(errCode
) ) {
102 SetLastError(RtlNtStatusToDosError(errCode
));
105 memcpy( lpExitCode
,&ProcessBasic
.ExitStatus
,sizeof(DWORD
));
118 PROCESS_BASIC_INFORMATION ProcessBasic
;
121 errCode
= NtQueryInformationProcess(hProcess
,ProcessBasicInformation
,&ProcessBasic
,sizeof(PROCESS_BASIC_INFORMATION
),&BytesWritten
);
122 if ( !NT_SUCCESS(errCode
) ) {
123 SetLastError(RtlNtStatusToDosError(errCode
));
126 memcpy( lpProcessId
,&ProcessBasic
.UniqueProcessId
,sizeof(DWORD
));
134 LPCSTR lpApplicationName
,
136 LPSECURITY_ATTRIBUTES lpProcessAttributes
,
137 LPSECURITY_ATTRIBUTES lpThreadAttributes
,
138 WINBOOL bInheritHandles
,
139 DWORD dwCreationFlags
,
140 LPVOID lpEnvironment
,
141 LPCSTR lpCurrentDirectory
,
142 LPSTARTUPINFO lpStartupInfo
,
143 LPPROCESS_INFORMATION lpProcessInformation
146 WCHAR ApplicationNameW
[MAX_PATH
];
147 WCHAR CommandLineW
[MAX_PATH
];
148 WCHAR CurrentDirectoryW
[MAX_PATH
];
154 while ((*lpApplicationName
)!=0 && i
< MAX_PATH
)
156 ApplicationNameW
[i
] = *lpApplicationName
;
160 ApplicationNameW
[i
] = 0;
164 while ((*lpCommandLine
)!=0 && i
< MAX_PATH
)
166 CommandLineW
[i
] = *lpCommandLine
;
173 while ((*lpCurrentDirectory
)!=0 && i
< MAX_PATH
)
175 CurrentDirectoryW
[i
] = *lpCurrentDirectory
;
176 lpCurrentDirectory
++;
179 CurrentDirectoryW
[i
] = 0;
181 return CreateProcessW(ApplicationNameW
,CommandLineW
, lpProcessAttributes
,lpThreadAttributes
,
182 bInheritHandles
,dwCreationFlags
,lpEnvironment
,CurrentDirectoryW
,lpStartupInfo
,
183 lpProcessInformation
);
192 LPCWSTR lpApplicationName
,
193 LPWSTR lpCommandLine
,
194 LPSECURITY_ATTRIBUTES lpProcessAttributes
,
195 LPSECURITY_ATTRIBUTES lpThreadAttributes
,
196 WINBOOL bInheritHandles
,
197 DWORD dwCreationFlags
,
198 LPVOID lpEnvironment
,
199 LPCWSTR lpCurrentDirectory
,
200 LPSTARTUPINFO lpStartupInfo
,
201 LPPROCESS_INFORMATION lpProcessInformation
204 HANDLE hFile
, hSection
, hProcess
, hThread
;
205 KPRIORITY PriorityClass
;
206 OBJECT_ATTRIBUTES ObjectAttributes
;
207 IO_STATUS_BLOCK IoStatusBlock
;
208 BOOLEAN CreateSuspended
;
212 UNICODE_STRING ApplicationNameString
;
216 LPTHREAD_START_ROUTINE lpStartAddress
= NULL
;
217 LPVOID lpParameter
= NULL
;
221 ApplicationNameString
.Length
= lstrlenW(lpApplicationName
)*sizeof(WCHAR
);
223 ApplicationNameString
.Buffer
= (WCHAR
*)lpApplicationName
;
224 ApplicationNameString
.MaximumLength
= ApplicationNameString
.Length
;
227 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
228 ObjectAttributes
.RootDirectory
= NULL
;
232 if ( lpProcessAttributes
!= NULL
) {
233 if ( lpProcessAttributes
->bInheritHandle
)
234 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
236 ObjectAttributes
.Attributes
= 0;
237 ObjectAttributes
.SecurityDescriptor
= lpProcessAttributes
->lpSecurityDescriptor
;
239 ObjectAttributes
.Attributes
|= OBJ_CASE_INSENSITIVE
;
241 errCode
= NtOpenFile(&hFile
,(SYNCHRONIZE
|FILE_EXECUTE
), &ObjectAttributes
,
242 &IoStatusBlock
,(FILE_SHARE_DELETE
|FILE_SHARE_READ
),(FILE_SYNCHRONOUS_IO_NONALERT
|FILE_NON_DIRECTORY_FILE
));
244 if ( !NT_SUCCESS(errCode
) ) {
245 SetLastError(RtlNtStatusToDosError(errCode
));
249 errCode
= NtCreateSection(&hSection
,SECTION_ALL_ACCESS
,NULL
,NULL
,PAGE_EXECUTE
,SEC_IMAGE
,hFile
);
252 if ( !NT_SUCCESS(errCode
) ) {
253 SetLastError(RtlNtStatusToDosError(errCode
));
258 if ( lpProcessAttributes
!= NULL
) {
259 if ( lpProcessAttributes
->bInheritHandle
)
260 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
262 ObjectAttributes
.Attributes
= 0;
263 ObjectAttributes
.SecurityDescriptor
= lpProcessAttributes
->lpSecurityDescriptor
;
266 errCode
= NtCreateProcess(&hProcess
,PROCESS_ALL_ACCESS
, &ObjectAttributes
,NtCurrentProcess(),bInheritHandles
,hSection
,NULL
,NULL
);
269 if ( !NT_SUCCESS(errCode
) ) {
270 SetLastError(RtlNtStatusToDosError(errCode
));
274 PriorityClass
= NORMAL_PRIORITY_CLASS
;
275 NtSetInformationProcess(hProcess
,ProcessBasePriority
,&PriorityClass
,sizeof(KPRIORITY
));
277 if ( ( dwCreationFlags
& CREATE_SUSPENDED
) == CREATE_SUSPENDED
)
278 CreateSuspended
= TRUE
;
280 CreateSuspended
= FALSE
;
282 hThread
= CreateRemoteThread(
289 &lpProcessInformation
->dwThreadId
293 if ( hThread
== NULL
)
298 lpProcessInformation
->hProcess
= hProcess
;
299 lpProcessInformation
->hThread
= hThread
;
304 GetProcessId(hProcess
,&lpProcessInformation
->dwProcessId
);
318 DWORD dwDesiredAccess
,
319 WINBOOL bInheritHandle
,
326 HANDLE ProcessHandle
;
327 OBJECT_ATTRIBUTES ObjectAttributes
;
330 ClientId
.UniqueProcess
= (HANDLE
)dwProcessId
;
331 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
332 ObjectAttributes
.RootDirectory
= (HANDLE
)NULL
;
333 ObjectAttributes
.SecurityDescriptor
= NULL
;
334 ObjectAttributes
.SecurityQualityOfService
= NULL
;
336 if ( bInheritHandle
== TRUE
)
337 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
339 ObjectAttributes
.Attributes
= 0;
341 errCode
= NtOpenProcess ( &ProcessHandle
, dwDesiredAccess
, &ObjectAttributes
, &ClientId
);
342 if ( !NT_SUCCESS(errCode
) ) {
343 SetLastError(RtlNtStatusToDosError(errCode
));
346 return ProcessHandle
;
361 UINT
WinExec ( LPCSTR lpCmdLine
, UINT uCmdShow
)
363 STARTUPINFO StartupInfo
;
364 PROCESS_INFORMATION ProcessInformation
;
371 StartupInfo
.cb
= sizeof(STARTUPINFO
);
372 StartupInfo
.wShowWindow
= uCmdShow
;
373 StartupInfo
.dwFlags
= 0;
375 hInst
= (HINSTANCE
)CreateProcessA(NULL
,(PVOID
)lpCmdLine
,NULL
,NULL
,FALSE
,0,NULL
,NULL
,&StartupInfo
, &ProcessInformation
);
376 if ( hInst
== NULL
) {
377 dosErr
= GetLastError();
380 if ( lpfnGlobalRegisterWaitForInputIdle
!= NULL
)
381 lpfnGlobalRegisterWaitForInputIdle(ProcessInformation
.hProcess
,10000);
382 NtClose(ProcessInformation
.hProcess
);
383 NtClose(ProcessInformation
.hThread
);
390 VOID
RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle
)
392 lpfnGlobalRegisterWaitForInputIdle
= lpfnRegisterWaitForInputIdle
;
412 SleepEx(dwMilliseconds
,FALSE
);
419 DWORD dwMilliseconds
,
426 Interval
.LowPart
= dwMilliseconds
* 1000;
427 Interval
.HighPart
= 0;
428 errCode
= NtDelayExecution(bAlertable
,&Interval
);
429 if ( !NT_SUCCESS(errCode
) ) {
430 SetLastError(RtlNtStatusToDosError(errCode
));
443 LPSTARTUPINFO lpStartupInfo
446 NT_PEB
*pPeb
= GetCurrentPeb();
448 if (lpStartupInfo
== NULL
) {
449 SetLastError(ERROR_INVALID_PARAMETER
);
453 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
454 lstrcpyW(lpStartupInfo
->lpDesktop
, pPeb
->StartupInfo
->Desktop
);
455 lstrcpyW(lpStartupInfo
->lpTitle
, pPeb
->StartupInfo
->Title
);
456 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
457 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
458 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
459 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
460 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
461 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
462 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
463 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
464 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
465 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
466 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
467 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
469 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
470 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
471 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
485 LPSTARTUPINFO lpStartupInfo
488 NT_PEB
*pPeb
= GetCurrentPeb();
490 if (lpStartupInfo
== NULL
) {
491 SetLastError(ERROR_INVALID_PARAMETER
);
496 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
499 while ((pPeb
->StartupInfo
->Desktop
[i
])!=0 && i
< MAX_PATH
)
501 lpStartupInfo
->lpDesktop
[i
] = (unsigned char)pPeb
->StartupInfo
->Desktop
[i
];
504 lpStartupInfo
->lpDesktop
[i
] = 0;
507 while ((pPeb
->StartupInfo
->Title
[i
])!=0 && i
< MAX_PATH
)
509 lpStartupInfo
->lpTitle
[i
] = (unsigned char)pPeb
->StartupInfo
->Title
[i
];
512 lpStartupInfo
->lpTitle
[i
] = 0;
514 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
515 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
516 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
517 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
518 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
519 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
520 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
521 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
522 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
523 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
524 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
525 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
527 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
528 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
529 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
536 FlushInstructionCache(
540 LPCVOID lpBaseAddress
,
545 errCode
= NtFlushInstructionCache(hProcess
,(PVOID
)lpBaseAddress
,dwSize
);
546 if ( !NT_SUCCESS(errCode
) ) {
547 SetLastError(RtlNtStatusToDosError(errCode
));
575 WCHAR MessageTextW
[MAX_PATH
];
578 while ((*lpMessageText
)!=0 && i
< 35)
580 MessageTextW
[i
] = *lpMessageText
;
586 return FatalAppExitW(uAction
,MessageTextW
);
595 LPCWSTR lpMessageText