- Added OBJECT_INFORMATION_CLASS type.
[reactos.git] / reactos / lib / kernel32 / misc / handle.c
1 /* $Id: handle.c,v 1.14 2003/10/04 17:12:31 ekohl Exp $
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 <kernel32/kernel32.h>
18
19 /* GLOBALS *******************************************************************/
20
21 WINBOOL STDCALL
22 InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
23
24 HANDLE STDCALL
25 DuplicateConsoleHandle (HANDLE hConsole,
26 DWORD dwDesiredAccess,
27 BOOL bInheritHandle,
28 DWORD dwOptions);
29
30 /* FUNCTIONS *****************************************************************/
31
32 /*
33 * @implemented
34 */
35 WINBOOL WINAPI
36 GetHandleInformation (HANDLE hObject,
37 LPDWORD lpdwFlags)
38 {
39 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
40 ULONG BytesWritten;
41 NTSTATUS Status;
42
43 Status = NtQueryObject (hObject,
44 ObjectHandleInformation,
45 &HandleInfo,
46 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
47 &BytesWritten);
48 if (!NT_SUCCESS(Status))
49 {
50 SetLastErrorByStatus (Status);
51 return FALSE;
52 }
53
54 if (HandleInfo.Inherit)
55 *lpdwFlags &= HANDLE_FLAG_INHERIT;
56
57 if (HandleInfo.ProtectFromClose)
58 *lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
59
60 return TRUE;
61 }
62
63
64 /*
65 * @implemented
66 */
67 WINBOOL STDCALL
68 SetHandleInformation (HANDLE hObject,
69 DWORD dwMask,
70 DWORD dwFlags)
71 {
72 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
73 ULONG BytesWritten;
74 NTSTATUS Status;
75
76 Status = NtQueryObject (hObject,
77 ObjectHandleInformation,
78 &HandleInfo,
79 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
80 &BytesWritten);
81 if (!NT_SUCCESS(Status))
82 {
83 SetLastErrorByStatus (Status);
84 return FALSE;
85 }
86
87 if (dwMask & HANDLE_FLAG_INHERIT)
88 {
89 HandleInfo.Inherit = dwFlags & HANDLE_FLAG_INHERIT;
90 }
91
92 if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
93 {
94 HandleInfo.ProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
95 }
96
97 Status = NtSetInformationObject (hObject,
98 ObjectHandleInformation,
99 &HandleInfo,
100 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
101 if (!NT_SUCCESS(Status))
102 {
103 SetLastErrorByStatus (Status);
104 return FALSE;
105 }
106
107 return TRUE;
108 }
109
110
111 /*
112 * @implemented
113 */
114 WINBOOL STDCALL CloseHandle(HANDLE hObject)
115 /*
116 * FUNCTION: Closes an open object handle
117 * PARAMETERS:
118 * hObject = Identifies an open object handle
119 * RETURNS: If the function succeeds, the return value is nonzero
120 * If the function fails, the return value is zero
121 */
122 {
123 NTSTATUS errCode;
124
125 if (IsConsoleHandle(hObject))
126 {
127 return(CloseConsoleHandle(hObject));
128 }
129
130 errCode = NtClose(hObject);
131 if (!NT_SUCCESS(errCode))
132 {
133 SetLastErrorByStatus (errCode);
134 return FALSE;
135 }
136
137 return TRUE;
138 }
139
140
141 /*
142 * @implemented
143 */
144 WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
145 HANDLE hSourceHandle,
146 HANDLE hTargetProcessHandle,
147 LPHANDLE lpTargetHandle,
148 DWORD dwDesiredAccess,
149 BOOL bInheritHandle,
150 DWORD dwOptions)
151 {
152 NTSTATUS errCode;
153 DWORD SourceProcessId, TargetProcessId;
154 if (IsConsoleHandle(hSourceHandle))
155 {
156 if (FALSE == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) ||
157 FALSE == InternalGetProcessId(hTargetProcessHandle, &TargetProcessId) ||
158 SourceProcessId != TargetProcessId ||
159 SourceProcessId != GetCurrentProcessId())
160 {
161 SetLastError(ERROR_INVALID_PARAMETER);
162 return FALSE;
163 }
164
165 *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
166 return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
167 }
168
169 errCode = NtDuplicateObject(hSourceProcessHandle,
170 hSourceHandle,
171 hTargetProcessHandle,
172 lpTargetHandle,
173 dwDesiredAccess,
174 (BOOLEAN)bInheritHandle,
175 dwOptions);
176 if (!NT_SUCCESS(errCode))
177 {
178 SetLastErrorByStatus (errCode);
179 return FALSE;
180 }
181
182 return TRUE;
183 }
184
185
186 /*
187 * @implemented
188 */
189 UINT STDCALL SetHandleCount(UINT nCount)
190 {
191 return(nCount);
192 }
193
194 /* EOF */