Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhandle.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Win32 Base API 00003 * LICENSE: See COPYING in the top level directory 00004 * FILE: dll/win32/kernel32/client/handle.c 00005 * PURPOSE: Object Handle Functions 00006 * PROGRAMMERS: Ariadne ( ariadne@xs4all.nl) 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include <k32.h> 00012 00013 #define NDEBUG 00014 #include <debug.h> 00015 00016 /* PRIVATE FUNCTIONS **********************************************************/ 00017 00018 HANDLE 00019 FASTCALL 00020 TranslateStdHandle(IN HANDLE hHandle) 00021 { 00022 PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters; 00023 00024 switch ((ULONG)hHandle) 00025 { 00026 case STD_INPUT_HANDLE: return Ppb->StandardInput; 00027 case STD_OUTPUT_HANDLE: return Ppb->StandardOutput; 00028 case STD_ERROR_HANDLE: return Ppb->StandardError; 00029 } 00030 00031 return hHandle; 00032 } 00033 00034 /* PUBLIC FUNCTIONS ***********************************************************/ 00035 00036 /* 00037 * @implemented 00038 */ 00039 BOOL 00040 WINAPI 00041 GetHandleInformation(IN HANDLE hObject, 00042 OUT LPDWORD lpdwFlags) 00043 { 00044 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; 00045 ULONG BytesWritten; 00046 NTSTATUS Status; 00047 DWORD Flags; 00048 00049 hObject = TranslateStdHandle(hObject); 00050 00051 if (IsConsoleHandle(hObject)) 00052 { 00053 /* FIXME: GetConsoleHandleInformation required */ 00054 UNIMPLEMENTED; 00055 BaseSetLastNTError(STATUS_NOT_IMPLEMENTED); 00056 return FALSE; 00057 } 00058 00059 Status = NtQueryObject(hObject, 00060 ObjectHandleFlagInformation, 00061 &HandleInfo, 00062 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), 00063 &BytesWritten); 00064 if (!NT_SUCCESS(Status)) 00065 { 00066 BaseSetLastNTError(Status); 00067 return FALSE; 00068 } 00069 00070 Flags = 0; 00071 if (HandleInfo.Inherit) Flags |= HANDLE_FLAG_INHERIT; 00072 if (HandleInfo.ProtectFromClose) Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE; 00073 *lpdwFlags = Flags; 00074 return TRUE; 00075 } 00076 00077 /* 00078 * @implemented 00079 */ 00080 BOOL 00081 WINAPI 00082 SetHandleInformation(IN HANDLE hObject, 00083 IN DWORD dwMask, 00084 IN DWORD dwFlags) 00085 { 00086 OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; 00087 ULONG BytesWritten; 00088 NTSTATUS Status; 00089 00090 hObject = TranslateStdHandle(hObject); 00091 00092 if (IsConsoleHandle(hObject)) 00093 { 00094 /* FIXME: SetConsoleHandleInformation required */ 00095 UNIMPLEMENTED; 00096 BaseSetLastNTError(STATUS_NOT_IMPLEMENTED); 00097 return FALSE; 00098 } 00099 00100 Status = NtQueryObject(hObject, 00101 ObjectHandleFlagInformation, 00102 &HandleInfo, 00103 sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), 00104 &BytesWritten); 00105 if (!NT_SUCCESS(Status)) 00106 { 00107 BaseSetLastNTError(Status); 00108 return FALSE; 00109 } 00110 00111 if (dwMask & HANDLE_FLAG_INHERIT) 00112 { 00113 HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0; 00114 } 00115 00116 if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) 00117 { 00118 HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0; 00119 } 00120 00121 Status = NtSetInformationObject(hObject, 00122 ObjectHandleFlagInformation, 00123 &HandleInfo, 00124 sizeof(HandleInfo)); 00125 if (NT_SUCCESS(Status)) return TRUE; 00126 00127 BaseSetLastNTError(Status); 00128 return FALSE; 00129 } 00130 00131 /* 00132 * @implemented 00133 */ 00134 BOOL 00135 WINAPI 00136 CloseHandle(IN HANDLE hObject) 00137 { 00138 NTSTATUS Status; 00139 00140 hObject = TranslateStdHandle(hObject); 00141 00142 if (IsConsoleHandle(hObject)) return CloseConsoleHandle(hObject); 00143 00144 Status = NtClose(hObject); 00145 if (NT_SUCCESS(Status)) return TRUE; 00146 00147 BaseSetLastNTError(Status); 00148 return FALSE; 00149 } 00150 00151 /* 00152 * @implemented 00153 */ 00154 BOOL 00155 WINAPI 00156 DuplicateHandle(IN HANDLE hSourceProcessHandle, 00157 IN HANDLE hSourceHandle, 00158 IN HANDLE hTargetProcessHandle, 00159 OUT LPHANDLE lpTargetHandle, 00160 IN DWORD dwDesiredAccess, 00161 IN BOOL bInheritHandle, 00162 IN DWORD dwOptions) 00163 { 00164 NTSTATUS Status; 00165 HANDLE hTargetHandle; 00166 00167 hSourceHandle = TranslateStdHandle(hSourceHandle); 00168 00169 if ((IsConsoleHandle(hSourceHandle)) && 00170 ((hSourceHandle != NtCurrentProcess()) && 00171 (hSourceHandle != NtCurrentThread()))) 00172 { 00173 if ((hSourceProcessHandle != NtCurrentProcess()) && 00174 (hTargetProcessHandle != NtCurrentProcess())) 00175 { 00176 BaseSetLastNTError(STATUS_INVALID_PARAMETER); 00177 return FALSE; 00178 } 00179 00180 hTargetHandle = DuplicateConsoleHandle(hSourceHandle, 00181 dwDesiredAccess, 00182 bInheritHandle, 00183 dwOptions); 00184 if (hTargetHandle != INVALID_HANDLE_VALUE) 00185 { 00186 if (lpTargetHandle) *lpTargetHandle = hTargetHandle; 00187 return TRUE; 00188 } 00189 00190 return FALSE; 00191 } 00192 00193 Status = NtDuplicateObject(hSourceProcessHandle, 00194 hSourceHandle, 00195 hTargetProcessHandle, 00196 lpTargetHandle, 00197 dwDesiredAccess, 00198 bInheritHandle ? OBJ_INHERIT : 0, 00199 dwOptions); 00200 if (NT_SUCCESS(Status)) return TRUE; 00201 00202 BaseSetLastNTError(Status); 00203 return FALSE; 00204 } 00205 00206 /* 00207 * @implemented 00208 */ 00209 UINT 00210 WINAPI 00211 SetHandleCount(IN UINT nCount) 00212 { 00213 return nCount; 00214 } 00215 00216 /* 00217 * @implemented 00218 */ 00219 DWORD 00220 WINAPI 00221 GetHandleContext(IN HANDLE Handle) 00222 { 00223 /* This is Windows behavior, not a ReactOS Stub */ 00224 DbgPrintEx(0, 0, "Unsupported API - kernel32!GetHandleContext() called\n"); 00225 SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 00226 return FALSE; 00227 } 00228 00229 /* 00230 * @implemented 00231 */ 00232 HANDLE 00233 WINAPI 00234 CreateSocketHandle(VOID) 00235 { 00236 /* This is Windows behavior, not a ReactOS Stub */ 00237 DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n"); 00238 SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 00239 return FALSE; 00240 } 00241 00242 /* 00243 * @implemented 00244 */ 00245 BOOL 00246 WINAPI 00247 SetHandleContext(IN HANDLE Handle, 00248 IN DWORD Context) 00249 { 00250 /* This is Windows behavior, not a ReactOS Stub */ 00251 DbgPrintEx(0, 0, "Unsupported API - kernel32!SetHandleContext() called\n"); 00252 SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 00253 return FALSE; 00254 } 00255 00256 /* EOF */ Generated on Sun May 27 2012 04:24:27 for ReactOS by
1.7.6.1
|