sync with trunk r47346
[reactos.git] / subsystems / win32 / csrss / csrsrv / api / process.c
index 5fcac04..8b7a483 100644 (file)
@@ -18,6 +18,9 @@
 #define CsrAcquireProcessLock() LOCK
 #define CsrReleaseProcessLock() UNLOCK
 
+extern NTSTATUS CallProcessInherit(PCSRSS_PROCESS_DATA, PCSRSS_PROCESS_DATA);
+extern NTSTATUS CallProcessDeleted(PCSRSS_PROCESS_DATA);
+
 /* GLOBALS *******************************************************************/
 
 static ULONG NrProcess;
@@ -140,7 +143,6 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId)
 NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
 {
   ULONG hash;
-  UINT c;
   PCSRSS_PROCESS_DATA pProcessData, *pPrevLink;
   HANDLE Process;
 
@@ -158,23 +160,7 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
     {
       DPRINT("CsrFreeProcessData pid: %d\n", Pid);
       Process = pProcessData->Process;
-      if (pProcessData->HandleTable)
-        {
-          for (c = 0; c < pProcessData->HandleTableSize; c++)
-            {
-              if (pProcessData->HandleTable[c].Object)
-                {
-                  CsrReleaseObjectByPointer(pProcessData->HandleTable[c].Object);
-                }
-            }
-          RtlFreeHeap(CsrssApiHeap, 0, pProcessData->HandleTable);
-        }
-      RtlDeleteCriticalSection(&pProcessData->HandleTableLock);
-      if (pProcessData->Console)
-        {
-          RemoveEntryList(&pProcessData->ProcessEntry);
-          CsrReleaseObjectByPointer((Object_t *) pProcessData->Console);
-        }
+      CallProcessDeleted(pProcessData);
       if (pProcessData->CsrSectionViewBase)
         {
           NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
@@ -222,7 +208,7 @@ CSR_API(CsrCreateProcess)
        NewProcessData->bInheritHandles = Request->Data.CreateProcessRequest.bInheritHandles;
        if (Request->Data.CreateProcessRequest.bInheritHandles)
          {
-           Status = CsrDuplicateHandleTable(ProcessData, NewProcessData);
+           Status = CallProcessInherit(ProcessData, NewProcessData);
          }
      }
 
@@ -360,134 +346,4 @@ CSR_API(CsrSetShutdownParameters)
   return(STATUS_SUCCESS);
 }
 
-CSR_API(CsrGetInputHandle)
-{
-   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
-   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
-   if (ProcessData->Console)
-   {
-      Request->Status = CsrInsertObject(ProcessData,
-                                     &Request->Data.GetInputHandleRequest.InputHandle,
-                                     (Object_t *)ProcessData->Console,
-                                     Request->Data.GetInputHandleRequest.Access,
-                                     Request->Data.GetInputHandleRequest.Inheritable);
-   }
-   else
-   {
-      Request->Data.GetInputHandleRequest.InputHandle = INVALID_HANDLE_VALUE;
-      Request->Status = STATUS_SUCCESS;
-   }
-
-   return Request->Status;
-}
-
-CSR_API(CsrGetOutputHandle)
-{
-   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
-   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
-   if (ProcessData->Console)
-   {
-      RtlEnterCriticalSection(&ProcessDataLock);
-      Request->Status = CsrInsertObject(ProcessData,
-                                      &Request->Data.GetOutputHandleRequest.OutputHandle,
-                                      &ProcessData->Console->ActiveBuffer->Header,
-                                      Request->Data.GetOutputHandleRequest.Access,
-                                      Request->Data.GetOutputHandleRequest.Inheritable);
-      RtlLeaveCriticalSection(&ProcessDataLock);
-   }
-   else
-   {
-      Request->Data.GetOutputHandleRequest.OutputHandle = INVALID_HANDLE_VALUE;
-      Request->Status = STATUS_SUCCESS;
-   }
-
-   return Request->Status;
-}
-
-CSR_API(CsrCloseHandle)
-{
-   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
-   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
-   return CsrReleaseObject(ProcessData, Request->Data.CloseHandleRequest.Handle);
-}
-
-CSR_API(CsrVerifyHandle)
-{
-   Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
-   Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
-   Request->Status = CsrVerifyObject(ProcessData, Request->Data.VerifyHandleRequest.Handle);
-   if (!NT_SUCCESS(Request->Status))
-   {
-      DPRINT("CsrVerifyObject failed, status=%x\n", Request->Status);
-   }
-
-   return Request->Status;
-}
-
-CSR_API(CsrDuplicateHandle)
-{
-    ULONG_PTR Index;
-    PCSRSS_HANDLE Entry;
-    DWORD DesiredAccess;
-
-    Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
-    Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
-    Index = (ULONG_PTR)Request->Data.DuplicateHandleRequest.Handle >> 2;
-    RtlEnterCriticalSection(&ProcessData->HandleTableLock);
-    if (Index >= ProcessData->HandleTableSize
-        || (Entry = &ProcessData->HandleTable[Index])->Object == NULL)
-    {
-        DPRINT1("Couldn't dup invalid handle %p\n", Request->Data.DuplicateHandleRequest.Handle);
-        RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
-        return STATUS_INVALID_HANDLE;
-    }
-
-    if (Request->Data.DuplicateHandleRequest.Options & DUPLICATE_SAME_ACCESS)
-    {
-        DesiredAccess = Entry->Access;
-    }
-    else
-    {
-        DesiredAccess = Request->Data.DuplicateHandleRequest.Access;
-        /* Make sure the source handle has all the desired flags */
-        if (~Entry->Access & DesiredAccess)
-        {
-            DPRINT1("Handle %p only has access %X; requested %X\n",
-                Request->Data.DuplicateHandleRequest.Handle, Entry->Access, DesiredAccess);
-            RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
-            return STATUS_INVALID_PARAMETER;
-        }
-    }
-    
-    Request->Status = CsrInsertObject(ProcessData,
-                                      &Request->Data.DuplicateHandleRequest.Handle,
-                                      Entry->Object,
-                                      DesiredAccess,
-                                      Request->Data.DuplicateHandleRequest.Inheritable);
-    if (NT_SUCCESS(Request->Status)
-        && Request->Data.DuplicateHandleRequest.Options & DUPLICATE_CLOSE_SOURCE)
-    {
-        /* Close the original handle. This cannot drop the count to 0, since a new handle now exists */
-        _InterlockedDecrement(&Entry->Object->ReferenceCount);
-        Entry->Object = NULL;
-    }
-
-    RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
-    return Request->Status;
-}
-
-CSR_API(CsrGetInputWaitHandle)
-{
-  Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
-  Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
-
-  Request->Data.GetConsoleInputWaitHandle.InputWaitHandle = ProcessData->ConsoleEvent;
-  return STATUS_SUCCESS;
-}
-
 /* EOF */