2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/client/handle.c
5 * PURPOSE: Object Handle Functions
6 * PROGRAMMERS: Ariadne ( ariadne@xs4all.nl)
9 /* INCLUDES *******************************************************************/
16 /* PRIVATE FUNCTIONS **********************************************************/
19 TranslateStdHandle(IN HANDLE hHandle
)
21 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
23 switch ((ULONG
)hHandle
)
25 case STD_INPUT_HANDLE
: return Ppb
->StandardInput
;
26 case STD_OUTPUT_HANDLE
: return Ppb
->StandardOutput
;
27 case STD_ERROR_HANDLE
: return Ppb
->StandardError
;
33 /* PUBLIC FUNCTIONS ***********************************************************/
40 GetHandleInformation(IN HANDLE hObject
,
41 OUT LPDWORD lpdwFlags
)
43 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
48 hObject
= TranslateStdHandle(hObject
);
50 if (IsConsoleHandle(hObject
))
52 return GetConsoleHandleInformation(hObject
, lpdwFlags
);
55 Status
= NtQueryObject(hObject
,
56 ObjectHandleFlagInformation
,
58 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
60 if (!NT_SUCCESS(Status
))
62 BaseSetLastNTError(Status
);
67 if (HandleInfo
.Inherit
) Flags
|= HANDLE_FLAG_INHERIT
;
68 if (HandleInfo
.ProtectFromClose
) Flags
|= HANDLE_FLAG_PROTECT_FROM_CLOSE
;
78 SetHandleInformation(IN HANDLE hObject
,
82 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
86 hObject
= TranslateStdHandle(hObject
);
88 if (IsConsoleHandle(hObject
))
90 return SetConsoleHandleInformation(hObject
, dwMask
, dwFlags
);
93 Status
= NtQueryObject(hObject
,
94 ObjectHandleFlagInformation
,
96 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
98 if (!NT_SUCCESS(Status
))
100 BaseSetLastNTError(Status
);
104 if (dwMask
& HANDLE_FLAG_INHERIT
)
106 HandleInfo
.Inherit
= (dwFlags
& HANDLE_FLAG_INHERIT
) != 0;
109 if (dwMask
& HANDLE_FLAG_PROTECT_FROM_CLOSE
)
111 HandleInfo
.ProtectFromClose
= (dwFlags
& HANDLE_FLAG_PROTECT_FROM_CLOSE
) != 0;
114 Status
= NtSetInformationObject(hObject
,
115 ObjectHandleFlagInformation
,
118 if (NT_SUCCESS(Status
)) return TRUE
;
120 BaseSetLastNTError(Status
);
129 CloseHandle(IN HANDLE hObject
)
133 hObject
= TranslateStdHandle(hObject
);
135 if (IsConsoleHandle(hObject
)) return CloseConsoleHandle(hObject
);
137 Status
= NtClose(hObject
);
138 if (NT_SUCCESS(Status
)) return TRUE
;
140 BaseSetLastNTError(Status
);
149 DuplicateHandle(IN HANDLE hSourceProcessHandle
,
150 IN HANDLE hSourceHandle
,
151 IN HANDLE hTargetProcessHandle
,
152 OUT LPHANDLE lpTargetHandle
,
153 IN DWORD dwDesiredAccess
,
154 IN BOOL bInheritHandle
,
158 HANDLE hTargetHandle
;
160 hSourceHandle
= TranslateStdHandle(hSourceHandle
);
162 if ((IsConsoleHandle(hSourceHandle
)) &&
163 ((hSourceHandle
!= NtCurrentProcess()) &&
164 (hSourceHandle
!= NtCurrentThread())))
167 * We can duplicate console handles only if both the source
168 * and the target processes are in fact the current process.
170 if ((hSourceProcessHandle
!= NtCurrentProcess()) ||
171 (hTargetProcessHandle
!= NtCurrentProcess()))
173 BaseSetLastNTError(STATUS_INVALID_PARAMETER
);
177 hTargetHandle
= DuplicateConsoleHandle(hSourceHandle
,
181 if (hTargetHandle
!= INVALID_HANDLE_VALUE
)
183 if (lpTargetHandle
) *lpTargetHandle
= hTargetHandle
;
190 Status
= NtDuplicateObject(hSourceProcessHandle
,
192 hTargetProcessHandle
,
195 bInheritHandle
? OBJ_INHERIT
: 0,
197 if (NT_SUCCESS(Status
)) return TRUE
;
199 BaseSetLastNTError(Status
);
208 SetHandleCount(IN UINT nCount
)
218 GetHandleContext(IN HANDLE Handle
)
220 /* This is Windows behavior, not a ReactOS Stub */
221 DbgPrintEx(0, 0, "Unsupported API - kernel32!GetHandleContext() called\n");
222 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
231 CreateSocketHandle(VOID
)
233 /* This is Windows behavior, not a ReactOS Stub */
234 DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n");
235 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
244 SetHandleContext(IN HANDLE Handle
,
247 /* This is Windows behavior, not a ReactOS Stub */
248 DbgPrintEx(0, 0, "Unsupported API - kernel32!SetHandleContext() called\n");
249 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);