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