3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/synch/wait.c
6 * PURPOSE: Wait functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES *****************************************************************/
17 #include <kernel32/kernel32.h>
19 /* FUNCTIONS ****************************************************************/
25 WaitForSingleObject(HANDLE hHandle,
28 return WaitForSingleObjectEx(hHandle,
38 WaitForSingleObjectEx(HANDLE hHandle,
42 PLARGE_INTEGER TimePtr;
47 switch ((ULONG)hHandle)
49 case STD_INPUT_HANDLE:
50 hHandle = NtCurrentPeb()->ProcessParameters->hStdInput;
53 case STD_OUTPUT_HANDLE:
54 hHandle = NtCurrentPeb()->ProcessParameters->hStdOutput;
57 case STD_ERROR_HANDLE:
58 hHandle = NtCurrentPeb()->ProcessParameters->hStdError;
62 /* Check for console handle */
63 if (IsConsoleHandle(hHandle))
65 if (VerifyConsoleIoHandle(hHandle))
67 DPRINT1("Console handles are not supported yet!\n");
68 SetLastError(ERROR_INVALID_HANDLE);
73 if (dwMilliseconds == INFINITE)
79 Time.QuadPart = -10000 * (LONGLONG)dwMilliseconds;
83 Status = NtWaitForSingleObject(hHandle,
86 if (Status == STATUS_TIMEOUT)
90 else if ((Status == WAIT_OBJECT_0) ||
91 (Status == WAIT_ABANDONED_0))
96 SetLastErrorByStatus (Status);
106 WaitForMultipleObjects(DWORD nCount,
107 CONST HANDLE *lpHandles,
109 DWORD dwMilliseconds)
111 return WaitForMultipleObjectsEx(nCount,
123 WaitForMultipleObjectsEx(DWORD nCount,
124 CONST HANDLE *lpHandles,
126 DWORD dwMilliseconds,
129 PLARGE_INTEGER TimePtr;
131 PHANDLE HandleBuffer;
135 DPRINT("nCount %lu\n", nCount);
137 HandleBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nCount * sizeof(HANDLE));
138 if (HandleBuffer == NULL)
140 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
144 for (i = 0; i < nCount; i++)
146 switch ((DWORD)lpHandles[i])
148 case STD_INPUT_HANDLE:
149 HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdInput;
152 case STD_OUTPUT_HANDLE:
153 HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdOutput;
156 case STD_ERROR_HANDLE:
157 HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdError;
161 HandleBuffer[i] = lpHandles[i];
165 /* Check for console handle */
166 if (IsConsoleHandle(HandleBuffer[i]))
168 if (VerifyConsoleIoHandle(HandleBuffer[i]))
170 DPRINT1("Console handles are not supported yet!\n");
171 RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
172 SetLastError(ERROR_INVALID_HANDLE);
178 if (dwMilliseconds == INFINITE)
184 Time.QuadPart = -10000 * (LONGLONG)dwMilliseconds;
188 Status = NtWaitForMultipleObjects (nCount,
190 bWaitAll ? WaitAll : WaitAny,
194 RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
196 if (Status == STATUS_TIMEOUT)
200 else if (((Status >= WAIT_OBJECT_0) &&
201 (Status <= WAIT_OBJECT_0 + nCount - 1)) ||
202 ((Status >= WAIT_ABANDONED_0) &&
203 (Status <= WAIT_ABANDONED_0 + nCount - 1)))
208 DPRINT("Status %lx\n", Status);
209 SetLastErrorByStatus (Status);
219 SignalObjectAndWait(HANDLE hObjectToSignal,
220 HANDLE hObjectToWaitOn,
221 DWORD dwMilliseconds,
224 PLARGE_INTEGER TimePtr;
228 /* Get real handle */
229 switch ((ULONG)hObjectToWaitOn)
231 case STD_INPUT_HANDLE:
232 hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdInput;
235 case STD_OUTPUT_HANDLE:
236 hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdOutput;
239 case STD_ERROR_HANDLE:
240 hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdError;
244 /* Check for console handle */
245 if (IsConsoleHandle(hObjectToWaitOn))
247 if (VerifyConsoleIoHandle(hObjectToWaitOn))
249 DPRINT1("Console handles are not supported yet!\n");
250 SetLastError(ERROR_INVALID_HANDLE);
255 if (dwMilliseconds == INFINITE)
261 Time.QuadPart = -10000 * (LONGLONG)dwMilliseconds;
265 Status = NtSignalAndWaitForSingleObject (hObjectToSignal,
269 if (!NT_SUCCESS(Status))
271 SetLastErrorByStatus (Status);