2003-01-15 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / lib / kernel32 / misc / handle.c
1 /* $Id: handle.c,v 1.9 2003/01/15 21:24:35 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 /* FUNCTIONS *****************************************************************/
20
21 WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
22 {
23 OBJECT_DATA_INFORMATION HandleInfo;
24 ULONG BytesWritten;
25 NTSTATUS errCode;
26
27 errCode = NtQueryObject(hObject,
28 ObjectDataInformation,
29 &HandleInfo,
30 sizeof(OBJECT_DATA_INFORMATION),
31 &BytesWritten);
32 if (!NT_SUCCESS(errCode))
33 {
34 SetLastErrorByStatus (errCode);
35 return FALSE;
36 }
37 if ( HandleInfo.bInheritHandle )
38 *lpdwFlags &= HANDLE_FLAG_INHERIT;
39 if ( HandleInfo.bProtectFromClose )
40 *lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
41 return TRUE;
42 }
43
44
45 WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
46 DWORD dwMask,
47 DWORD dwFlags)
48 {
49 OBJECT_DATA_INFORMATION HandleInfo;
50 NTSTATUS errCode;
51 ULONG BytesWritten;
52
53 errCode = NtQueryObject(hObject,
54 ObjectDataInformation,
55 &HandleInfo,
56 sizeof(OBJECT_DATA_INFORMATION),
57 &BytesWritten);
58 if (!NT_SUCCESS(errCode))
59 {
60 SetLastErrorByStatus (errCode);
61 return FALSE;
62 }
63 if (dwMask & HANDLE_FLAG_INHERIT)
64 {
65 HandleInfo.bInheritHandle = TRUE;
66 }
67 if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
68 {
69 HandleInfo.bProtectFromClose = TRUE;
70 }
71
72 errCode = NtSetInformationObject(hObject,
73 ObjectDataInformation,
74 &HandleInfo,
75 sizeof(OBJECT_DATA_INFORMATION));
76 if (!NT_SUCCESS(errCode))
77 {
78 SetLastErrorByStatus (errCode);
79 return FALSE;
80 }
81
82 return TRUE;
83 }
84
85
86 WINBOOL STDCALL CloseHandle(HANDLE hObject)
87 /*
88 * FUNCTION: Closes an open object handle
89 * PARAMETERS:
90 * hObject = Identifies an open object handle
91 * RETURNS: If the function succeeds, the return value is nonzero
92 * If the function fails, the return value is zero
93 */
94 {
95 NTSTATUS errCode;
96
97 if (IsConsoleHandle(hObject))
98 {
99 return(CloseConsoleHandle(hObject));
100 }
101
102 errCode = NtClose(hObject);
103 if (!NT_SUCCESS(errCode))
104 {
105 SetLastErrorByStatus (errCode);
106 return FALSE;
107 }
108
109 return TRUE;
110 }
111
112
113 WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
114 HANDLE hSourceHandle,
115 HANDLE hTargetProcessHandle,
116 LPHANDLE lpTargetHandle,
117 DWORD dwDesiredAccess,
118 BOOL bInheritHandle,
119 DWORD dwOptions)
120 {
121 NTSTATUS errCode;
122 if (IsConsoleHandle(hSourceHandle))
123 {
124 /* FIXME: call CSRSS for console handle duplication */
125 if (hSourceProcessHandle == hTargetProcessHandle)
126 {
127 *lpTargetHandle = hSourceHandle;
128 return TRUE;
129 }
130 else
131 {
132 return FALSE;
133 }
134 }
135
136 errCode = NtDuplicateObject(hSourceProcessHandle,
137 hSourceHandle,
138 hTargetProcessHandle,
139 lpTargetHandle,
140 dwDesiredAccess,
141 (BOOLEAN)bInheritHandle,
142 dwOptions);
143 if (!NT_SUCCESS(errCode))
144 {
145 SetLastErrorByStatus (errCode);
146 return FALSE;
147 }
148
149 return TRUE;
150 }
151
152 UINT STDCALL SetHandleCount(UINT nCount)
153 {
154 return(nCount);
155 }
156
157
158 /* EOF */