Fixed WaitForSingleObject() and WaitForMultipleObjects().

svn path=/trunk/; revision=663
This commit is contained in:
Eric Kohl 1999-09-12 20:54:42 +00:00
parent 3255097117
commit e0058203bb

View file

@ -158,82 +158,108 @@ CreateMutexW(
DWORD DWORD
STDCALL STDCALL
WaitForSingleObject( WaitForSingleObject(HANDLE hHandle,
HANDLE hHandle, DWORD dwMilliseconds)
DWORD dwMilliseconds
)
{ {
return WaitForSingleObjectEx(hHandle,dwMilliseconds,FALSE); return WaitForSingleObjectEx(hHandle,dwMilliseconds,FALSE);
} }
DWORD STDCALL WaitForSingleObjectEx(HANDLE hHandle,
DWORD dwMilliseconds, DWORD
BOOL bAlertable) STDCALL
WaitForSingleObjectEx(HANDLE hHandle,
DWORD dwMilliseconds,
BOOL bAlertable)
{ {
NTSTATUS errCode; NTSTATUS errCode;
PLARGE_INTEGER TimePtr; PLARGE_INTEGER TimePtr;
LARGE_INTEGER Time; LARGE_INTEGER Time;
DWORD retCode; DWORD retCode;
if (dwMilliseconds == INFINITE) if (dwMilliseconds == INFINITE)
{ {
TimePtr = NULL; TimePtr = NULL;
} }
else else
{ {
Time.u.LowPart = dwMilliseconds; Time.QuadPart = -10000 * dwMilliseconds;
Time.u.HighPart = 0;
TimePtr = &Time; TimePtr = &Time;
} }
errCode = NtWaitForSingleObject(hHandle, errCode = NtWaitForSingleObject(hHandle,
(BOOLEAN) bAlertable, (BOOLEAN) bAlertable,
TimePtr); TimePtr);
if (errCode == STATUS_TIMEOUT)
{
return WAIT_TIMEOUT;
}
else if (errCode == WAIT_OBJECT_0)
{
return WAIT_OBJECT_0;
}
retCode = RtlNtStatusToDosError(errCode); retCode = RtlNtStatusToDosError(errCode);
SetLastError(retCode); SetLastError(retCode);
return retCode;
return 0xFFFFFFFF;
} }
DWORD DWORD
STDCALL STDCALL
WaitForMultipleObjects( WaitForMultipleObjects(DWORD nCount,
DWORD nCount, CONST HANDLE *lpHandles,
CONST HANDLE * lpHandles, BOOL bWaitAll,
BOOL bWaitAll, DWORD dwMilliseconds)
DWORD dwMilliseconds
)
{ {
return WaitForMultipleObjectsEx(nCount,lpHandles,bWaitAll,dwMilliseconds,FALSE); return WaitForMultipleObjectsEx(nCount,lpHandles,bWaitAll,dwMilliseconds,FALSE);
} }
DWORD DWORD
STDCALL STDCALL
WaitForMultipleObjectsEx( WaitForMultipleObjectsEx(DWORD nCount,
DWORD nCount, CONST HANDLE *lpHandles,
CONST HANDLE * lpHandles, BOOL bWaitAll,
BOOL bWaitAll, DWORD dwMilliseconds,
DWORD dwMilliseconds, BOOL bAlertable)
BOOL bAlertable
)
{ {
NTSTATUS errCode; NTSTATUS errCode;
LARGE_INTEGER Time; LARGE_INTEGER Time;
DWORD retCode; PLARGE_INTEGER TimePtr;
DWORD retCode;
Time.u.LowPart = dwMilliseconds; if (dwMilliseconds == INFINITE)
Time.u.HighPart = 0; {
TimePtr = NULL;
}
else
{
Time.QuadPart = -10000 * dwMilliseconds;
TimePtr = &Time;
}
errCode = NtWaitForMultipleObjects ( errCode = NtWaitForMultipleObjects (nCount,
nCount, (PHANDLE)lpHandles,
(PHANDLE)lpHandles, (CINT)bWaitAll,
(CINT)bWaitAll, (BOOLEAN)bAlertable,
(BOOLEAN)bAlertable, TimePtr);
&Time
);
retCode = RtlNtStatusToDosError(errCode); if (errCode == STATUS_TIMEOUT)
SetLastError(retCode); {
return retCode; return WAIT_TIMEOUT;
}
else if ((errCode >= WAIT_OBJECT_0) &&
(errCode <= WAIT_OBJECT_0 + nCount - 1))
{
return errCode;
}
retCode = RtlNtStatusToDosError(errCode);
SetLastError(retCode);
return 0xFFFFFFFF;
} }
/* EOF */