ntoskrnl/ke/main.c
authorjoeg <joeg@svn.reactos.org>
Mon, 17 Jun 2002 22:16:34 +0000 (22:16 +0000)
committerjoeg <joeg@svn.reactos.org>
Mon, 17 Jun 2002 22:16:34 +0000 (22:16 +0000)
* Move SeInit2() to before we initialize process
  management so we can create an initial system
  token to go with the initial system process.

ntoskrnl/ps/process.c
* Implement NtOpenProcessToken() by calling
  _NtOpenProcessToken() -- why do we have
  both of these?

* Fix bug in _NtOpenProcessToken() that
  caused us to crash creating the token
  handle.

* Return STATUS_INVALID_INFO_CLASS from
  NtQueryInformationProcess() and
  NtSetInformationProcess() for information classes
  documented as unqueryable or unsettable
  by Gary Nebbet in his book "Native API Reference".

* Fix bug in NtSetInformationProcess() where it
  assigns the primary token -- it derefeneced the
  old token if SeExchangePrimaryToken() failed;
  it should have derferenced it if it succeeded.

svn path=/trunk/; revision=3112

reactos/ntoskrnl/ke/main.c
reactos/ntoskrnl/ps/process.c

index 93c99cb..66855e1 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: main.c,v 1.125 2002/06/16 11:44:53 ekohl Exp $
+/* $Id: main.c,v 1.126 2002/06/17 22:16:33 joeg Exp $
  *
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ke/main.c
@@ -528,6 +528,10 @@ ExpInitializeExecutive(VOID)
     KeBugCheck(SECURITY_INITIALIZATION_FAILED);
 
   ObInit();
+
+  if (!SeInit2())
+    KeBugCheck(SECURITY1_INITIALIZATION_FAILED);
+
   PiInitProcessManager();
 
   KdInit1();
@@ -751,9 +755,6 @@ ExpInitializeExecutive(VOID)
    */
   InitSystemSharedUserPage ((PUCHAR)KeLoaderBlock.CommandLine);
 
-  if (!SeInit2())
-    KeBugCheck(SECURITY1_INITIALIZATION_FAILED);
-
   /*
    *  Launch initial process
    */
index b6ff682..c70fb0b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: process.c,v 1.81 2002/06/11 22:09:03 dwelch Exp $
+/* $Id: process.c,v 1.82 2002/06/17 22:16:34 joeg Exp $
  *
  * COPYRIGHT:         See COPYING in the top level directory
  * PROJECT:           ReactOS kernel
@@ -95,13 +95,6 @@ PsGetNextProcess(PEPROCESS OldProcess)
    return(NextProcess);
 }
 
-NTSTATUS STDCALL 
-NtOpenProcessToken(IN  HANDLE          ProcessHandle,
-                  IN   ACCESS_MASK     DesiredAccess,
-                  OUT  PHANDLE         TokenHandle)
-{
-  return(STATUS_UNSUCCESSFUL);
-}
 
 NTSTATUS STDCALL 
 _NtOpenProcessToken(IN HANDLE          ProcessHandle,
@@ -121,12 +114,21 @@ _NtOpenProcessToken(IN    HANDLE          ProcessHandle,
                           Token,
                           DesiredAccess,
                           FALSE,
-                          ProcessHandle);
+                          TokenHandle);
    ObDereferenceObject(Token);
    return(Status);
 }
 
 
+NTSTATUS STDCALL 
+NtOpenProcessToken(IN  HANDLE          ProcessHandle,
+                  IN   ACCESS_MASK     DesiredAccess,
+                  OUT  PHANDLE         TokenHandle)
+{
+  return _NtOpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
+}
+
+
 PACCESS_TOKEN STDCALL
 PsReferencePrimaryToken(PEPROCESS Process)
 {
@@ -264,7 +266,7 @@ PsInitProcessManagment(VOID)
    KeReleaseSpinLock(&PsProcessListLock, oldIrql);
    
    strcpy(PsInitialSystemProcess->ImageFileName, "SYSTEM");
-   
+
    ObCreateHandle(PsInitialSystemProcess,
                  PsInitialSystemProcess,
                  PROCESS_ALL_ACCESS,
@@ -831,13 +833,8 @@ NtQueryInformationProcess(IN  HANDLE ProcessHandle,
       case ProcessIoCounters:
       case ProcessVmCounters:
       case ProcessTimes:
-      case ProcessBasePriority:
-      case ProcessRaisePriority:
       case ProcessDebugPort:
-      case ProcessExceptionPort:
-      case ProcessAccessToken:
       case ProcessLdtInformation:
-      case ProcessLdtSize:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
        
@@ -845,24 +842,12 @@ NtQueryInformationProcess(IN  HANDLE ProcessHandle,
        *((PULONG)ProcessInformation) = Process->DefaultHardErrorProcessing;
        break;
        
-      case ProcessIoPortHandlers:
       case ProcessWorkingSetWatch:
-      case ProcessUserModeIOPL:
-      case ProcessEnableAlignmentFaultFixup:
        Status = STATUS_NOT_IMPLEMENTED;
        break;
 
-      case ProcessForegroundInformation:
-       ((PPROCESS_PRIORITY_CLASS)ProcessInformation)->Foreground =
-               FALSE; /*FIXME: how to compute it? */
-      case ProcessPriorityClass:
-       ((PPROCESS_PRIORITY_CLASS)ProcessInformation)->PriorityClass =
-               Process->PriorityClass;
-       break;
-
       case ProcessWx86Information:
       case ProcessHandleCount:
