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 if (dwMask
& HANDLE_FLAG_INHERIT
)
116 HandleInfo
.Inherit
= (dwFlags
& HANDLE_FLAG_INHERIT
) != 0;
117 if (dwMask
& HANDLE_FLAG_PROTECT_FROM_CLOSE
)
118 HandleInfo
.ProtectFromClose
= (dwFlags
& HANDLE_FLAG_PROTECT_FROM_CLOSE
) != 0;
120 Status
= NtSetInformationObject (hObject
,
121 ObjectHandleInformation
,
123 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
));
124 if(!NT_SUCCESS(Status
))
126 SetLastErrorByStatus (Status
);
134 SetLastErrorByStatus (Status
);
143 BOOL STDCALL
CloseHandle(HANDLE hObject
)
145 * FUNCTION: Closes an open object handle
147 * hObject = Identifies an open object handle
148 * RETURNS: If the function succeeds, the return value is nonzero
149 * If the function fails, the return value is zero
152 PRTL_USER_PROCESS_PARAMETERS Ppb
;
155 Ppb
= NtCurrentPeb()->ProcessParameters
;
156 switch ((ULONG
)hObject
)
158 case STD_INPUT_HANDLE
:
159 hObject
= Ppb
->StandardInput
;
161 case STD_OUTPUT_HANDLE
:
162 hObject
= Ppb
->StandardOutput
;
164 case STD_ERROR_HANDLE
:
165 hObject
= Ppb
->StandardError
;
169 if (IsConsoleHandle(hObject
))
171 return(CloseConsoleHandle(hObject
));
174 Status
= NtClose(hObject
);
175 if (!NT_SUCCESS(Status
))
177 SetLastErrorByStatus (Status
);
188 BOOL STDCALL
DuplicateHandle(HANDLE hSourceProcessHandle
,
189 HANDLE hSourceHandle
,
190 HANDLE hTargetProcessHandle
,
191 LPHANDLE lpTargetHandle
,
192 DWORD dwDesiredAccess
,
196 PRTL_USER_PROCESS_PARAMETERS Ppb
;
197 DWORD SourceProcessId
, TargetProcessId
;
200 Ppb
= NtCurrentPeb()->ProcessParameters
;
201 switch ((ULONG
)hSourceHandle
)
203 case STD_INPUT_HANDLE
:
204 hSourceHandle
= Ppb
->StandardInput
;
206 case STD_OUTPUT_HANDLE
:
207 hSourceHandle
= Ppb
->StandardOutput
;
209 case STD_ERROR_HANDLE
:
210 hSourceHandle
= Ppb
->StandardError
;
214 if (IsConsoleHandle(hSourceHandle
))
216 SourceProcessId
= GetProcessId(hSourceProcessHandle
);
217 TargetProcessId
= GetProcessId(hTargetProcessHandle
);
218 if (!SourceProcessId
|| !TargetProcessId
||
219 SourceProcessId
!= TargetProcessId
||
220 SourceProcessId
!= GetCurrentProcessId())
222 SetLastError(ERROR_INVALID_PARAMETER
);
226 *lpTargetHandle
= DuplicateConsoleHandle(hSourceHandle
, dwDesiredAccess
, bInheritHandle
, dwOptions
);
227 return *lpTargetHandle
!= INVALID_HANDLE_VALUE
;
230 Status
= NtDuplicateObject(hSourceProcessHandle
,
232 hTargetProcessHandle
,
235 (BOOLEAN
)bInheritHandle
,
237 if (!NT_SUCCESS(Status
))
239 SetLastErrorByStatus (Status
);
250 UINT STDCALL
SetHandleCount(UINT nCount
)