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 ******************************************************************/
19 /* GLOBALS *******************************************************************/
22 DuplicateConsoleHandle (HANDLE hConsole
,
23 DWORD dwDesiredAccess
,
27 /* FUNCTIONS *****************************************************************/
30 TranslateStdHandle(HANDLE hHandle
)
32 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
34 switch ((ULONG_PTR
)hHandle
)
36 case STD_INPUT_HANDLE
: return Ppb
->StandardInput
;
37 case STD_OUTPUT_HANDLE
: return Ppb
->StandardOutput
;
38 case STD_ERROR_HANDLE
: return Ppb
->StandardError
;
48 GetHandleInformation (HANDLE hObject
,
51 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
56 hObject
= TranslateStdHandle(hObject
);
58 Status
= NtQueryObject (hObject
,
59 ObjectHandleFlagInformation
,
61 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
63 if (NT_SUCCESS(Status
))
66 if (HandleInfo
.Inherit
)
67 Flags
|= HANDLE_FLAG_INHERIT
;
68 if (HandleInfo
.ProtectFromClose
)
69 Flags
|= HANDLE_FLAG_PROTECT_FROM_CLOSE
;
77 SetLastErrorByStatus (Status
);
87 SetHandleInformation (HANDLE hObject
,
91 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
95 hObject
= TranslateStdHandle(hObject
);
97 Status
= NtQueryObject (hObject
,
98 ObjectHandleFlagInformation
,
100 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
102 if (NT_SUCCESS(Status
))
104 if (dwMask
& HANDLE_FLAG_INHERIT
)
105 HandleInfo
.Inherit
= (dwFlags
& HANDLE_FLAG_INHERIT
) != 0;
106 if (dwMask
& HANDLE_FLAG_PROTECT_FROM_CLOSE
)
107 HandleInfo
.ProtectFromClose
= (dwFlags
& HANDLE_FLAG_PROTECT_FROM_CLOSE
) != 0;
109 Status
= NtSetInformationObject (hObject
,
110 ObjectHandleFlagInformation
,
112 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
));
113 if(!NT_SUCCESS(Status
))
115 SetLastErrorByStatus (Status
);
123 SetLastErrorByStatus (Status
);
132 BOOL WINAPI
CloseHandle(HANDLE hObject
)
134 * FUNCTION: Closes an open object handle
136 * hObject = Identifies an open object handle
137 * RETURNS: If the function succeeds, the return value is nonzero
138 * If the function fails, the return value is zero
143 hObject
= TranslateStdHandle(hObject
);
145 if (IsConsoleHandle(hObject
))
147 return(CloseConsoleHandle(hObject
));
150 Status
= NtClose(hObject
);
151 if (!NT_SUCCESS(Status
))
153 SetLastErrorByStatus (Status
);
164 BOOL WINAPI
DuplicateHandle(HANDLE hSourceProcessHandle
,
165 HANDLE hSourceHandle
,
166 HANDLE hTargetProcessHandle
,
167 LPHANDLE lpTargetHandle
,
168 DWORD dwDesiredAccess
,
172 DWORD SourceProcessId
, TargetProcessId
;
175 hSourceHandle
= TranslateStdHandle(hSourceHandle
);
177 if (IsConsoleHandle(hSourceHandle
))
179 SourceProcessId
= GetProcessId(hSourceProcessHandle
);
180 TargetProcessId
= GetProcessId(hTargetProcessHandle
);
181 if (!SourceProcessId
|| !TargetProcessId
||
182 SourceProcessId
!= TargetProcessId
||
183 SourceProcessId
!= GetCurrentProcessId())
185 SetLastError(ERROR_INVALID_PARAMETER
);
189 *lpTargetHandle
= DuplicateConsoleHandle(hSourceHandle
, dwDesiredAccess
, bInheritHandle
, dwOptions
);
190 return *lpTargetHandle
!= INVALID_HANDLE_VALUE
;
193 Status
= NtDuplicateObject(hSourceProcessHandle
,
195 hTargetProcessHandle
,
198 bInheritHandle
? OBJ_INHERIT
: 0,
200 if (!NT_SUCCESS(Status
))
202 SetLastErrorByStatus (Status
);
213 UINT WINAPI
SetHandleCount(UINT nCount
)