- Silence TCPIP.
[reactos.git] / reactos / ntoskrnl / ob / handle.c
index 0fffe18..153ff10 100644 (file)
 #define NDEBUG
 #include <internal/debug.h>
 
-#define EX_OBJ_TO_HDR(eob) ((POBJECT_HEADER)((ULONG_PTR)(eob) &                \
-  ~(EX_HANDLE_ENTRY_PROTECTFROMCLOSE | EX_HANDLE_ENTRY_INHERITABLE |           \
-  EX_HANDLE_ENTRY_AUDITONCLOSE)))
-#define EX_HTE_TO_HDR(hte) ((POBJECT_HEADER)((ULONG_PTR)((hte)->u1.Object) &   \
-  ~(EX_HANDLE_ENTRY_PROTECTFROMCLOSE | EX_HANDLE_ENTRY_INHERITABLE |           \
-  EX_HANDLE_ENTRY_AUDITONCLOSE)))
-
 #define GENERIC_ANY (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL)
 
 /* GLOBALS *****************************************************************/
@@ -92,12 +85,12 @@ ObpDecrementHandleCount(PVOID ObjectBody)
 
 
 NTSTATUS
+NTAPI
 ObpQueryHandleAttributes(HANDLE Handle,
                         POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo)
 {
   PHANDLE_TABLE HandleTable;
   PHANDLE_TABLE_ENTRY HandleTableEntry;
-  LONG ExHandle;
 
   PAGED_CODE();
 
@@ -106,18 +99,17 @@ ObpQueryHandleAttributes(HANDLE Handle,
   if(ObIsKernelHandle(Handle, ExGetPreviousMode()))
   {
     HandleTable = ObpKernelHandleTable;
-    ExHandle = HANDLE_TO_EX_HANDLE(ObKernelHandleToHandle(Handle));
+    Handle = ObKernelHandleToHandle(Handle);
   }
   else
   {
     HandleTable = PsGetCurrentProcess()->ObjectTable;
-    ExHandle = HANDLE_TO_EX_HANDLE(Handle);
   }
 
   KeEnterCriticalRegion();
 
   HandleTableEntry = ExMapHandleToPointer(HandleTable,
-                                          ExHandle);
+                                          Handle);
   if (HandleTableEntry == NULL)
     {
       KeLeaveCriticalRegion();
@@ -137,12 +129,12 @@ ObpQueryHandleAttributes(HANDLE Handle,
 
 
 NTSTATUS
+NTAPI
 ObpSetHandleAttributes(HANDLE Handle,
                       POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo)
 {
   PHANDLE_TABLE HandleTable;
   PHANDLE_TABLE_ENTRY HandleTableEntry;
-  LONG ExHandle;
 
   PAGED_CODE();
 
@@ -151,18 +143,17 @@ ObpSetHandleAttributes(HANDLE Handle,
   if(ObIsKernelHandle(Handle, ExGetPreviousMode()))
   {
     HandleTable = ObpKernelHandleTable;
-    ExHandle = HANDLE_TO_EX_HANDLE(ObKernelHandleToHandle(Handle));
+    Handle = ObKernelHandleToHandle(Handle);
   }
   else
   {
     HandleTable = PsGetCurrentProcess()->ObjectTable;
-    ExHandle = HANDLE_TO_EX_HANDLE(Handle);
   }
 
   KeEnterCriticalRegion();
 
   HandleTableEntry = ExMapHandleToPointer(HandleTable,
-                                          ExHandle);
+                                          Handle);
   if (HandleTableEntry == NULL)
     {
       KeLeaveCriticalRegion();
@@ -197,7 +188,6 @@ ObpDeleteHandle(PHANDLE_TABLE HandleTable,
    PHANDLE_TABLE_ENTRY HandleEntry;
    PVOID Body;
    POBJECT_HEADER ObjectHeader;
-   LONG ExHandle = HANDLE_TO_EX_HANDLE(Handle);
 
    PAGED_CODE();
 
@@ -206,7 +196,7 @@ ObpDeleteHandle(PHANDLE_TABLE HandleTable,
    KeEnterCriticalRegion();
 
    HandleEntry = ExMapHandleToPointer(HandleTable,
-                                      ExHandle);
+                                      Handle);
    if(HandleEntry != NULL)
    {
      if(HandleEntry->u1.ObAttributes & EX_HANDLE_ENTRY_PROTECTFROMCLOSE)
@@ -227,7 +217,7 @@ ObpDeleteHandle(PHANDLE_TABLE HandleTable,
      /* destroy and unlock the handle entry */
      ExDestroyHandleByEntry(HandleTable,
                             HandleEntry,
-                            ExHandle);
+                            Handle);
 
      KeLeaveCriticalRegion();
 
@@ -239,6 +229,7 @@ ObpDeleteHandle(PHANDLE_TABLE HandleTable,
 
 
 NTSTATUS
+NTAPI
 ObDuplicateObject(PEPROCESS SourceProcess,
                  PEPROCESS TargetProcess,
                  HANDLE SourceHandle,
@@ -252,9 +243,8 @@ ObDuplicateObject(PEPROCESS SourceProcess,
   HANDLE_TABLE_ENTRY NewHandleEntry;
   PVOID ObjectBody;
   POBJECT_HEADER ObjectHeader;
-  LONG ExTargetHandle;
-  LONG ExSourceHandle;
   ULONG NewHandleCount;
+  HANDLE NewTargetHandle;
 
   PAGED_CODE();
 
@@ -268,12 +258,10 @@ ObDuplicateObject(PEPROCESS SourceProcess,
     SourceHandleTable = SourceProcess->ObjectTable;
   }
 
-  ExSourceHandle = HANDLE_TO_EX_HANDLE(SourceHandle);
-
   KeEnterCriticalRegion();
 
   SourceHandleEntry = ExMapHandleToPointer(SourceHandleTable,
-                                           ExSourceHandle);
+                                           SourceHandle);
   if (SourceHandleEntry == NULL)
     {
       KeLeaveCriticalRegion();
@@ -323,9 +311,9 @@ ObDuplicateObject(PEPROCESS SourceProcess,
   KeLeaveCriticalRegion();
 
   /* attempt to create the new handle */
-  ExTargetHandle = ExCreateHandle(TargetProcess->ObjectTable,
-                                  &NewHandleEntry);
-  if (ExTargetHandle != EX_INVALID_HANDLE)
+  NewTargetHandle = ExCreateHandle(TargetProcess->ObjectTable,
+                                   &NewHandleEntry);
+  if (NewTargetHandle != NULL)
   {
     if (Options & DUPLICATE_CLOSE_SOURCE)
     {
@@ -335,7 +323,7 @@ ObDuplicateObject(PEPROCESS SourceProcess,
 
     ObDereferenceObject(ObjectBody);
 
-    *TargetHandle = EX_HANDLE_TO_HANDLE(ExTargetHandle);
+    *TargetHandle = NewTargetHandle;
 
     return STATUS_SUCCESS;
   }
@@ -403,9 +391,7 @@ NtDuplicateObject (IN       HANDLE          SourceProcessHandle,
    {
      _SEH_TRY
      {
-       ProbeForWrite(TargetHandle,
-                     sizeof(HANDLE),
-                     sizeof(ULONG));
+       ProbeForWriteHandle(TargetHandle);
      }
      _SEH_HANDLE
      {
@@ -518,10 +504,10 @@ NtDuplicateObject (IN     HANDLE          SourceProcessHandle,
 }
 
 static VOID STDCALL
-DeleteHandleCallback(PHANDLE_TABLE HandleTable,
-                     PVOID Object,
-                     ULONG GrantedAccess,
-                     PVOID Context)
+SweepHandleCallback(PHANDLE_TABLE HandleTable,
+                    PVOID Object,
+                    ULONG GrantedAccess,
+                    PVOID Context)
 {
   POBJECT_HEADER ObjectHeader;
   PVOID ObjectBody;
@@ -557,7 +543,9 @@ DuplicateHandleCallback(PHANDLE_TABLE HandleTable,
   return Ret;
 }
 
-VOID ObCreateHandleTable(PEPROCESS Parent,
+VOID
+NTAPI
+ObCreateHandleTable(PEPROCESS Parent,
                         BOOLEAN Inherit,
                         PEPROCESS Process)
 /*
@@ -592,13 +580,17 @@ ObKillProcess(PEPROCESS Process)
 {
    PAGED_CODE();
 
-   ExDestroyHandleTable(Process->ObjectTable,
-                        DeleteHandleCallback,
-                        Process);
+   /* FIXME - Temporary hack: sweep and destroy here, needs to be fixed!!! */
+   ExSweepHandleTable(Process->ObjectTable,
+                      SweepHandleCallback,
+                      Process);
+   ExDestroyHandleTable(Process->ObjectTable);
+   Process->ObjectTable = NULL;
 }
 
 
 NTSTATUS
+NTAPI
 ObpCreateHandle(PEPROCESS Process,
               PVOID ObjectBody,
               ACCESS_MASK GrantedAccess,
@@ -614,7 +606,7 @@ ObpCreateHandle(PEPROCESS Process,
 {
    HANDLE_TABLE_ENTRY NewEntry;
    POBJECT_HEADER ObjectHeader;
-   LONG ExHandle;
+   HANDLE Handle;
 
    PAGED_CODE();
 
@@ -646,10 +638,10 @@ ObpCreateHandle(PEPROCESS Process,
      NewEntry.u1.ObAttributes &= ~EX_HANDLE_ENTRY_INHERITABLE;
    NewEntry.u2.GrantedAccess = GrantedAccess;
 
-   ExHandle = ExCreateHandle(Process->ObjectTable,
-                             &NewEntry);
-   DPRINT("ObCreateHandle(0x%x)==0x%x [HT:0x%x]\n", ObjectHeader, *HandleReturn, Process->ObjectTable);
-   if(ExHandle != EX_INVALID_HANDLE)
+   Handle = ExCreateHandle(Process->ObjectTable,
+                           &NewEntry);
+   DPRINT("ObCreateHandle(0x%x)==0x%x [HT:0x%x]\n", ObjectHeader, Handle, Process->ObjectTable);
+   if(Handle != NULL)
    {
      if(InterlockedIncrement(&ObjectHeader->HandleCount) == 1)
      {
@@ -659,7 +651,7 @@ ObpCreateHandle(PEPROCESS Process,
                                 UserMode);
      }
 
-     *HandleReturn = EX_HANDLE_TO_HANDLE(ExHandle);
+     *HandleReturn = Handle;
 
      return STATUS_SUCCESS;
    }
@@ -677,7 +669,6 @@ ObQueryObjectAuditingByHandle(IN HANDLE Handle,
 {
   PHANDLE_TABLE_ENTRY HandleEntry;
   PEPROCESS Process;
-  LONG ExHandle = HANDLE_TO_EX_HANDLE(Handle);
 
   PAGED_CODE();
 
@@ -688,7 +679,7 @@ ObQueryObjectAuditingByHandle(IN HANDLE Handle,
   KeEnterCriticalRegion();
 
   HandleEntry = ExMapHandleToPointer(Process->ObjectTable,
-                                     ExHandle);
+                                     Handle);
   if(HandleEntry != NULL)
   {
     *GenerateOnClose = (HandleEntry->u1.ObAttributes & EX_HANDLE_ENTRY_AUDITONCLOSE) != 0;
@@ -736,7 +727,6 @@ ObReferenceObjectByHandle(HANDLE Handle,
    PVOID ObjectBody;
    ACCESS_MASK GrantedAccess;
    ULONG Attributes;
-   LONG ExHandle;
 
    PAGED_CODE();
 
@@ -807,18 +797,17 @@ ObReferenceObjectByHandle(HANDLE Handle,
    if(ObIsKernelHandle(Handle, AccessMode))
    {
       HandleTable = ObpKernelHandleTable;
-      ExHandle = HANDLE_TO_EX_HANDLE(ObKernelHandleToHandle(Handle));
+      Handle = ObKernelHandleToHandle(Handle);
    }
    else
    {
       HandleTable = PsGetCurrentProcess()->ObjectTable;
-      ExHandle = HANDLE_TO_EX_HANDLE(Handle);
    }
 
    KeEnterCriticalRegion();
 
    HandleEntry = ExMapHandleToPointer(HandleTable,
-                                     ExHandle);
+                                     Handle);
    if (HandleEntry == NULL)
      {
         KeLeaveCriticalRegion();
@@ -1159,6 +1148,7 @@ ObInsertObject(IN PVOID Object,
 
 
 ULONG
+NTAPI
 ObpGetHandleCountByHandleTable(PHANDLE_TABLE HandleTable)
 {
   return HandleTable->HandleCount;