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 GetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
25 DuplicateConsoleHandle (HANDLE hConsole,
26 DWORD dwDesiredAccess,
30 /* FUNCTIONS *****************************************************************/
32 WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
34 OBJECT_DATA_INFORMATION HandleInfo;
38 errCode = NtQueryObject(hObject,
39 ObjectDataInformation,
41 sizeof(OBJECT_DATA_INFORMATION),
43 if (!NT_SUCCESS(errCode))
45 SetLastErrorByStatus (errCode);
48 if ( HandleInfo.bInheritHandle )
49 *lpdwFlags &= HANDLE_FLAG_INHERIT;
50 if ( HandleInfo.bProtectFromClose )
51 *lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
56 WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
60 OBJECT_DATA_INFORMATION HandleInfo;
64 errCode = NtQueryObject(hObject,
65 ObjectDataInformation,
67 sizeof(OBJECT_DATA_INFORMATION),
69 if (!NT_SUCCESS(errCode))
71 SetLastErrorByStatus (errCode);
74 if (dwMask & HANDLE_FLAG_INHERIT)
76 HandleInfo.bInheritHandle = dwFlags & HANDLE_FLAG_INHERIT;
78 if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
80 HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
83 errCode = NtSetInformationObject(hObject,
84 ObjectDataInformation,
86 sizeof(OBJECT_DATA_INFORMATION));
87 if (!NT_SUCCESS(errCode))
89 SetLastErrorByStatus (errCode);
97 WINBOOL STDCALL CloseHandle(HANDLE hObject)
99 * FUNCTION: Closes an open object handle
101 * hObject = Identifies an open object handle
102 * RETURNS: If the function succeeds, the return value is nonzero
103 * If the function fails, the return value is zero
108 if (IsConsoleHandle(hObject))
110 return(CloseConsoleHandle(hObject));
113 errCode = NtClose(hObject);
114 if (!NT_SUCCESS(errCode))
116 SetLastErrorByStatus (errCode);
124 WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
125 HANDLE hSourceHandle,
126 HANDLE hTargetProcessHandle,
127 LPHANDLE lpTargetHandle,
128 DWORD dwDesiredAccess,
133 DWORD SourceProcessId, TargetProcessId;
134 if (IsConsoleHandle(hSourceHandle))
136 if (FALSE == GetProcessId(hSourceProcessHandle, &SourceProcessId) ||
137 FALSE == GetProcessId(hTargetProcessHandle, &TargetProcessId) ||
138 SourceProcessId != TargetProcessId ||
139 SourceProcessId != GetCurrentProcessId())
141 SetLastError(ERROR_INVALID_PARAMETER);
145 *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
146 return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
149 errCode = NtDuplicateObject(hSourceProcessHandle,
151 hTargetProcessHandle,
154 (BOOLEAN)bInheritHandle,
156 if (!NT_SUCCESS(errCode))
158 SetLastErrorByStatus (errCode);
165 UINT STDCALL SetHandleCount(UINT nCount)