Sync to trunk head(r38096)
[reactos.git] / reactos / dll / win32 / kernel32 / misc / handle.c
1 /* $Id$
2 *
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)
8 * UPDATE HISTORY:
9 * Created 01/11/98
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include <k32.h>
15
16 #define NDEBUG
17 #include <debug.h>
18
19 /* GLOBALS *******************************************************************/
20
21 HANDLE WINAPI
22 DuplicateConsoleHandle (HANDLE hConsole,
23 DWORD dwDesiredAccess,
24 BOOL bInheritHandle,
25 DWORD dwOptions);
26
27 /* FUNCTIONS *****************************************************************/
28
29 HANDLE FASTCALL
30 TranslateStdHandle(HANDLE hHandle)
31 {
32 PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
33
34 switch ((ULONG_PTR)hHandle)
35 {
36 case STD_INPUT_HANDLE: return Ppb->StandardInput;
37 case STD_OUTPUT_HANDLE: return Ppb->StandardOutput;
38 case STD_ERROR_HANDLE: return Ppb->StandardError;
39 }
40
41 return hHandle;
42 }
43
44 /*
45 * @implemented
46 */
47 BOOL WINAPI
48 GetHandleInformation (HANDLE hObject,
49 LPDWORD lpdwFlags)
50 {
51 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
52 ULONG BytesWritten;
53 NTSTATUS Status;
54 DWORD Flags;
55
56 hObject = TranslateStdHandle(hObject);
57
58 Status = NtQueryObject (hObject,
59 ObjectHandleFlagInformation,
60 &HandleInfo,
61 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
62 &BytesWritten);
63 if (NT_SUCCESS(Status))
64 {
65 Flags = 0;
66 if (HandleInfo.Inherit)
67 Flags |= HANDLE_FLAG_INHERIT;
68 if (HandleInfo.ProtectFromClose)
69 Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
70
71 *lpdwFlags = Flags;
72
73 return TRUE;
74 }
75 else
76 {
77 SetLastErrorByStatus (Status);
78 return FALSE;
79 }
80 }
81
82
83 /*
84 * @implemented
85 */
86 BOOL WINAPI
87 SetHandleInformation (HANDLE hObject,
88 DWORD dwMask,
89 DWORD dwFlags)
90 {
91 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
92 ULONG BytesWritten;
93 NTSTATUS Status;
94
95 hObject = TranslateStdHandle(hObject);
96
97 Status = NtQueryObject (hObject,
98 ObjectHandleFlagInformation,
99 &HandleInfo,
100 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
101 &BytesWritten);
102 if (NT_SUCCESS(Status))
103 {
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;
108
109 Status = NtSetInformationObject (hObject,
110 ObjectHandleFlagInformation,
111 &HandleInfo,
112 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
113 if(!NT_SUCCESS(Status))
114 {
115 SetLastErrorByStatus (Status);
116 return FALSE;
117 }
118
119 return TRUE;
120 }
121 else
122 {
123 SetLastErrorByStatus (Status);
124 return FALSE;
125 }
126 }
127
128
129 /*
130 * @implemented
131 */
132 BOOL WINAPI CloseHandle(HANDLE hObject)
133 /*
134 * FUNCTION: Closes an open object handle
135 * PARAMETERS:
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
139 */
140 {
141 NTSTATUS Status;
142
143 hObject = TranslateStdHandle(hObject);
144
145 if (IsConsoleHandle(hObject))
146 {
147 return(CloseConsoleHandle(hObject));
148 }
149
150 Status = NtClose(hObject);
151 if (!NT_SUCCESS(Status))
152 {
153 SetLastErrorByStatus (Status);
154 return FALSE;
155 }
156
157 return TRUE;
158 }
159
160
161 /*
162 * @implemented
163 */
164 BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
165 HANDLE hSourceHandle,
166 HANDLE hTargetProcessHandle,
167 LPHANDLE lpTargetHandle,
168 DWORD dwDesiredAccess,
169 BOOL bInheritHandle,
170 DWORD dwOptions)
171 {
172 DWORD SourceProcessId, TargetProcessId;
173 NTSTATUS Status;
174
175 hSourceHandle = TranslateStdHandle(hSourceHandle);
176
177 if (IsConsoleHandle(hSourceHandle))
178 {
179 SourceProcessId = GetProcessId(hSourceProcessHandle);
180 TargetProcessId = GetProcessId(hTargetProcessHandle);
181 if (!SourceProcessId || !TargetProcessId ||
182 SourceProcessId != TargetProcessId ||
183 SourceProcessId != GetCurrentProcessId())
184 {
185 SetLastError(ERROR_INVALID_PARAMETER);
186 return FALSE;
187 }
188
189 *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
190 return *lpTargetHandle != INVALID_HANDLE_VALUE;
191 }
192
193 Status = NtDuplicateObject(hSourceProcessHandle,
194 hSourceHandle,
195 hTargetProcessHandle,
196 lpTargetHandle,
197 dwDesiredAccess,
198 bInheritHandle ? OBJ_INHERIT : 0,
199 dwOptions);
200 if (!NT_SUCCESS(Status))
201 {
202 SetLastErrorByStatus (Status);
203 return FALSE;
204 }
205
206 return TRUE;
207 }
208
209
210 /*
211 * @implemented
212 */
213 UINT WINAPI SetHandleCount(UINT nCount)
214 {
215 return(nCount);
216 }
217
218 /* EOF */