mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 17:42:58 +00:00
[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:
parent
4e634556d9
commit
1ba986ca27
1 changed files with 178 additions and 182 deletions
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue