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 ****************************************************************/
22 WaitForSingleObject(HANDLE hHandle,
25 return WaitForSingleObjectEx(hHandle,
32 WaitForSingleObjectEx(HANDLE hHandle,
36 PLARGE_INTEGER TimePtr;
41 switch ((ULONG)hHandle)
43 case STD_INPUT_HANDLE:
44 hHandle = NtCurrentPeb()->ProcessParameters->hStdInput;
47 case STD_OUTPUT_HANDLE:
48 hHandle = NtCurrentPeb()->ProcessParameters->hStdOutput;
51 case STD_ERROR_HANDLE:
52 hHandle = NtCurrentPeb()->ProcessParameters->hStdError;
56 /* Check for console handle */
57 if (IsConsoleHandle(hHandle))
59 if (VerifyConsoleIoHandle(hHandle))
61 DPRINT1("Console handles are not supported yet!\n");
62 SetLastError(ERROR_INVALID_HANDLE);
67 if (dwMilliseconds == INFINITE)
73 Time.QuadPart = -10000 * dwMilliseconds;
77 Status = NtWaitForSingleObject(hHandle,
80 if (Status == STATUS_TIMEOUT)
84 else if ((Status == WAIT_OBJECT_0) ||
85 (Status == WAIT_ABANDONED_0))
90 SetLastErrorByStatus (Status);
97 WaitForMultipleObjects(DWORD nCount,
98 CONST HANDLE *lpHandles,
100 DWORD dwMilliseconds)
102 return WaitForMultipleObjectsEx(nCount,
111 WaitForMultipleObjectsEx(DWORD nCount,
112 CONST HANDLE *lpHandles,
114 DWORD dwMilliseconds,
117 PLARGE_INTEGER TimePtr;
119 PHANDLE HandleBuffer;
123 DPRINT("nCount %lu\n", nCount);
125 HandleBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nCount * sizeof(HANDLE));
126 if (HandleBuffer == NULL)
128 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
132 for (i = 0; i < nCount; i++)
134 switch ((DWORD)lpHandles[i])
136 case STD_INPUT_HANDLE:
137 HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdInput;
140 case STD_OUTPUT_HANDLE:
141 HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdOutput;
144 case STD_ERROR_HANDLE:
145 HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdError;
149 HandleBuffer[i] = lpHandles[i];
153 /* Check for console handle */
154 if (IsConsoleHandle(HandleBuffer[i]))
156 if (VerifyConsoleIoHandle(HandleBuffer[i]))
158 DPRINT1("Console handles are not supported yet!\n");
159 RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
160 SetLastError(ERROR_INVALID_HANDLE);
166 if (dwMilliseconds == INFINITE)
172 Time.QuadPart = -10000 * dwMilliseconds;
176 Status = NtWaitForMultipleObjects (nCount,
178 bWaitAll ? WaitAll : WaitAny,
182 RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
184 if (Status == STATUS_TIMEOUT)
188 else if (((Status >= WAIT_OBJECT_0) &&
189 (Status <= WAIT_OBJECT_0 + nCount - 1)) ||
190 ((Status >= WAIT_ABANDONED_0) &&
191 (Status <= WAIT_ABANDONED_0 + nCount - 1)))
196 DPRINT("Status %lx\n", Status);
197 SetLastErrorByStatus (Status);
204 SignalObjectAndWait(HANDLE hObjectToSignal,
205 HANDLE hObjectToWaitOn,
206 DWORD dwMilliseconds,
209 PLARGE_INTEGER TimePtr;
213 /* Get real handle */
214 switch ((ULONG)hObjectToWaitOn)
216 case STD_INPUT_HANDLE:
217 hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdInput;
220 case STD_OUTPUT_HANDLE:
221 hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdOutput;
224 case STD_ERROR_HANDLE:
225 hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdError;
229 /* Check for console handle */
230 if (IsConsoleHandle(hObjectToWaitOn))
232 if (VerifyConsoleIoHandle(hObjectToWaitOn))
234 DPRINT1("Console handles are not supported yet!\n");
235 SetLastError(ERROR_INVALID_HANDLE);
240 if (dwMilliseconds == INFINITE)
246 Time.QuadPart = -10000 * dwMilliseconds;
250 Status = NtSignalAndWaitForSingleObject (hObjectToSignal,
253 (BOOLEAN)bAlertable);
254 if (!NT_SUCCESS(Status))
256 SetLastErrorByStatus (Status);