update for HEAD-2003091401
[reactos.git] / lib / 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 <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 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 == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) || 
149           FALSE == InternalGetProcessId(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 */