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