ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

handle.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.