-      case ProcessAffinityMask:
       case ProcessPriorityBoost:
       case ProcessDeviceMap:
       case ProcessSessionInformation:
@@ -870,6 +855,17 @@ NtQueryInformationProcess(IN  HANDLE ProcessHandle,
        Status = STATUS_NOT_IMPLEMENTED;
        break;
        
+      case ProcessBasePriority:
+      case ProcessRaisePriority:
+      case ProcessExceptionPort:
+      case ProcessAccessToken:
+      case ProcessLdtSize:
+      case ProcessIoPortHandlers:
+      case ProcessUserModeIOPL:
+      case ProcessEnableAlignmentFaultFixup:
+      case ProcessPriorityClass:
+      case ProcessAffinityMask:
+      case ProcessForegroundInformation:
       default:
        Status = STATUS_INVALID_INFO_CLASS;
      }
@@ -896,7 +892,7 @@ PspAssignPrimaryToken(PEPROCESS Process,
        return(Status);
      }
    Status = SeExchangePrimaryToken(Process, Token, &OldToken);
-   if (!NT_SUCCESS(Status))
+   if (NT_SUCCESS(Status))
      {
        ObDereferenceObject(OldToken);
      }
@@ -912,7 +908,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
 {
    PEPROCESS Process;
    NTSTATUS Status;
-   PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
    PHANDLE ProcessAccessTokenP;
    
    Status = ObReferenceObjectByHandle(ProcessHandle,
@@ -925,25 +920,17 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
      {
        return(Status);
      }
-   
+
    switch (ProcessInformationClass)
      {
-      case ProcessBasicInformation:
-       ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
-         ProcessInformation;
-       memset(ProcessBasicInformationP, 0, sizeof(PROCESS_BASIC_INFORMATION));
-       Process->Pcb.Affinity = ProcessBasicInformationP->AffinityMask;
-       Status = STATUS_SUCCESS;
-       break;
-       
       case ProcessQuotaLimits:
-      case ProcessIoCounters:
-      case ProcessVmCounters:
-      case ProcessTimes:
       case ProcessBasePriority:
       case ProcessRaisePriority:
       case ProcessDebugPort:
       case ProcessExceptionPort:
+       Status = STATUS_NOT_IMPLEMENTED;
+       break;
+
       case ProcessAccessToken:
        ProcessAccessTokenP = (PHANDLE)ProcessInformation;
        Status = PspAssignPrimaryToken(Process, *ProcessAccessTokenP);
@@ -951,7 +938,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
        
       case ProcessImageFileName:
        memcpy(Process->ImageFileName, ProcessInformation, 8);
-//     DPRINT1("Process->ImageFileName %.8s\n", Process->ImageFileName);
+//      DPRINT1("Process->ImageFileName %.8s\n", Process->ImageFileName);
        Status = STATUS_SUCCESS;
        break;
        
@@ -963,11 +950,20 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
       case ProcessUserModeIOPL:
       case ProcessEnableAlignmentFaultFixup:
       case ProcessPriorityClass:
+      case ProcessAffinityMask:
+       Status = STATUS_NOT_IMPLEMENTED;
+       break;
+
+      case ProcessBasicInformation:
+      case ProcessIoCounters:
+      case ProcessVmCounters:
+      case ProcessTimes:
+      case ProcessPooledUsageAndLimits:
       case ProcessWx86Information:
       case ProcessHandleCount:
-      case ProcessAffinityMask:
+      case ProcessWow64Information:
       default:
-       Status = STATUS_NOT_IMPLEMENTED;
+       Status = STATUS_INVALID_INFO_CLASS;
      }
    ObDereferenceObject(Process);
    return(Status);