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