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 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
162 ObjectAttributes
.RootDirectory
= (HANDLE
)NULL
;
163 ObjectAttributes
.SecurityDescriptor
= NULL
;
164 ObjectAttributes
.SecurityQualityOfService
= NULL
;
166 if ( bInheritHandle
== TRUE
)
167 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
169 ObjectAttributes
.Attributes
= 0;
171 errCode
= NtOpenProcess(&ProcessHandle
,
175 if (!NT_SUCCESS(errCode
))
177 SetLastError(RtlNtStatusToDosError(errCode
));
180 return ProcessHandle
;
183 UINT
WinExec (LPCSTR lpCmdLine
, UINT uCmdShow
)
185 STARTUPINFO StartupInfo
;
186 PROCESS_INFORMATION ProcessInformation
;
190 StartupInfo
.cb
= sizeof(STARTUPINFO
);
191 StartupInfo
.wShowWindow
= uCmdShow
;
192 StartupInfo
.dwFlags
= 0;
194 hInst
= (HINSTANCE
)CreateProcessA(NULL
,
203 &ProcessInformation
);
206 dosErr
= GetLastError();
209 if ( lpfnGlobalRegisterWaitForInputIdle
!= NULL
)
210 lpfnGlobalRegisterWaitForInputIdle(ProcessInformation
.hProcess
,10000);
211 NtClose(ProcessInformation
.hProcess
);
212 NtClose(ProcessInformation
.hThread
);
218 VOID
RegisterWaitForInputIdle(WaitForInputIdleType
219 lpfnRegisterWaitForInputIdle
)
221 lpfnGlobalRegisterWaitForInputIdle
= lpfnRegisterWaitForInputIdle
;
225 DWORD STDCALL
WaitForInputIdle(HANDLE hProcess
,
226 DWORD dwMilliseconds
)
231 VOID STDCALL
Sleep(DWORD dwMilliseconds
)
233 SleepEx(dwMilliseconds
,FALSE
);
237 DWORD STDCALL
SleepEx(DWORD dwMilliseconds
, BOOL bAlertable
)
242 Interval
.QuadPart
= dwMilliseconds
* 1000;
244 errCode
= NtDelayExecution(bAlertable
,&Interval
);
245 if ( !NT_SUCCESS(errCode
) ) {
246 SetLastError(RtlNtStatusToDosError(errCode
));
252 VOID STDCALL
GetStartupInfoW(LPSTARTUPINFO _lpStartupInfo
)
254 NT_PEB
*pPeb
= NtCurrentPeb();
255 LPWSTARTUPINFO lpStartupInfo
= (LPWSTARTUPINFO
)_lpStartupInfo
;
257 if (lpStartupInfo
== NULL
)
259 SetLastError(ERROR_INVALID_PARAMETER
);
263 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
264 // lstrcpyW(lpStartupInfo->lpDesktop, pPeb->StartupInfo->Desktop);
265 // lstrcpyW(lpStartupInfo->lpTitle, pPeb->StartupInfo->Title);
266 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
267 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
268 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
269 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
270 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
271 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
272 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
273 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
274 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
275 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
276 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
277 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
279 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
280 lstrcpyW(lpStartupInfo
->lpDesktop
, pPeb
->StartupInfo
->Desktop
);
281 lstrcpyW(lpStartupInfo
->lpTitle
, pPeb
->StartupInfo
->Title
);
282 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
283 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
284 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
285 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
286 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
287 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
288 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
289 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
290 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
291 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
292 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
293 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
295 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
296 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
297 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
305 VOID STDCALL
GetStartupInfoA(LPSTARTUPINFO lpStartupInfo
)
307 NT_PEB
*pPeb
= NtCurrentPeb();
310 if (lpStartupInfo
== NULL
)
312 SetLastError(ERROR_INVALID_PARAMETER
);
316 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
319 while ((pPeb
->StartupInfo
->Desktop
[i
])!=0 && i
< MAX_PATH
)
321 lpStartupInfo
->lpDesktop
[i
] = (unsigned char)
322 pPeb
->StartupInfo
->Desktop
[i
];
325 lpStartupInfo
->lpDesktop
[i
] = 0;
328 while ((pPeb
->StartupInfo
->Title
[i
])!=0 && i
< MAX_PATH
)
330 lpStartupInfo
->lpTitle
[i
] = (unsigned char)pPeb
->StartupInfo
->Title
[i
];
333 lpStartupInfo
->lpTitle
[i
] = 0;
335 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
336 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
337 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
338 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
339 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
340 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
341 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
342 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
343 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
344 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
345 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
346 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
348 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
349 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
350 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
355 BOOL STDCALL
FlushInstructionCache(HANDLE hProcess
,
356 LPCVOID lpBaseAddress
,
360 errCode
= NtFlushInstructionCache(hProcess
,(PVOID
)lpBaseAddress
,dwSize
);
361 if (!NT_SUCCESS(errCode
))
363 SetLastError(RtlNtStatusToDosError(errCode
));
369 VOID STDCALL
ExitProcess(UINT uExitCode
)
371 NtTerminateProcess(NtCurrentProcess(), uExitCode
);
374 WINBOOL STDCALL
TerminateProcess(HANDLE hProcess
, UINT uExitCode
)
377 errCode
= NtTerminateProcess(hProcess
, uExitCode
);
378 if (!NT_SUCCESS(errCode
))
380 SetLastError(RtlNtStatusToDosError(errCode
));
386 VOID STDCALL
FatalAppExitA(UINT uAction
, LPCSTR lpMessageText
)
388 WCHAR MessageTextW
[MAX_PATH
];
391 while ((*lpMessageText
)!=0 && i
< 35)
393 MessageTextW
[i
] = *lpMessageText
;
399 return FatalAppExitW(uAction
,MessageTextW
);
404 VOID STDCALL
FatalAppExitW(UINT uAction
, LPCWSTR lpMessageText
)