* Sync up to trunk HEAD (r62975).
[reactos.git] / dll / win32 / kernel32 / client / handle.c
1 /*
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)
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <k32.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* PRIVATE FUNCTIONS **********************************************************/
17
18 HANDLE
19 FASTCALL
20 TranslateStdHandle(IN HANDLE hHandle)
21 {
22 PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
23
24 switch ((ULONG)hHandle)
25 {
26 case STD_INPUT_HANDLE: return Ppb->StandardInput;
27 case STD_OUTPUT_HANDLE: return Ppb->StandardOutput;
28 case STD_ERROR_HANDLE: return Ppb->StandardError;
29 }
30
31 return hHandle;
32 }
33
34 /* PUBLIC FUNCTIONS ***********************************************************/
35
36 /*
37 * @implemented
38 */
39 BOOL
40 WINAPI
41 GetHandleInformation(IN HANDLE hObject,
42 OUT LPDWORD lpdwFlags)
43 {
44 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
45 ULONG BytesWritten;
46 NTSTATUS Status;
47 DWORD Flags;
48
49 hObject = TranslateStdHandle(hObject);
50
51 if (IsConsoleHandle(hObject))
52 {
53 return GetConsoleHandleInformation(hObject, lpdwFlags);
54 }
55
56 Status = NtQueryObject(hObject,
57 ObjectHandleFlagInformation,
58 &HandleInfo,
59 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
60 &BytesWritten);
61 if (!NT_SUCCESS(Status))
62 {
63 BaseSetLastNTError(Status);
64 return FALSE;
65 }
66
67 Flags = 0;
68 if (HandleInfo.Inherit) Flags |= HANDLE_FLAG_INHERIT;
69 if (HandleInfo.ProtectFromClose) Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
70 *lpdwFlags = Flags;
71 return TRUE;
72 }
73
74 /*
75 * @implemented
76 */
77 BOOL
78 WINAPI
79 SetHandleInformation(IN HANDLE hObject,
80 IN DWORD dwMask,
81 IN DWORD dwFlags)
82 {
83 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
84 ULONG BytesWritten;
85 NTSTATUS Status;
86
87 hObject = TranslateStdHandle(hObject);
88
89 if (IsConsoleHandle(hObject))
90 {
91 return SetConsoleHandleInformation(hObject, dwMask, dwFlags);
92 }
93
94 Status = NtQueryObject(hObject,
95 ObjectHandleFlagInformation,
96 &HandleInfo,
97 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
98 &BytesWritten);
99 if (!NT_SUCCESS(Status))
100 {
101 BaseSetLastNTError(Status);
102 return FALSE;
103 }
104
105 if (dwMask & HANDLE_FLAG_INHERIT)
106 {
107 HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0;
108 }
109
110 if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
111 {
112 HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
113 }
114
115 Status = NtSetInformationObject(hObject,
116 ObjectHandleFlagInformation,
117 &HandleInfo,
118 sizeof(HandleInfo));
119 if (NT_SUCCESS(Status)) return TRUE;
120
121 BaseSetLastNTError(Status);
122 return FALSE;
123 }
124
125 /*
126 * @implemented
127 */
128 BOOL
129 WINAPI
130 CloseHandle(IN HANDLE hObject)
131 {
132 NTSTATUS Status;
133
134 hObject = TranslateStdHandle(hObject);
135
136 if (IsConsoleHandle(hObject)) return CloseConsoleHandle(hObject);
137
138 Status = NtClose(hObject);
139 if (NT_SUCCESS(Status)) return TRUE;
140
141 BaseSetLastNTError(Status);
142 return FALSE;
143 }
144
145 /*
146 * @implemented
147 */
148 BOOL
149 WINAPI
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,
156 IN DWORD dwOptions)
157 {
158 NTSTATUS Status;
159 HANDLE hTargetHandle;
160
161 hSourceHandle = TranslateStdHandle(hSourceHandle);
162
163 if ((IsConsoleHandle(hSourceHandle)) &&
164 ((hSourceHandle != NtCurrentProcess()) &&
165 (hSourceHandle != NtCurrentThread())))
166 {
167 /*
168 * We can duplicate console handles only if both the source
169 * and the target processes are in fact the current process.
170 */
171 if ((hSourceProcessHandle != NtCurrentProcess()) ||
172 (hTargetProcessHandle != NtCurrentProcess()))
173 {
174 BaseSetLastNTError(STATUS_INVALID_PARAMETER);
175 return FALSE;
176 }
177
178 hTargetHandle = DuplicateConsoleHandle(hSourceHandle,
179 dwDesiredAccess,
180 bInheritHandle,
181 dwOptions);
182 if (hTargetHandle != INVALID_HANDLE_VALUE)
183 {
184 if (lpTargetHandle) *lpTargetHandle = hTargetHandle;
185 return TRUE;
186 }
187
188 return FALSE;
189 }
190
191 Status = NtDuplicateObject(hSourceProcessHandle,
192 hSourceHandle,
193 hTargetProcessHandle,
194 lpTargetHandle,
195 dwDesiredAccess,
196 bInheritHandle ? OBJ_INHERIT : 0,
197 dwOptions);
198 if (NT_SUCCESS(Status)) return TRUE;
199
200 BaseSetLastNTError(Status);
201 return FALSE;
202 }
203
204 /*
205 * @implemented
206 */
207 UINT
208 WINAPI
209 SetHandleCount(IN UINT nCount)
210 {
211 return nCount;
212 }
213
214 /*
215 * @implemented
216 */
217 DWORD
218 WINAPI
219 GetHandleContext(IN HANDLE Handle)
220 {
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);
224 return FALSE;
225 }
226
227 /*
228 * @implemented
229 */
230 HANDLE
231 WINAPI
232 CreateSocketHandle(VOID)
233 {
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);
237 return FALSE;
238 }
239
240 /*
241 * @implemented
242 */
243 BOOL
244 WINAPI
245 SetHandleContext(IN HANDLE Handle,
246 IN DWORD Context)
247 {
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);
251 return FALSE;
252 }
253
254 /* EOF */