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 /* FIXME: GetConsoleHandleInformation required */
55 BaseSetLastNTError(STATUS_NOT_IMPLEMENTED
);
59 Status
= NtQueryObject(hObject
,
60 ObjectHandleFlagInformation
,
62 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
64 if (!NT_SUCCESS(Status
))
66 BaseSetLastNTError(Status
);
71 if (HandleInfo
.Inherit
) Flags
|= HANDLE_FLAG_INHERIT
;
72 if (HandleInfo
.ProtectFromClose
) Flags
|= HANDLE_FLAG_PROTECT_FROM_CLOSE
;
82 SetHandleInformation(IN HANDLE hObject
,
86 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo
;
90 hObject
= TranslateStdHandle(hObject
);
92 if (IsConsoleHandle(hObject
))
94 /* FIXME: SetConsoleHandleInformation required */
96 BaseSetLastNTError(STATUS_NOT_IMPLEMENTED
);
100 Status
= NtQueryObject(hObject
,
101 ObjectHandleFlagInformation
,
103 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION
),
105 if (!NT_SUCCESS(Status
))
107 BaseSetLastNTError(Status
);
111 if (dwMask
& HANDLE_FLAG_INHERIT
)
113 HandleInfo
.Inherit
= (dwFlags
& HANDLE_FLAG_INHERIT
) != 0;
116 if (dwMask
& HANDLE_FLAG_PROTECT_FROM_CLOSE
)
118 HandleInfo
.ProtectFromClose
= (dwFlags
& HANDLE_FLAG_PROTECT_FROM_CLOSE
) != 0;
121 Status
= NtSetInformationObject(hObject
,
122 ObjectHandleFlagInformation
,
125 if (NT_SUCCESS(Status
)) return TRUE
;
127 BaseSetLastNTError(Status
);
136 CloseHandle(IN HANDLE hObject
)
140 hObject
= TranslateStdHandle(hObject
);
142 if (IsConsoleHandle(hObject
)) return CloseConsoleHandle(hObject
);
144 Status
= NtClose(hObject
);
145 if (NT_SUCCESS(Status
)) return TRUE
;
147 BaseSetLastNTError(Status
);
156 DuplicateHandle(IN HANDLE hSourceProcessHandle
,
157 IN HANDLE hSourceHandle
,
158 IN HANDLE hTargetProcessHandle
,
159 OUT LPHANDLE lpTargetHandle
,
160 IN DWORD dwDesiredAccess
,
161 IN BOOL bInheritHandle
,
165 HANDLE hTargetHandle
;
167 hSourceHandle
= TranslateStdHandle(hSourceHandle
);
169 if ((IsConsoleHandle(hSourceHandle
)) &&
170 ((hSourceHandle
!= NtCurrentProcess()) &&
171 (hSourceHandle
!= NtCurrentThread())))
173 if ((hSourceProcessHandle
!= NtCurrentProcess()) &&
174 (hTargetProcessHandle
!= NtCurrentProcess()))
176 BaseSetLastNTError(STATUS_INVALID_PARAMETER
);
180 hTargetHandle
= DuplicateConsoleHandle(hSourceHandle
,
184 if (hTargetHandle
!= INVALID_HANDLE_VALUE
)
186 if (lpTargetHandle
) *lpTargetHandle
= hTargetHandle
;
193 Status
= NtDuplicateObject(hSourceProcessHandle
,
195 hTargetProcessHandle
,
198 bInheritHandle
? OBJ_INHERIT
: 0,
200 if (NT_SUCCESS(Status
)) return TRUE
;
202 BaseSetLastNTError(Status
);
211 SetHandleCount(IN UINT nCount
)
221 GetHandleContext(IN HANDLE Handle
)
223 /* This is Windows behavior, not a ReactOS Stub */
224 DbgPrintEx(0, 0, "Unsupported API - kernel32!GetHandleContext() called\n");
225 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
234 CreateSocketHandle(VOID
)
236 /* This is Windows behavior, not a ReactOS Stub */
237 DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n");
238 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
247 SetHandleContext(IN HANDLE Handle
,
250 /* This is Windows behavior, not a ReactOS Stub */
251 DbgPrintEx(0, 0, "Unsupported API - kernel32!SetHandleContext() called\n");
252 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);