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,19 +158,19 @@ 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
STDCALL
WaitForSingleObjectEx(HANDLE hHandle,
DWORD dwMilliseconds, DWORD dwMilliseconds,
BOOL bAlertable) BOOL bAlertable)
{ {
NTSTATUS errCode; NTSTATUS errCode;
PLARGE_INTEGER TimePtr; PLARGE_INTEGER TimePtr;
LARGE_INTEGER Time; LARGE_INTEGER Time;
@ -182,58 +182,84 @@ DWORD STDCALL WaitForSingleObjectEx(HANDLE hHandle,
} }
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;
PLARGE_INTEGER TimePtr;
DWORD retCode; 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,
&Time TimePtr);
);
if (errCode == STATUS_TIMEOUT)
{
return WAIT_TIMEOUT;
}
else if ((errCode >= WAIT_OBJECT_0) &&
(errCode <= WAIT_OBJECT_0 + nCount - 1))
{
return errCode;
}
retCode = RtlNtStatusToDosError(errCode); retCode = RtlNtStatusToDosError(errCode);
SetLastError(retCode); SetLastError(retCode);
return retCode;
return 0xFFFFFFFF;
} }
/* EOF */