mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-27 19:25:36 +00:00
Fixed return value of KeWaitForMultipleObjects() on timeout. svn path=/trunk/; revision=2355
143 lines
3.1 KiB
C
143 lines
3.1 KiB
C
/* $Id: wait.c,v 1.15 2001/11/07 02:17:22 ekohl Exp $
|
|
*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS system libraries
|
|
* FILE: lib/kernel32/synch/wait.c
|
|
* PURPOSE: Wait functions
|
|
* PROGRAMMER: Ariadne ( [email protected])
|
|
* UPDATE HISTORY:
|
|
* Created 01/11/98
|
|
*/
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
#include <ddk/ntddk.h>
|
|
#include <kernel32/error.h>
|
|
#include <windows.h>
|
|
#include <wchar.h>
|
|
|
|
#define NDEBUG
|
|
#include <kernel32/kernel32.h>
|
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
DWORD STDCALL
|
|
WaitForSingleObject(HANDLE hHandle,
|
|
DWORD dwMilliseconds)
|
|
{
|
|
return WaitForSingleObjectEx(hHandle,
|
|
dwMilliseconds,
|
|
FALSE);
|
|
}
|
|
|
|
|
|
DWORD STDCALL
|
|
WaitForSingleObjectEx(HANDLE hHandle,
|
|
DWORD dwMilliseconds,
|
|
BOOL bAlertable)
|
|
{
|
|
NTSTATUS errCode;
|
|
PLARGE_INTEGER TimePtr;
|
|
LARGE_INTEGER Time;
|
|
|
|
if (dwMilliseconds == INFINITE)
|
|
{
|
|
TimePtr = NULL;
|
|
}
|
|
else
|
|
{
|
|
Time.QuadPart = -10000 * dwMilliseconds;
|
|
TimePtr = &Time;
|
|
}
|
|
|
|
errCode = NtWaitForSingleObject(hHandle,
|
|
(BOOLEAN) bAlertable,
|
|
TimePtr);
|
|
if (errCode == STATUS_TIMEOUT)
|
|
{
|
|
return WAIT_TIMEOUT;
|
|
}
|
|
else if (errCode == WAIT_OBJECT_0)
|
|
{
|
|
return WAIT_OBJECT_0;
|
|
}
|
|
|
|
SetLastErrorByStatus (errCode);
|
|
|
|
return(WAIT_FAILED);
|
|
}
|
|
|
|
|
|
DWORD STDCALL
|
|
WaitForMultipleObjects(DWORD nCount,
|
|
CONST HANDLE *lpHandles,
|
|
BOOL bWaitAll,
|
|
DWORD dwMilliseconds)
|
|
{
|
|
return WaitForMultipleObjectsEx(nCount,
|
|
lpHandles,
|
|
bWaitAll ? WaitAll : WaitAny,
|
|
dwMilliseconds,
|
|
FALSE);
|
|
}
|
|
|
|
|
|
DWORD STDCALL
|
|
WaitForMultipleObjectsEx(DWORD nCount,
|
|
CONST HANDLE *lpHandles,
|
|
BOOL bWaitAll,
|
|
DWORD dwMilliseconds,
|
|
BOOL bAlertable)
|
|
{
|
|
NTSTATUS errCode;
|
|
LARGE_INTEGER Time;
|
|
PLARGE_INTEGER TimePtr;
|
|
|
|
DPRINT("nCount %lu\n", nCount);
|
|
|
|
if (dwMilliseconds == INFINITE)
|
|
{
|
|
TimePtr = NULL;
|
|
}
|
|
else
|
|
{
|
|
Time.QuadPart = -10000 * dwMilliseconds;
|
|
TimePtr = &Time;
|
|
}
|
|
|
|
errCode = NtWaitForMultipleObjects (nCount,
|
|
(PHANDLE)lpHandles,
|
|
(CINT)bWaitAll,
|
|
(BOOLEAN)bAlertable,
|
|
TimePtr);
|
|
|
|
if (errCode == STATUS_TIMEOUT)
|
|
{
|
|
return WAIT_TIMEOUT;
|
|
}
|
|
else if (((errCode >= WAIT_OBJECT_0) &&
|
|
(errCode <= WAIT_OBJECT_0 + nCount - 1)) ||
|
|
((errCode >= WAIT_ABANDONED_0) &&
|
|
(errCode <= WAIT_ABANDONED_0 + nCount - 1)))
|
|
{
|
|
return(errCode);
|
|
}
|
|
|
|
DPRINT("errCode %lx\n", errCode);
|
|
SetLastErrorByStatus (errCode);
|
|
|
|
return(WAIT_FAILED);
|
|
}
|
|
|
|
|
|
BOOL STDCALL
|
|
SignalObjectAndWait(HANDLE hObjectToSignal,
|
|
HANDLE hObjectToWaitOn,
|
|
DWORD dwMilliseconds,
|
|
BOOL bAlertable)
|
|
{
|
|
UNIMPLEMENTED
|
|
}
|
|
|
|
/* EOF */
|