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 **********************************************************/
20 TranslateStdHandle(IN HANDLE hHandle
)
22 PRTL_USER_PROCESS_PARAMETERS Ppb
= NtCurrentPeb()->ProcessParameters
;
24 switch ((ULONG
)hHandle
)
26 case STD_INPUT_HANDLE
: return Ppb
->StandardInput
;
27 case STD_OUTPUT_HANDLE
: return Ppb
->StandardOutput
;
28 case STD_ERROR_HANDLE
: return Ppb
->StandardError
;
34 /* PUBLIC FUNCTIONS ***********************************************************/
41 GetHandleInformation(IN HANDLE hObject
,
42 OUT LPDWORD lpdwFlags
)
44 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
49 hObject
= TranslateStdHandle(hObject
);
51 if (IsConsoleHandle(hObject
))
53 return GetConsoleHandleInformation(hObject
, lpdwFlags
);
56 Status
= NtQueryObject(hObject
,
57 ObjectHandleFlagInformation
,
59 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
61 if (!NT_SUCCESS(Status
))
63 BaseSetLastNTError(Status
);
68 if (HandleInfo
.Inherit
) Flags
|= HANDLE_FLAG_INHERIT
;
69 if (HandleInfo
.ProtectFromClose
) Flags
|= HANDLE_FLAG_PROTECT_FROM_CLOSE
;
79 SetHandleInformation(IN HANDLE hObject
,
83 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
87 hObject
= TranslateStdHandle(hObject
);
89 if (IsConsoleHandle(hObject
))
91 return SetConsoleHandleInformation(hObject
, dwMask
, dwFlags
);
94 Status
= NtQueryObject(hObject
,
95 ObjectHandleFlagInformation
,
97 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
99 if (!NT_SUCCESS(Status
))
101 BaseSetLastNTError(Status
);
105 if (dwMask
& HANDLE_FLAG_INHERIT
)
107 HandleInfo
.Inherit
= (dwFlags
& HANDLE_FLAG_INHERIT
) != 0;
110 if (dwMask
& HANDLE_FLAG_PROTECT_FROM_CLOSE
)
112 HandleInfo
.ProtectFromClose
= (dwFlags
& HANDLE_FLAG_PROTECT_FROM_CLOSE
) != 0;
115 Status
= NtSetInformationObject(hObject
,
116 ObjectHandleFlagInformation
,
119 if (NT_SUCCESS(Status
)) return TRUE
;
121 BaseSetLastNTError(Status
);
130 CloseHandle(IN HANDLE hObject
)
134 hObject
= TranslateStdHandle(hObject
);
136 if (IsConsoleHandle(hObject
)) return CloseConsoleHandle(hObject
);
138 Status
= NtClose(hObject
);
139 if (NT_SUCCESS(Status
)) return TRUE
;
141 BaseSetLastNTError(Status
);
150 DuplicateHandle(IN HANDLE hSourceProcessHandle
,
151 IN HANDLE hSourceHandle
,
152 IN HANDLE hTargetProcessHandle
,
153 OUT LPHANDLE lpTargetHandle
,
154 IN DWORD dwDesiredAccess
,
155 IN BOOL bInheritHandle
,
159 HANDLE hTargetHandle
;
161 hSourceHandle
= TranslateStdHandle(hSourceHandle
);
163 if ((IsConsoleHandle(hSourceHandle
)) &&
164 ((hSourceHandle
!= NtCurrentProcess()) &&
165 (hSourceHandle
!= NtCurrentThread())))
168 * We can duplicate console handles only if both the source
169 * and the target processes are in fact the current process.
171 if ((hSourceProcessHandle
!= NtCurrentProcess()) ||
172 (hTargetProcessHandle
!= NtCurrentProcess()))
174 BaseSetLastNTError(STATUS_INVALID_PARAMETER
);
178 hTargetHandle
= DuplicateConsoleHandle(hSourceHandle
,
182 if (hTargetHandle
!= INVALID_HANDLE_VALUE
)
184 if (lpTargetHandle
) *lpTargetHandle
= hTargetHandle
;
191 Status
= NtDuplicateObject(hSourceProcessHandle
,
193 hTargetProcessHandle
,
196 bInheritHandle
? OBJ_INHERIT
: 0,
198 if (NT_SUCCESS(Status
)) return TRUE
;
200 BaseSetLastNTError(Status
);
209 SetHandleCount(IN UINT nCount
)
219 GetHandleContext(IN HANDLE Handle
)
221 /* This is Windows behavior, not a ReactOS Stub */
222 DbgPrintEx(0, 0, "Unsupported API - kernel32!GetHandleContext() called\n");
223 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
232 CreateSocketHandle(VOID
)
234 /* This is Windows behavior, not a ReactOS Stub */
235 DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n");
236 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
245 SetHandleContext(IN HANDLE Handle
,
248 /* This is Windows behavior, not a ReactOS Stub */
249 DbgPrintEx(0, 0, "Unsupported API - kernel32!SetHandleContext() called\n");
250 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);