Implemented SignalObjectAndWait().

Added some checks for console handles.

svn path=/trunk/; revision=4247
This commit is contained in:
Eric Kohl 2003-03-06 13:01:15 +00:00
parent bceffa7c9b
commit 916b14c816
2 changed files with 249 additions and 129 deletions

View file

@ -1,4 +1,4 @@
/* $Id: file.c,v 1.41 2003/02/12 00:39:31 hyperion Exp $ /* $Id: file.c,v 1.42 2003/03/06 13:00:51 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -245,75 +245,72 @@ SetFilePointer(HANDLE hFile,
DWORD STDCALL DWORD STDCALL
GetFileType(HANDLE hFile) GetFileType(HANDLE hFile)
{ {
FILE_FS_DEVICE_INFORMATION DeviceInfo; FILE_FS_DEVICE_INFORMATION DeviceInfo;
IO_STATUS_BLOCK StatusBlock; IO_STATUS_BLOCK StatusBlock;
NTSTATUS Status; NTSTATUS Status;
/* get real handle */ /* Get real handle */
switch ((ULONG)hFile) switch ((ULONG)hFile)
{ {
case STD_INPUT_HANDLE: case STD_INPUT_HANDLE:
hFile = NtCurrentPeb()->ProcessParameters->hStdInput; hFile = NtCurrentPeb()->ProcessParameters->hStdInput;
break;
break; case STD_OUTPUT_HANDLE:
hFile = NtCurrentPeb()->ProcessParameters->hStdOutput;
break;
case STD_OUTPUT_HANDLE: case STD_ERROR_HANDLE:
hFile = NtCurrentPeb()->ProcessParameters->hStdOutput; hFile = NtCurrentPeb()->ProcessParameters->hStdError;
break;
}
break; /* Check for console handle */
if (IsConsoleHandle(hFile))
{
if (VerifyConsoleIoHandle(hFile))
return FILE_TYPE_CHAR;
}
case STD_ERROR_HANDLE: Status = NtQueryVolumeInformationFile(hFile,
hFile = NtCurrentPeb()->ProcessParameters->hStdError; &StatusBlock,
&DeviceInfo,
sizeof(FILE_FS_DEVICE_INFORMATION),
FileFsDeviceInformation);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FILE_TYPE_UNKNOWN;
}
break; switch (DeviceInfo.DeviceType)
} {
case FILE_DEVICE_CD_ROM:
case FILE_DEVICE_CD_ROM_FILE_SYSTEM:
case FILE_DEVICE_CONTROLLER:
case FILE_DEVICE_DATALINK:
case FILE_DEVICE_DFS:
case FILE_DEVICE_DISK:
case FILE_DEVICE_DISK_FILE_SYSTEM:
case FILE_DEVICE_VIRTUAL_DISK:
return FILE_TYPE_DISK;
/* check console handles */ case FILE_DEVICE_KEYBOARD:
if (IsConsoleHandle(hFile)) case FILE_DEVICE_MOUSE:
{ case FILE_DEVICE_NULL:
// if (VerifyConsoleHandle(hFile)) case FILE_DEVICE_PARALLEL_PORT:
return FILE_TYPE_CHAR; case FILE_DEVICE_PRINTER:
} case FILE_DEVICE_SERIAL_PORT:
case FILE_DEVICE_SCREEN:
case FILE_DEVICE_SOUND:
case FILE_DEVICE_MODEM:
return FILE_TYPE_CHAR;
Status = NtQueryVolumeInformationFile(hFile, case FILE_DEVICE_NAMED_PIPE:
&StatusBlock, return FILE_TYPE_PIPE;
&DeviceInfo, }
sizeof(FILE_FS_DEVICE_INFORMATION),
FileFsDeviceInformation);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FILE_TYPE_UNKNOWN;
}
switch (DeviceInfo.DeviceType) return FILE_TYPE_UNKNOWN;
{
case FILE_DEVICE_CD_ROM:
case FILE_DEVICE_CD_ROM_FILE_SYSTEM:
case FILE_DEVICE_CONTROLLER:
case FILE_DEVICE_DATALINK:
case FILE_DEVICE_DFS:
case FILE_DEVICE_DISK:
case FILE_DEVICE_DISK_FILE_SYSTEM:
case FILE_DEVICE_VIRTUAL_DISK:
return FILE_TYPE_DISK;
case FILE_DEVICE_KEYBOARD:
case FILE_DEVICE_MOUSE:
case FILE_DEVICE_NULL:
case FILE_DEVICE_PARALLEL_PORT:
case FILE_DEVICE_PRINTER:
case FILE_DEVICE_SERIAL_PORT:
case FILE_DEVICE_SCREEN:
case FILE_DEVICE_SOUND:
case FILE_DEVICE_MODEM:
return FILE_TYPE_CHAR;
case FILE_DEVICE_NAMED_PIPE:
return FILE_TYPE_PIPE;
}
return FILE_TYPE_UNKNOWN;
} }

