3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/handle.c
6 * PURPOSE: Object functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES ******************************************************************/
17 #include <kernel32/kernel32.h>
19 /* GLOBALS *******************************************************************/
22 InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
25 DuplicateConsoleHandle (HANDLE hConsole,
26 DWORD dwDesiredAccess,
30 /* FUNCTIONS *****************************************************************/
35 WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
37 OBJECT_DATA_INFORMATION HandleInfo;
41 errCode = NtQueryObject(hObject,
42 ObjectDataInformation,
44 sizeof(OBJECT_DATA_INFORMATION),
46 if (!NT_SUCCESS(errCode))
48 SetLastErrorByStatus (errCode);
51 if ( HandleInfo.bInheritHandle )
52 *lpdwFlags &= HANDLE_FLAG_INHERIT;
53 if ( HandleInfo.bProtectFromClose )
54 *lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
62 WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
66 OBJECT_DATA_INFORMATION HandleInfo;
70 errCode = NtQueryObject(hObject,
71 ObjectDataInformation,
73 sizeof(OBJECT_DATA_INFORMATION),
75 if (!NT_SUCCESS(errCode))
77 SetLastErrorByStatus (errCode);
80 if (dwMask & HANDLE_FLAG_INHERIT)
82 HandleInfo.bInheritHandle = dwFlags & HANDLE_FLAG_INHERIT;
84 if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
86 HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
89 errCode = NtSetInformationObject(hObject,
90 ObjectDataInformation,
92 sizeof(OBJECT_DATA_INFORMATION));
93 if (!NT_SUCCESS(errCode))
95 SetLastErrorByStatus (errCode);
106 WINBOOL STDCALL CloseHandle(HANDLE hObject)
108 * FUNCTION: Closes an open object handle
110 * hObject = Identifies an open object handle
111 * RETURNS: If the function succeeds, the return value is nonzero
112 * If the function fails, the return value is zero
117 if (IsConsoleHandle(hObject))
119 return(CloseConsoleHandle(hObject));
122 errCode = NtClose(hObject);
123 if (!NT_SUCCESS(errCode))
125 SetLastErrorByStatus (errCode);
136 WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
137 HANDLE hSourceHandle,
138 HANDLE hTargetProcessHandle,
139 LPHANDLE lpTargetHandle,
140 DWORD dwDesiredAccess,
145 DWORD SourceProcessId, TargetProcessId;
146 if (IsConsoleHandle(hSourceHandle))
148 if (FALSE == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) ||
149 FALSE == InternalGetProcessId(hTargetProcessHandle, &TargetProcessId) ||
150 SourceProcessId != TargetProcessId ||
151 SourceProcessId != GetCurrentProcessId())
153 SetLastError(ERROR_INVALID_PARAMETER);
157 *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
158 return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
161 errCode = NtDuplicateObject(hSourceProcessHandle,
163 hTargetProcessHandle,
166 (BOOLEAN)bInheritHandle,
168 if (!NT_SUCCESS(errCode))
170 SetLastErrorByStatus (errCode);
181 UINT STDCALL SetHandleCount(UINT nCount)