[KERNEL32]: Fix the handle APIs. DuplicateHandle was pretty broken w.r.t console handles, and the Query/Set APIs didn't handle those at all.

svn path=/trunk/; revision=53069
This commit is contained in:
Alex Ionescu 2011-08-04 22:21:39 +00:00
parent 4e634556d9
commit 1ba986ca27

View file

@ -1,33 +1,23 @@
/* $Id$
*
* 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
/*
* PROJECT: ReactOS Win32 Base API
* LICENSE: See COPYING in the top level directory
* FILE: dll/win32/kernel32/client/handle.c
* PURPOSE: Object Handle Functions
* PROGRAMMERS: Ariadne ( ariadne@xs4all.nl)
*/
/* INCLUDES ******************************************************************/
/* INCLUDES *******************************************************************/
#include <k32.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS *******************************************************************/
/* PRIVATE FUNCTIONS **********************************************************/
HANDLE WINAPI
DuplicateConsoleHandle (HANDLE hConsole,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions);
/* FUNCTIONS *****************************************************************/
HANDLE FASTCALL
TranslateStdHandle(HANDLE hHandle)
HANDLE
FASTCALL
TranslateStdHandle(IN HANDLE hHandle)
{
PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
@ -41,12 +31,15 @@ TranslateStdHandle(HANDLE hHandle)
return hHandle;
}
/* PUBLIC FUNCTIONS ***********************************************************/
/*
* @implemented
*/
BOOL WINAPI
GetHandleInformation (HANDLE hObject,
LPDWORD lpdwFlags)
BOOL
WINAPI
GetHandleInformation(IN HANDLE hObject,
OUT LPDWORD lpdwFlags)
{
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
ULONG BytesWritten;
@ -55,38 +48,40 @@ GetHandleInformation (HANDLE hObject,
hObject = TranslateStdHandle(hObject);
Status = NtQueryObject (hObject,
if (IsConsoleHandle(hObject))
{
/* FIXME: GetConsoleHandleInformation required */
UNIMPLEMENTED;
BaseSetLastNTError(STATUS_NOT_IMPLEMENTED);
return FALSE;
}
Status = NtQueryObject(hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
&BytesWritten);
if (NT_SUCCESS(Status))
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
{
BaseSetLastNTError (Status);
BaseSetLastNTError(Status);
return FALSE;
}
}
Flags = 0;
if (HandleInfo.Inherit) Flags |= HANDLE_FLAG_INHERIT;
if (HandleInfo.ProtectFromClose) Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
*lpdwFlags = Flags;
return TRUE;
}
/*
* @implemented
*/
BOOL WINAPI
SetHandleInformation (HANDLE hObject,
DWORD dwMask,
DWORD dwFlags)
BOOL
WINAPI
SetHandleInformation(IN HANDLE hObject,
IN DWORD dwMask,
IN DWORD dwFlags)
{
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
ULONG BytesWritten;
@ -94,100 +89,105 @@ SetHandleInformation (HANDLE hObject,
hObject = TranslateStdHandle(hObject);
Status = NtQueryObject (hObject,
if (IsConsoleHandle(hObject))
{
/* FIXME: SetConsoleHandleInformation required */
UNIMPLEMENTED;
BaseSetLastNTError(STATUS_NOT_IMPLEMENTED);
return FALSE;
}
Status = NtQueryObject(hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
&BytesWritten);
if (NT_SUCCESS(Status))
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;
BaseSetLastNTError(Status);
return FALSE;
}
Status = NtSetInformationObject (hObject,
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,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
if(!NT_SUCCESS(Status))
{
BaseSetLastNTError (Status);
return FALSE;
}
sizeof(HandleInfo));
if (NT_SUCCESS(Status)) return TRUE;
return TRUE;
}
else
{
BaseSetLastNTError (Status);
BaseSetLastNTError(Status);
return FALSE;
}
}
/*
* @implemented
*/
BOOL WINAPI CloseHandle(HANDLE hObject)
/*
* 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
*/
BOOL
WINAPI
CloseHandle(IN HANDLE hObject)
{
NTSTATUS Status;
hObject = TranslateStdHandle(hObject);
if (IsConsoleHandle(hObject))
{
return(CloseConsoleHandle(hObject));
}
if (IsConsoleHandle(hObject)) return CloseConsoleHandle(hObject);
Status = NtClose(hObject);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError (Status);
if (NT_SUCCESS(Status)) return TRUE;
BaseSetLastNTError(Status);
return FALSE;
}
return TRUE;
}
/*
* @implemented
*/
BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions)
BOOL
WINAPI
DuplicateHandle(IN HANDLE hSourceProcessHandle,
IN HANDLE hSourceHandle,
IN HANDLE hTargetProcessHandle,
OUT LPHANDLE lpTargetHandle,
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN DWORD dwOptions)
{
DWORD SourceProcessId, TargetProcessId;
NTSTATUS Status;
HANDLE hTargetHandle;
hSourceHandle = TranslateStdHandle(hSourceHandle);
if (IsConsoleHandle(hSourceHandle))
if ((IsConsoleHandle(hSourceHandle)) &&
((hSourceHandle != NtCurrentProcess()) &&
(hSourceHandle != NtCurrentThread())))
{
SourceProcessId = GetProcessId(hSourceProcessHandle);
TargetProcessId = GetProcessId(hTargetProcessHandle);
if (!SourceProcessId || !TargetProcessId ||
SourceProcessId != TargetProcessId ||
SourceProcessId != GetCurrentProcessId())
if ((hSourceProcessHandle != NtCurrentProcess()) &&
(hTargetProcessHandle != NtCurrentProcess()))
{
SetLastError(ERROR_INVALID_PARAMETER);
BaseSetLastNTError(STATUS_INVALID_PARAMETER);
return FALSE;
}
*lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
return *lpTargetHandle != INVALID_HANDLE_VALUE;
hTargetHandle = DuplicateConsoleHandle(hSourceHandle,
dwDesiredAccess,
bInheritHandle,
dwOptions);
if (hTargetHandle != INVALID_HANDLE_VALUE)
{
if (lpTargetHandle) *lpTargetHandle = hTargetHandle;
return TRUE;
}
return FALSE;
}
Status = NtDuplicateObject(hSourceProcessHandle,
@ -197,13 +197,10 @@ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
dwDesiredAccess,
bInheritHandle ? OBJ_INHERIT : 0,
dwOptions);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError (Status);
return FALSE;
}
if (NT_SUCCESS(Status)) return Status;
return TRUE;
BaseSetLastNTError(Status);
return FALSE;
}
/*
@ -211,7 +208,7 @@ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
*/
UINT
WINAPI
SetHandleCount(UINT nCount)
SetHandleCount(IN UINT nCount)
{
return nCount;
}
@ -240,7 +237,6 @@ CreateSocketHandle(VOID)
DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*