mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 14:32:56 +00:00
Implemented SignalObjectAndWait().
Added some checks for console handles. svn path=/trunk/; revision=4247
This commit is contained in:
parent
bceffa7c9b
commit
916b14c816
2 changed files with 249 additions and 129 deletions
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue