1 /* $Id: handle.c,v 1.12 2003/07/10 18:50:51 chorns Exp $
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 *****************************************************************/
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
== GetProcessId(hSourceProcessHandle
, &SourceProcessId
) ||
149 FALSE
== GetProcessId(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
)