update for HEAD-2003050101
[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 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 */