-/* $Id: handle.c,v 1.13 2003/08/28 19:37:00 gvg Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
#include <k32.h>
#define NDEBUG
-#include <kernel32/kernel32.h>
+#include "../include/debug.h"
/* GLOBALS *******************************************************************/
-WINBOOL STDCALL
-InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
-
HANDLE STDCALL
DuplicateConsoleHandle (HANDLE hConsole,
DWORD dwDesiredAccess,
/*
* @implemented
*/
-WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
+BOOL WINAPI
+GetHandleInformation (HANDLE hObject,
+ LPDWORD lpdwFlags)
{
- OBJECT_DATA_INFORMATION HandleInfo;
- ULONG BytesWritten;
- NTSTATUS errCode;
-
- errCode = NtQueryObject(hObject,
- ObjectDataInformation,
- &HandleInfo,
- sizeof(OBJECT_DATA_INFORMATION),
- &BytesWritten);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus (errCode);
- return FALSE;
- }
- if ( HandleInfo.bInheritHandle )
- *lpdwFlags &= HANDLE_FLAG_INHERIT;
- if ( HandleInfo.bProtectFromClose )
- *lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
- return TRUE;
+ PRTL_USER_PROCESS_PARAMETERS Ppb;
+ OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
+ ULONG BytesWritten;
+ NTSTATUS Status;
+ DWORD Flags;
+
+ Ppb = NtCurrentPeb()->ProcessParameters;
+ switch ((ULONG)hObject)
+ {
+ case STD_INPUT_HANDLE:
+ hObject = Ppb->StandardInput;
+ break;
+ case STD_OUTPUT_HANDLE:
+ hObject = Ppb->StandardOutput;
+ break;
+ case STD_ERROR_HANDLE:
+ hObject = Ppb->StandardError;
+ break;
+ }
+
+ Status = NtQueryObject (hObject,
+ ObjectHandleInformation,
+ &HandleInfo,
+ sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
+ &BytesWritten);
+ if (NT_SUCCESS(Status))
+ {
+ Flags = 0;
+ if (HandleInfo.Inherit)
+ Flags |= HANDLE_FLAG_INHERIT;
+ if (HandleInfo.ProtectFromClose)
+ Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
+
+ *lpdwFlags = Flags;
+
+ return TRUE;
+ }
+ else
+ {
+ SetLastErrorByStatus (Status);
+ return FALSE;
+ }
}
/*
* @implemented
*/
-WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
- DWORD dwMask,
- DWORD dwFlags)
+BOOL STDCALL
+SetHandleInformation (HANDLE hObject,
+ DWORD dwMask,
+ DWORD dwFlags)
{
- OBJECT_DATA_INFORMATION HandleInfo;
- NTSTATUS errCode;
- ULONG BytesWritten;
-
- errCode = NtQueryObject(hObject,
- ObjectDataInformation,
- &HandleInfo,
- sizeof(OBJECT_DATA_INFORMATION),
- &BytesWritten);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus (errCode);
- return FALSE;
- }
- if (dwMask & HANDLE_FLAG_INHERIT)
- {
- HandleInfo.bInheritHandle = dwFlags & HANDLE_FLAG_INHERIT;
- }
- if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
- {
- HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
- }
-
- errCode = NtSetInformationObject(hObject,
- ObjectDataInformation,
- &HandleInfo,
- sizeof(OBJECT_DATA_INFORMATION));
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus (errCode);
- return FALSE;
- }
-
- return TRUE;
+ PRTL_USER_PROCESS_PARAMETERS Ppb;
+ OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
+ ULONG BytesWritten;
+ NTSTATUS Status;
+
+ Ppb = NtCurrentPeb()->ProcessParameters;
+ switch ((ULONG)hObject)
+ {
+ case STD_INPUT_HANDLE:
+ hObject = Ppb->StandardInput;
+ break;
+ case STD_OUTPUT_HANDLE:
+ hObject = Ppb->StandardOutput;
+ break;
+ case STD_ERROR_HANDLE:
+ hObject = Ppb->StandardError;
+ break;
+ }
+
+ Status = NtQueryObject (hObject,
+ ObjectHandleInformation,
+ &HandleInfo,
+ sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
+ &BytesWritten);
+ if (NT_SUCCESS(Status))
+ {
+ if (dwMask & HANDLE_FLAG_INHERIT)
+ HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0;
+ if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
+ HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
+
+ Status = NtSetInformationObject (hObject,
+ ObjectHandleInformation,
+ &HandleInfo,
+ sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus (Status);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+ else
+ {
+ SetLastErrorByStatus (Status);
+ return FALSE;
+ }
}
/*
* @implemented
*/
-WINBOOL STDCALL CloseHandle(HANDLE hObject)
+BOOL STDCALL CloseHandle(HANDLE hObject)
/*
* FUNCTION: Closes an open object handle
* PARAMETERS:
* If the function fails, the return value is zero
*/
{
- NTSTATUS errCode;
-
+ PRTL_USER_PROCESS_PARAMETERS Ppb;
+ NTSTATUS Status;
+
+ Ppb = NtCurrentPeb()->ProcessParameters;
+ switch ((ULONG)hObject)
+ {
+ case STD_INPUT_HANDLE:
+ hObject = Ppb->StandardInput;
+ break;
+ case STD_OUTPUT_HANDLE:
+ hObject = Ppb->StandardOutput;
+ break;
+ case STD_ERROR_HANDLE:
+ hObject = Ppb->StandardError;
+ break;
+ }
+
if (IsConsoleHandle(hObject))
{
return(CloseConsoleHandle(hObject));
}
-
- errCode = NtClose(hObject);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus (errCode);
+
+ Status = NtClose(hObject);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus (Status);
return FALSE;
}
-
+
return TRUE;
}
/*
* @implemented
*/
-WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
+BOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
BOOL bInheritHandle,
DWORD dwOptions)
{
- NTSTATUS errCode;
+ PRTL_USER_PROCESS_PARAMETERS Ppb;
DWORD SourceProcessId, TargetProcessId;
+ NTSTATUS Status;
+
+ Ppb = NtCurrentPeb()->ProcessParameters;
+ switch ((ULONG)hSourceHandle)
+ {
+ case STD_INPUT_HANDLE:
+ hSourceHandle = Ppb->StandardInput;
+ break;
+ case STD_OUTPUT_HANDLE:
+ hSourceHandle = Ppb->StandardOutput;
+ break;
+ case STD_ERROR_HANDLE:
+ hSourceHandle = Ppb->StandardError;
+ break;
+ }
+
if (IsConsoleHandle(hSourceHandle))
{
- if (FALSE == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) ||
- FALSE == InternalGetProcessId(hTargetProcessHandle, &TargetProcessId) ||
+ SourceProcessId = GetProcessId(hSourceProcessHandle);
+ TargetProcessId = GetProcessId(hTargetProcessHandle);
+ if (!SourceProcessId || !TargetProcessId ||
SourceProcessId != TargetProcessId ||
SourceProcessId != GetCurrentProcessId())
{
}
*lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
- return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
+ return *lpTargetHandle != INVALID_HANDLE_VALUE;
}
-
- errCode = NtDuplicateObject(hSourceProcessHandle,
- hSourceHandle,
- hTargetProcessHandle,
- lpTargetHandle,
- dwDesiredAccess,
- (BOOLEAN)bInheritHandle,
- dwOptions);
- if (!NT_SUCCESS(errCode))
+
+ Status = NtDuplicateObject(hSourceProcessHandle,
+ hSourceHandle,
+ hTargetProcessHandle,
+ lpTargetHandle,
+ dwDesiredAccess,
+ bInheritHandle ? OBJ_INHERIT : 0,
+ dwOptions);
+ if (!NT_SUCCESS(Status))
{
- SetLastErrorByStatus (errCode);
+ SetLastErrorByStatus (Status);
return FALSE;
}
-
+
return TRUE;
}