View file

@ -1,4 +1,4 @@
/* $Id: wait.c,v 1.20 2003/02/27 15:40:46 gdalsnes Exp $ /* $Id: wait.c,v 1.21 2003/03/06 13:01:15 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -33,50 +33,77 @@ WaitForSingleObjectEx(HANDLE hHandle,
DWORD dwMilliseconds, DWORD dwMilliseconds,
BOOL bAlertable) BOOL bAlertable)
{ {
NTSTATUS errCode; PLARGE_INTEGER TimePtr;
PLARGE_INTEGER TimePtr; LARGE_INTEGER Time;
LARGE_INTEGER Time; NTSTATUS Status;
if (dwMilliseconds == INFINITE) /* Get real handle */
{ switch ((ULONG)hHandle)
TimePtr = NULL; {
} case STD_INPUT_HANDLE:
else hHandle = NtCurrentPeb()->ProcessParameters->hStdInput;
{ break;
Time.QuadPart = -10000 * dwMilliseconds;
TimePtr = &Time;
}
errCode = NtWaitForSingleObject(hHandle, case STD_OUTPUT_HANDLE:
(BOOLEAN) bAlertable, hHandle = NtCurrentPeb()->ProcessParameters->hStdOutput;
TimePtr); break;
if (errCode == STATUS_TIMEOUT)
{
return WAIT_TIMEOUT;
}
else if ((errCode == WAIT_OBJECT_0) ||
(errCode == WAIT_ABANDONED_0))
{
return(errCode);
}
SetLastErrorByStatus (errCode); case STD_ERROR_HANDLE:
hHandle = NtCurrentPeb()->ProcessParameters->hStdError;
break;
}
return(WAIT_FAILED); /* Check for console handle */
if (IsConsoleHandle(hHandle))
{
if (VerifyConsoleIoHandle(hHandle))
{
DPRINT1("Console handles are not supported yet!\n");
SetLastError(ERROR_INVALID_HANDLE);
return WAIT_FAILED;
}
}
if (dwMilliseconds == INFINITE)
{
TimePtr = NULL;
}
else
{
Time.QuadPart = -10000 * dwMilliseconds;
TimePtr = &Time;
}
Status = NtWaitForSingleObject(hHandle,
(BOOLEAN) bAlertable,
TimePtr);
if (Status == STATUS_TIMEOUT)
{
return WAIT_TIMEOUT;
}
else if ((Status == WAIT_OBJECT_0) ||
(Status == WAIT_ABANDONED_0))
{
return Status;
}
SetLastErrorByStatus (Status);
return WAIT_FAILED;
} }
DWORD STDCALL DWORD STDCALL
WaitForMultipleObjects(DWORD nCount, WaitForMultipleObjects(DWORD nCount,
CONST HANDLE *lpHandles, CONST HANDLE *lpHandles,
BOOL bWaitAll, BOOL bWaitAll,
DWORD dwMilliseconds) DWORD dwMilliseconds)
{ {
return WaitForMultipleObjectsEx(nCount, return WaitForMultipleObjectsEx(nCount,
lpHandles, lpHandles,
bWaitAll, bWaitAll,
dwMilliseconds, dwMilliseconds,
FALSE); FALSE);
} }
@ -87,44 +114,89 @@ WaitForMultipleObjectsEx(DWORD nCount,
DWORD dwMilliseconds, DWORD dwMilliseconds,
BOOL bAlertable) BOOL bAlertable)
{ {
NTSTATUS errCode; PLARGE_INTEGER TimePtr;
LARGE_INTEGER Time; LARGE_INTEGER Time;
PLARGE_INTEGER TimePtr; PHANDLE HandleBuffer;
DWORD i;
NTSTATUS Status;
DPRINT("nCount %lu\n", nCount); DPRINT("nCount %lu\n", nCount);
if (dwMilliseconds == INFINITE) HandleBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, nCount * sizeof(HANDLE));
{ if (HandleBuffer == NULL)
TimePtr = NULL; {
} SetLastError(ERROR_NOT_ENOUGH_MEMORY);
else return WAIT_FAILED;
{ }
Time.QuadPart = -10000 * dwMilliseconds;
TimePtr = &Time;
}
errCode = NtWaitForMultipleObjects (nCount, for (i = 0; i < nCount; i++)
(PHANDLE)lpHandles, {
bWaitAll ? WaitAll : WaitAny, switch ((DWORD)lpHandles[i])
(BOOLEAN)bAlertable, {
TimePtr); case STD_INPUT_HANDLE:
HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdInput;
break;
if (errCode == STATUS_TIMEOUT) case STD_OUTPUT_HANDLE:
{ HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdOutput;
return WAIT_TIMEOUT; break;
}
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); case STD_ERROR_HANDLE:
SetLastErrorByStatus (errCode); HandleBuffer[i] = NtCurrentPeb()->ProcessParameters->hStdError;
break;
return(WAIT_FAILED); default:
HandleBuffer[i] = lpHandles[i];
break;
}
/* Check for console handle */
if (IsConsoleHandle(HandleBuffer[i]))
{
if (VerifyConsoleIoHandle(HandleBuffer[i]))
{
DPRINT1("Console handles are not supported yet!\n");
RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
}
}
if (dwMilliseconds == INFINITE)
{
TimePtr = NULL;
}
else
{
Time.QuadPart = -10000 * dwMilliseconds;
TimePtr = &Time;
}
Status = NtWaitForMultipleObjects (nCount,
HandleBuffer,
bWaitAll ? WaitAll : WaitAny,
(BOOLEAN)bAlertable,
TimePtr);
RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
if (Status == STATUS_TIMEOUT)
{
return WAIT_TIMEOUT;
}
else if (((Status >= WAIT_OBJECT_0) &&
(Status <= WAIT_OBJECT_0 + nCount - 1)) ||
((Status >= WAIT_ABANDONED_0) &&
(Status <= WAIT_ABANDONED_0 + nCount - 1)))
{
return Status;
}
DPRINT("Status %lx\n", Status);
SetLastErrorByStatus (Status);
return WAIT_FAILED;
} }
@ -134,7 +206,58 @@ SignalObjectAndWait(HANDLE hObjectToSignal,
DWORD dwMilliseconds, DWORD dwMilliseconds,
BOOL bAlertable) BOOL bAlertable)
{ {
UNIMPLEMENTED PLARGE_INTEGER TimePtr;
LARGE_INTEGER Time;
NTSTATUS Status;
/* Get real handle */
switch ((ULONG)hObjectToWaitOn)
{
case STD_INPUT_HANDLE:
hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdInput;
break;
case STD_OUTPUT_HANDLE:
hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdOutput;
break;
case STD_ERROR_HANDLE:
hObjectToWaitOn = NtCurrentPeb()->ProcessParameters->hStdError;
break;
}
/* Check for console handle */
if (IsConsoleHandle(hObjectToWaitOn))
{
if (VerifyConsoleIoHandle(hObjectToWaitOn))
{
DPRINT1("Console handles are not supported yet!\n");
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
}
if (dwMilliseconds == INFINITE)
{
TimePtr = NULL;
}
else
{
Time.QuadPart = -10000 * dwMilliseconds;
TimePtr = &Time;
}
Status = NtSignalAndWaitForSingleObject (hObjectToSignal,
hObjectToWaitOn,
TimePtr,
(BOOLEAN)bAlertable);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus (Status);
return FALSE;
}
return TRUE;
} }
/* EOF */ /* EOF */