update for HEAD-2003021201
[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 /* 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 = dwFlags & HANDLE_FLAG_INHERIT;
66      }  
67    if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) 
68      {
69         HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
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 */