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)
11 /* INCLUDES ****************************************************************/
15 #include <kernel32/proc.h>
16 #include <kernel32/thread.h>
19 #include <internal/i386/segment.h>
20 #include <internal/teb.h>
23 #include <kernel32/kernel32.h>
25 /* TYPES *********************************************************************/
27 typedef struct _WSTARTUPINFO
{
38 DWORD dwFillAttribute
;
46 } WSTARTUPINFO
, *LPWSTARTUPINFO
;
48 /* GLOBALS *******************************************************************/
50 WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle
;
52 VOID
RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle
);
54 /* FUNCTIONS ****************************************************************/
56 WINBOOL STDCALL
GetProcessId(HANDLE hProcess
, LPDWORD lpProcessId
);
58 FARPROC
GetProcAddress(HMODULE hModule
, LPCSTR lpProcName
)
64 WINBOOL STDCALL
GetProcessTimes(HANDLE hProcess
,
65 LPFILETIME lpCreationTime
,
66 LPFILETIME lpExitTime
,
67 LPFILETIME lpKernelTime
,
68 LPFILETIME lpUserTime
)
70 dprintf("GetProcessTimes is unimplemented\n");
74 HANDLE STDCALL
GetCurrentProcess(VOID
)
76 return (HANDLE
)NtCurrentProcess();
79 HANDLE STDCALL
GetCurrentThread(VOID
)
81 return (HANDLE
)NtCurrentThread();
84 DWORD STDCALL
GetCurrentProcessId(VOID
)
86 return (DWORD
)(GetTeb()->Cid
).UniqueProcess
;
89 WINBOOL STDCALL
GetExitCodeProcess(HANDLE hProcess
, LPDWORD lpExitCode
)
92 PROCESS_BASIC_INFORMATION ProcessBasic
;
95 errCode
= NtQueryInformationProcess(hProcess
,
96 ProcessBasicInformation
,
98 sizeof(PROCESS_BASIC_INFORMATION
),
100 if (!NT_SUCCESS(errCode
))
102 SetLastError(RtlNtStatusToDosError(errCode
));
105 memcpy(lpExitCode
, &ProcessBasic
.ExitStatus
, sizeof(DWORD
));
109 WINBOOL STDCALL
GetProcessId(HANDLE hProcess
, LPDWORD lpProcessId
)
112 PROCESS_BASIC_INFORMATION ProcessBasic
;
115 errCode
= NtQueryInformationProcess(hProcess
,
116 ProcessBasicInformation
,
118 sizeof(PROCESS_BASIC_INFORMATION
),
120 if (!NT_SUCCESS(errCode
))
122 SetLastError(RtlNtStatusToDosError(errCode
));
125 memcpy( lpProcessId
,&ProcessBasic
.UniqueProcessId
,sizeof(DWORD
));
129 PWSTR
InternalAnsiToUnicode(PWSTR Out
, LPCSTR In
, ULONG MaxLength
)
140 while ((*In
)!=0 && i
< MaxLength
)
151 HANDLE STDCALL
OpenProcess(DWORD dwDesiredAccess
,
152 WINBOOL bInheritHandle
,
156 HANDLE ProcessHandle
;
157 OBJECT_ATTRIBUTES ObjectAttributes
;
160 ClientId
.UniqueProcess
= (HANDLE
)dwProcessId
;
161 ClientId
.UniqueThread
= INVALID_HANDLE_VALUE
;
163 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
164 ObjectAttributes
.RootDirectory
= (HANDLE
)NULL
;
165 ObjectAttributes
.SecurityDescriptor
= NULL
;
166 ObjectAttributes
.SecurityQualityOfService
= NULL
;
167 ObjectAttributes
.ObjectName
= NULL
;
169 if (bInheritHandle
== TRUE
)
170 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
172 ObjectAttributes
.Attributes
= 0;
174 errCode
= NtOpenProcess(&ProcessHandle
,
178 if (!NT_SUCCESS(errCode
))
180 SetLastError(RtlNtStatusToDosError(errCode
));
183 return ProcessHandle
;
186 UINT
WinExec (LPCSTR lpCmdLine
, UINT uCmdShow
)
188 STARTUPINFO StartupInfo
;
189 PROCESS_INFORMATION ProcessInformation
;
193 StartupInfo
.cb
= sizeof(STARTUPINFO
);
194 StartupInfo
.wShowWindow
= uCmdShow
;
195 StartupInfo
.dwFlags
= 0;
197 hInst
= (HINSTANCE
)CreateProcessA(NULL
,
206 &ProcessInformation
);
209 dosErr
= GetLastError();
212 if ( lpfnGlobalRegisterWaitForInputIdle
!= NULL
)
213 lpfnGlobalRegisterWaitForInputIdle(ProcessInformation
.hProcess
,10000);
214 NtClose(ProcessInformation
.hProcess
);
215 NtClose(ProcessInformation
.hThread
);
221 VOID
RegisterWaitForInputIdle(WaitForInputIdleType
222 lpfnRegisterWaitForInputIdle
)
224 lpfnGlobalRegisterWaitForInputIdle
= lpfnRegisterWaitForInputIdle
;
228 DWORD STDCALL
WaitForInputIdle(HANDLE hProcess
,
229 DWORD dwMilliseconds
)
234 VOID STDCALL
Sleep(DWORD dwMilliseconds
)
236 SleepEx(dwMilliseconds
,FALSE
);
240 DWORD STDCALL
SleepEx(DWORD dwMilliseconds
, BOOL bAlertable
)
245 Interval
.QuadPart
= dwMilliseconds
* 1000;
247 errCode
= NtDelayExecution(bAlertable
,&Interval
);
248 if ( !NT_SUCCESS(errCode
) ) {
249 SetLastError(RtlNtStatusToDosError(errCode
));
255 VOID STDCALL
GetStartupInfoW(LPSTARTUPINFO _lpStartupInfo
)
257 NT_PEB
*pPeb
= NtCurrentPeb();
258 LPWSTARTUPINFO lpStartupInfo
= (LPWSTARTUPINFO
)_lpStartupInfo
;
260 if (lpStartupInfo
== NULL
)
262 SetLastError(ERROR_INVALID_PARAMETER
);
266 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
267 // lstrcpyW(lpStartupInfo->lpDesktop, pPeb->StartupInfo->Desktop);
268 // lstrcpyW(lpStartupInfo->lpTitle, pPeb->StartupInfo->Title);
269 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
270 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
271 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
272 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
273 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
274 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
275 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
276 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
277 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
278 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
279 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
280 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
282 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
283 lstrcpyW(lpStartupInfo
->lpDesktop
, pPeb
->StartupInfo
->Desktop
);
284 lstrcpyW(lpStartupInfo
->lpTitle
, pPeb
->StartupInfo
->Title
);
285 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
286 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
287 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
288 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
289 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
290 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
291 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
292 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
293 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
294 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
295 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
296 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
298 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
299 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
300 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
308 VOID STDCALL
GetStartupInfoA(LPSTARTUPINFO lpStartupInfo
)
310 NT_PEB
*pPeb
= NtCurrentPeb();
313 if (lpStartupInfo
== NULL
)
315 SetLastError(ERROR_INVALID_PARAMETER
);
319 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
322 while ((pPeb
->StartupInfo
->Desktop
[i
])!=0 && i
< MAX_PATH
)
324 lpStartupInfo
->lpDesktop
[i
] = (unsigned char)
325 pPeb
->StartupInfo
->Desktop
[i
];
328 lpStartupInfo
->lpDesktop
[i
] = 0;
331 while ((pPeb
->StartupInfo
->Title
[i
])!=0 && i
< MAX_PATH
)
333 lpStartupInfo
->lpTitle
[i
] = (unsigned char)pPeb
->StartupInfo
->Title
[i
];
336 lpStartupInfo
->lpTitle
[i
] = 0;
338 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
339 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
340 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
341 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
342 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
343 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
344 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
345 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
346 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
347 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
348 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
349 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
351 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
352 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
353 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
358 BOOL STDCALL
FlushInstructionCache(HANDLE hProcess
,
359 LPCVOID lpBaseAddress
,
363 errCode
= NtFlushInstructionCache(hProcess
,(PVOID
)lpBaseAddress
,dwSize
);
364 if (!NT_SUCCESS(errCode
))
366 SetLastError(RtlNtStatusToDosError(errCode
));
372 VOID STDCALL
ExitProcess(UINT uExitCode
)
374 NtTerminateProcess(NtCurrentProcess(), uExitCode
);
377 WINBOOL STDCALL
TerminateProcess(HANDLE hProcess
, UINT uExitCode
)
380 errCode
= NtTerminateProcess(hProcess
, uExitCode
);
381 if (!NT_SUCCESS(errCode
))
383 SetLastError(RtlNtStatusToDosError(errCode
));
389 VOID STDCALL
FatalAppExitA(UINT uAction
, LPCSTR lpMessageText
)
391 WCHAR MessageTextW
[MAX_PATH
];
394 while ((*lpMessageText
)!=0 && i
< 35)
396 MessageTextW
[i
] = *lpMessageText
;
402 return FatalAppExitW(uAction
,MessageTextW
);
407 VOID STDCALL
FatalAppExitW(UINT uAction
, LPCWSTR lpMessageText
)