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 "../include/debug.h"
19 /* GLOBALS *******************************************************************/
22 DuplicateConsoleHandle (HANDLE hConsole
,
23 DWORD dwDesiredAccess
,
27 /* FUNCTIONS *****************************************************************/
33 GetHandleInformation (HANDLE hObject
,
36 PRTL_USER_PROCESS_PARAMETERS Ppb
;
37 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
42 Ppb
= NtCurrentPeb()->ProcessParameters
;
43 switch ((ULONG
)hObject
)
45 case STD_INPUT_HANDLE
:
46 hObject
= Ppb
->StandardInput
;
48 case STD_OUTPUT_HANDLE
:
49 hObject
= Ppb
->StandardOutput
;
51 case STD_ERROR_HANDLE
:
52 hObject
= Ppb
->StandardError
;
56 Status
= NtQueryObject (hObject
,
57 ObjectHandleInformation
,
59 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
61 if (NT_SUCCESS(Status
))
64 if (HandleInfo
.Inherit
)
65 Flags
|= HANDLE_FLAG_INHERIT
;
66 if (HandleInfo
.ProtectFromClose
)
67 Flags
|= HANDLE_FLAG_PROTECT_FROM_CLOSE
;
75 SetLastErrorByStatus (Status
);
85 SetHandleInformation (HANDLE hObject
,
89 PRTL_USER_PROCESS_PARAMETERS Ppb
;
90 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
94 Ppb
= NtCurrentPeb()->ProcessParameters
;
95 switch ((ULONG
)hObject
)
97 case STD_INPUT_HANDLE
:
98 hObject
= Ppb
->StandardInput
;
100 case STD_OUTPUT_HANDLE
:
101 hObject
= Ppb
->StandardOutput
;
103 case STD_ERROR_HANDLE
:
104 hObject
= Ppb
->StandardError
;
108 Status
= NtQueryObject (hObject
,
109 ObjectHandleInformation
,
111 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
113 if (NT_SUCCESS(Status
))
115 HandleInfo
.Inherit
= (dwFlags
& HANDLE_FLAG_INHERIT
) != 0;
116 HandleInfo
.ProtectFromClose
= (dwFlags
& HANDLE_FLAG_PROTECT_FROM_CLOSE
) != 0;
117 Status
= NtSetInformationObject (hObject
,
118 ObjectHandleInformation
,
120 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
));
121 if(!NT_SUCCESS(Status
))
123 SetLastErrorByStatus (Status
);
131 SetLastErrorByStatus (Status
);
140 BOOL STDCALL
CloseHandle(HANDLE hObject
)
142 * FUNCTION: Closes an open object handle
144 * hObject = Identifies an open object handle
145 * RETURNS: If the function succeeds, the return value is nonzero
146 * If the function fails, the return value is zero
149 PRTL_USER_PROCESS_PARAMETERS Ppb
;
152 Ppb
= NtCurrentPeb()->ProcessParameters
;
153 switch ((ULONG
)hObject
)
155 case STD_INPUT_HANDLE
:
156 hObject
= Ppb
->StandardInput
;
158 case STD_OUTPUT_HANDLE
:
159 hObject
= Ppb
->StandardOutput
;
161 case STD_ERROR_HANDLE
:
162 hObject
= Ppb
->StandardError
;
166 if (IsConsoleHandle(hObject
))
168 return(CloseConsoleHandle(hObject
));
171 Status
= NtClose(hObject
);
172 if (!NT_SUCCESS(Status
))
174 SetLastErrorByStatus (Status
);
185 BOOL STDCALL
DuplicateHandle(HANDLE hSourceProcessHandle
,
186 HANDLE hSourceHandle
,
187 HANDLE hTargetProcessHandle
,
188 LPHANDLE lpTargetHandle
,
189 DWORD dwDesiredAccess
,
193 PRTL_USER_PROCESS_PARAMETERS Ppb
;
194 DWORD SourceProcessId
, TargetProcessId
;
197 Ppb
= NtCurrentPeb()->ProcessParameters
;
198 switch ((ULONG
)hSourceHandle
)
200 case STD_INPUT_HANDLE
:
201 hSourceHandle
= Ppb
->StandardInput
;
203 case STD_OUTPUT_HANDLE
:
204 hSourceHandle
= Ppb
->StandardOutput
;
206 case STD_ERROR_HANDLE
:
207 hSourceHandle
= Ppb
->StandardError
;
211 if (IsConsoleHandle(hSourceHandle
))
213 SourceProcessId
= GetProcessId(hSourceProcessHandle
);
214 TargetProcessId
= GetProcessId(hTargetProcessHandle
);
215 if (!SourceProcessId
|| !TargetProcessId
||
216 SourceProcessId
!= TargetProcessId
||
217 SourceProcessId
!= GetCurrentProcessId())
219 SetLastError(ERROR_INVALID_PARAMETER
);
223 *lpTargetHandle
= DuplicateConsoleHandle(hSourceHandle
, dwDesiredAccess
, bInheritHandle
, dwOptions
);
224 return *lpTargetHandle
!= INVALID_HANDLE_VALUE
;
227 Status
= NtDuplicateObject(hSourceProcessHandle
,
229 hTargetProcessHandle
,
232 (BOOLEAN
)bInheritHandle
,
234 if (!NT_SUCCESS(Status
))
236 SetLastErrorByStatus (Status
);
247 UINT STDCALL
SetHandleCount(UINT nCount
)