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 /* GLOBALS *****************************************************************/
27 WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle
;
29 VOID
RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle
);
31 /* FUNCTIONS ****************************************************************/
33 WINBOOL STDCALL
GetProcessId(HANDLE hProcess
, LPDWORD lpProcessId
);
35 FARPROC
GetProcAddress(HMODULE hModule
, LPCSTR lpProcName
)
37 dprintf("GetProcAddress is unimplemented\n");
40 WINBOOL STDCALL
GetProcessTimes(HANDLE hProcess
,
41 LPFILETIME lpCreationTime
,
42 LPFILETIME lpExitTime
,
43 LPFILETIME lpKernelTime
,
44 LPFILETIME lpUserTime
)
46 dprintf("GetProcessTimes is unimplemented\n");
50 HANDLE STDCALL
GetCurrentProcess(VOID
)
52 return (HANDLE
)NtCurrentProcess();
55 HANDLE STDCALL
GetCurrentThread(VOID
)
57 return (HANDLE
)NtCurrentThread();
60 DWORD STDCALL
GetCurrentProcessId(VOID
)
62 return (DWORD
)(GetTeb()->Cid
).UniqueProcess
;
65 WINBOOL STDCALL
GetExitCodeProcess(HANDLE hProcess
, LPDWORD lpExitCode
)
68 PROCESS_BASIC_INFORMATION ProcessBasic
;
71 errCode
= NtQueryInformationProcess(hProcess
,
72 ProcessBasicInformation
,
74 sizeof(PROCESS_BASIC_INFORMATION
),
76 if (!NT_SUCCESS(errCode
))
78 SetLastError(RtlNtStatusToDosError(errCode
));
81 memcpy( lpExitCode
,&ProcessBasic
.ExitStatus
,sizeof(DWORD
));
85 WINBOOL STDCALL
GetProcessId(HANDLE hProcess
, LPDWORD lpProcessId
)
88 PROCESS_BASIC_INFORMATION ProcessBasic
;
91 errCode
= NtQueryInformationProcess(hProcess
,
92 ProcessBasicInformation
,
94 sizeof(PROCESS_BASIC_INFORMATION
),
96 if (!NT_SUCCESS(errCode
))
98 SetLastError(RtlNtStatusToDosError(errCode
));
101 memcpy( lpProcessId
,&ProcessBasic
.UniqueProcessId
,sizeof(DWORD
));
105 PWSTR
InternalAnsiToUnicode(PWSTR Out
, LPCSTR In
, ULONG MaxLength
)
116 while ((*In
)!=0 && i
< MaxLength
)
127 HANDLE STDCALL
OpenProcess(DWORD dwDesiredAccess
,
128 WINBOOL bInheritHandle
,
132 HANDLE ProcessHandle
;
133 OBJECT_ATTRIBUTES ObjectAttributes
;
136 ClientId
.UniqueProcess
= (HANDLE
)dwProcessId
;
137 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
138 ObjectAttributes
.RootDirectory
= (HANDLE
)NULL
;
139 ObjectAttributes
.SecurityDescriptor
= NULL
;
140 ObjectAttributes
.SecurityQualityOfService
= NULL
;
142 if ( bInheritHandle
== TRUE
)
143 ObjectAttributes
.Attributes
= OBJ_INHERIT
;
145 ObjectAttributes
.Attributes
= 0;
147 errCode
= NtOpenProcess(&ProcessHandle
,
151 if (!NT_SUCCESS(errCode
))
153 SetLastError(RtlNtStatusToDosError(errCode
));
156 return ProcessHandle
;
171 UINT
WinExec (LPCSTR lpCmdLine
, UINT uCmdShow
)
173 STARTUPINFO StartupInfo
;
174 PROCESS_INFORMATION ProcessInformation
;
178 StartupInfo
.cb
= sizeof(STARTUPINFO
);
179 StartupInfo
.wShowWindow
= uCmdShow
;
180 StartupInfo
.dwFlags
= 0;
182 hInst
= (HINSTANCE
)CreateProcessA(NULL
,
191 &ProcessInformation
);
194 dosErr
= GetLastError();
197 if ( lpfnGlobalRegisterWaitForInputIdle
!= NULL
)
198 lpfnGlobalRegisterWaitForInputIdle(ProcessInformation
.hProcess
,10000);
199 NtClose(ProcessInformation
.hProcess
);
200 NtClose(ProcessInformation
.hThread
);
206 VOID
RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle
)
208 lpfnGlobalRegisterWaitForInputIdle
= lpfnRegisterWaitForInputIdle
;
212 DWORD STDCALL
WaitForInputIdle(HANDLE hProcess
,
213 DWORD dwMilliseconds
)
224 SleepEx(dwMilliseconds
,FALSE
);
231 DWORD dwMilliseconds
,
238 Interval
.LowPart
= dwMilliseconds
* 1000;
239 Interval
.HighPart
= 0;
241 errCode
= NtDelayExecution(bAlertable
,&Interval
);
242 if ( !NT_SUCCESS(errCode
) ) {
243 SetLastError(RtlNtStatusToDosError(errCode
));
253 VOID STDCALL
GetStartupInfoW(LPSTARTUPINFO lpStartupInfo
)
255 NT_PEB
*pPeb
= NtCurrentPeb();
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
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
280 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
281 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
292 VOID STDCALL
GetStartupInfoA(LPSTARTUPINFO lpStartupInfo
)
294 NT_PEB
*pPeb
= NtCurrentPeb();
297 if (lpStartupInfo
== NULL
)
299 SetLastError(ERROR_INVALID_PARAMETER
);
303 lpStartupInfo
->cb
= sizeof(STARTUPINFO
);
306 while ((pPeb
->StartupInfo
->Desktop
[i
])!=0 && i
< MAX_PATH
)
308 lpStartupInfo
->lpDesktop
[i
] = (unsigned char)pPeb
->StartupInfo
->Desktop
[i
];
311 lpStartupInfo
->lpDesktop
[i
] = 0;
314 while ((pPeb
->StartupInfo
->Title
[i
])!=0 && i
< MAX_PATH
)
316 lpStartupInfo
->lpTitle
[i
] = (unsigned char)pPeb
->StartupInfo
->Title
[i
];
319 lpStartupInfo
->lpTitle
[i
] = 0;
321 lpStartupInfo
->dwX
= pPeb
->StartupInfo
->dwX
;
322 lpStartupInfo
->dwY
= pPeb
->StartupInfo
->dwY
;
323 lpStartupInfo
->dwXSize
= pPeb
->StartupInfo
->dwXSize
;
324 lpStartupInfo
->dwYSize
= pPeb
->StartupInfo
->dwYSize
;
325 lpStartupInfo
->dwXCountChars
= pPeb
->StartupInfo
->dwXCountChars
;
326 lpStartupInfo
->dwYCountChars
= pPeb
->StartupInfo
->dwYCountChars
;
327 lpStartupInfo
->dwFillAttribute
= pPeb
->StartupInfo
->dwFillAttribute
;
328 lpStartupInfo
->dwFlags
= pPeb
->StartupInfo
->dwFlags
;
329 lpStartupInfo
->wShowWindow
= pPeb
->StartupInfo
->wShowWindow
;
330 //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved;
331 //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1;
332 //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2;
334 lpStartupInfo
->hStdInput
= pPeb
->StartupInfo
->hStdInput
;
335 lpStartupInfo
->hStdOutput
= pPeb
->StartupInfo
->hStdOutput
;
336 lpStartupInfo
->hStdError
= pPeb
->StartupInfo
->hStdError
;
341 BOOL STDCALL
FlushInstructionCache(HANDLE hProcess
,
342 LPCVOID lpBaseAddress
,
346 errCode
= NtFlushInstructionCache(hProcess
,(PVOID
)lpBaseAddress
,dwSize
);
347 if (!NT_SUCCESS(errCode
))
349 SetLastError(RtlNtStatusToDosError(errCode
));
355 VOID STDCALL
ExitProcess(UINT uExitCode
)
357 NtTerminateProcess(NtCurrentProcess() ,uExitCode
);
360 VOID STDCALL
FatalAppExitA(UINT uAction
, LPCSTR lpMessageText
)
362 WCHAR MessageTextW
[MAX_PATH
];
365 while ((*lpMessageText
)!=0 && i
< 35)
367 MessageTextW
[i
] = *lpMessageText
;
373 return FatalAppExitW(uAction
,MessageTextW
);
378 VOID STDCALL
FatalAppExitW(UINT uAction
, LPCWSTR lpMessageText
)