2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2000-07-01 17:07:02 +00:00
|
|
|
*
|
1998-12-04 18:28:13 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS system libraries
|
|
|
|
* FILE: lib/kernel32/misc/handle.c
|
|
|
|
* PURPOSE: Object functions
|
|
|
|
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* Created 01/11/98
|
|
|
|
*/
|
1999-12-26 15:50:53 +00:00
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2003-01-15 21:24:36 +00:00
|
|
|
#include <k32.h>
|
1998-12-04 18:28:13 +00:00
|
|
|
|
1999-12-26 15:50:53 +00:00
|
|
|
#define NDEBUG
|
2007-09-02 19:42:22 +00:00
|
|
|
#include <debug.h>
|
1998-12-04 18:28:13 +00:00
|
|
|
|
2003-03-09 21:37:57 +00:00
|
|
|
/* GLOBALS *******************************************************************/
|
|
|
|
|
2008-11-30 11:42:05 +00:00
|
|
|
HANDLE WINAPI
|
2003-03-09 21:37:57 +00:00
|
|
|
DuplicateConsoleHandle (HANDLE hConsole,
|
|
|
|
DWORD dwDesiredAccess,
|
|
|
|
BOOL bInheritHandle,
|
|
|
|
DWORD dwOptions);
|
|
|
|
|
1999-12-26 15:50:53 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
1998-12-04 18:28:13 +00:00
|
|
|
|
2008-08-04 17:08:52 +00:00
|
|
|
HANDLE FASTCALL
|
|
|
|
TranslateStdHandle(HANDLE hHandle)
|
|
|
|
{
|
|
|
|
PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
|
|
|
|
|
|
|
|
switch ((ULONG)hHandle)
|
|
|
|
{
|
|
|
|
case STD_INPUT_HANDLE: return Ppb->StandardInput;
|
|
|
|
case STD_OUTPUT_HANDLE: return Ppb->StandardOutput;
|
|
|
|
case STD_ERROR_HANDLE: return Ppb->StandardError;
|
|
|
|
}
|
|
|
|
|
|
|
|
return hHandle;
|
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2004-01-23 17:18:16 +00:00
|
|
|
BOOL WINAPI
|
2003-10-04 17:12:31 +00:00
|
|
|
GetHandleInformation (HANDLE hObject,
|
|
|
|
LPDWORD lpdwFlags)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
2003-10-04 17:12:31 +00:00
|
|
|
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
|
|
|
|
ULONG BytesWritten;
|
|
|
|
NTSTATUS Status;
|
2004-10-03 10:05:56 +00:00
|
|
|
DWORD Flags;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2008-08-04 17:08:52 +00:00
|
|
|
hObject = TranslateStdHandle(hObject);
|
2003-10-04 17:12:31 +00:00
|
|
|
|
|
|
|
Status = NtQueryObject (hObject,
|
2007-08-04 08:26:58 +00:00
|
|
|
ObjectHandleFlagInformation,
|
2003-10-04 17:12:31 +00:00
|
|
|
&HandleInfo,
|
|
|
|
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
|
|
|
&BytesWritten);
|
2004-10-03 10:05:56 +00:00
|
|
|
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;
|
|
|
|
}
|
1999-10-07 23:46:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
BOOL WINAPI
|
2003-10-04 17:12:31 +00:00
|
|
|
SetHandleInformation (HANDLE hObject,
|
|
|
|
DWORD dwMask,
|
|
|
|
DWORD dwFlags)
|
1999-10-07 23:46:27 +00:00
|
|
|
{
|
2003-10-04 17:12:31 +00:00
|
|
|
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
|
|
|
|
ULONG BytesWritten;
|
|
|
|
NTSTATUS Status;
|
1999-12-26 15:50:53 +00:00
|
|
|
|
2008-08-04 17:08:52 +00:00
|
|
|
hObject = TranslateStdHandle(hObject);
|
2004-10-03 10:05:56 +00:00
|
|
|
|
2003-10-04 17:12:31 +00:00
|
|
|
Status = NtQueryObject (hObject,
|
2007-08-04 08:26:58 +00:00
|
|
|
ObjectHandleFlagInformation,
|
2003-10-04 17:12:31 +00:00
|
|
|
&HandleInfo,
|
|
|
|
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
|
|
|
&BytesWritten);
|
2004-10-03 10:05:56 +00:00
|
|
|
if (NT_SUCCESS(Status))
|
|
|
|
{
|
2005-12-05 00:21:55 +00:00
|
|
|
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;
|
|
|
|
|
2004-10-03 10:05:56 +00:00
|
|
|
Status = NtSetInformationObject (hObject,
|
2007-08-04 08:26:58 +00:00
|
|
|
ObjectHandleFlagInformation,
|
2004-10-03 10:05:56 +00:00
|
|
|
&HandleInfo,
|
|
|
|
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
|
|
|
|
if(!NT_SUCCESS(Status))
|
2003-10-04 17:12:31 +00:00
|
|
|
{
|
|
|
|
SetLastErrorByStatus (Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2004-10-03 10:05:56 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SetLastErrorByStatus (Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
BOOL WINAPI CloseHandle(HANDLE hObject)
|
1999-12-26 15:50:53 +00:00
|
|
|
/*
|
|
|
|
* FUNCTION: Closes an open object handle
|
|
|
|
* PARAMETERS:
|
|
|
|
* hObject = Identifies an open object handle
|
|
|
|
* RETURNS: If the function succeeds, the return value is nonzero
|
|
|
|
* If the function fails, the return value is zero
|
|
|
|
*/
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
2004-10-03 10:05:56 +00:00
|
|
|
NTSTATUS Status;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2008-08-04 17:08:52 +00:00
|
|
|
hObject = TranslateStdHandle(hObject);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
1999-12-26 15:50:53 +00:00
|
|
|
if (IsConsoleHandle(hObject))
|
|
|
|
{
|
|
|
|
return(CloseConsoleHandle(hObject));
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2004-10-03 10:05:56 +00:00
|
|
|
Status = NtClose(hObject);
|
|
|
|
if (!NT_SUCCESS(Status))
|
2005-05-09 01:46:57 +00:00
|
|
|
{
|
2004-10-03 10:05:56 +00:00
|
|
|
SetLastErrorByStatus (Status);
|
1999-12-26 15:50:53 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
1999-12-26 15:50:53 +00:00
|
|
|
return TRUE;
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
|
1999-12-26 15:50:53 +00:00
|
|
|
HANDLE hSourceHandle,
|
|
|
|
HANDLE hTargetProcessHandle,
|
|
|
|
LPHANDLE lpTargetHandle,
|
|
|
|
DWORD dwDesiredAccess,
|
|
|
|
BOOL bInheritHandle,
|
|
|
|
DWORD dwOptions)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
2003-03-09 21:37:57 +00:00
|
|
|
DWORD SourceProcessId, TargetProcessId;
|
2004-10-03 10:05:56 +00:00
|
|
|
NTSTATUS Status;
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2008-08-04 17:08:52 +00:00
|
|
|
hSourceHandle = TranslateStdHandle(hSourceHandle);
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2002-05-07 22:24:52 +00:00
|
|
|
if (IsConsoleHandle(hSourceHandle))
|
|
|
|
{
|
2004-11-02 21:51:25 +00:00
|
|
|
SourceProcessId = GetProcessId(hSourceProcessHandle);
|
|
|
|
TargetProcessId = GetProcessId(hTargetProcessHandle);
|
|
|
|
if (!SourceProcessId || !TargetProcessId ||
|
2003-03-09 21:37:57 +00:00
|
|
|
SourceProcessId != TargetProcessId ||
|
|
|
|
SourceProcessId != GetCurrentProcessId())
|
2002-05-07 22:24:52 +00:00
|
|
|
{
|
2003-03-09 21:37:57 +00:00
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
|
|
return FALSE;
|
2002-05-07 22:24:52 +00:00
|
|
|
}
|
2003-03-09 21:37:57 +00:00
|
|
|
|
|
|
|
*lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
|
2004-10-24 12:36:12 +00:00
|
|
|
return *lpTargetHandle != INVALID_HANDLE_VALUE;
|
2002-05-07 22:24:52 +00:00
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
2004-10-03 10:05:56 +00:00
|
|
|
Status = NtDuplicateObject(hSourceProcessHandle,
|
|
|
|
hSourceHandle,
|
|
|
|
hTargetProcessHandle,
|
|
|
|
lpTargetHandle,
|
|
|
|
dwDesiredAccess,
|
2005-12-10 17:09:35 +00:00
|
|
|
bInheritHandle ? OBJ_INHERIT : 0,
|
2004-10-03 10:05:56 +00:00
|
|
|
dwOptions);
|
|
|
|
if (!NT_SUCCESS(Status))
|
1999-12-26 15:50:53 +00:00
|
|
|
{
|
2004-10-03 10:05:56 +00:00
|
|
|
SetLastErrorByStatus (Status);
|
1999-12-26 15:50:53 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 01:46:57 +00:00
|
|
|
|
1999-12-26 15:50:53 +00:00
|
|
|
return TRUE;
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 18:50:51 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
UINT WINAPI SetHandleCount(UINT nCount)
|
1998-12-04 18:28:13 +00:00
|
|
|
{
|
1999-12-26 15:50:53 +00:00
|
|
|
return(nCount);
|
1998-12-04 18:28:13 +00:00
|
|
|
}
|
2000-07-01 17:07:02 +00:00
|
|
|
|
|
|
|
/* EOF */
|