1 /* $Id: handle.c,v 1.11 2003/03/09 21:37:57 hbirr 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 *****************************************************************/
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
)