[ros-diffs] [weiden] 13235: 1. fixed prototypes of NtSetSystemTime and NtQuerySystemTime and made them handle passed buffers securely

weiden at svn.reactos.com weiden at svn.reactos.com
Mon Jan 24 00:02:23 CET 2005


1. fixed prototypes of NtSetSystemTime and NtQuerySystemTime and made
them handle passed buffers securely
2. check for the SeSystemtimePrivilege privilege in NtSetSystemTime()
3. write debug messages when privileges are missing
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
Modified: trunk/reactos/ntoskrnl/ex/profile.c
Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
Modified: trunk/reactos/ntoskrnl/ex/time.c
Modified: trunk/reactos/ntoskrnl/ob/symlink.c
Modified: trunk/reactos/ntoskrnl/ps/process.c
  _____  

Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c
--- trunk/reactos/ntoskrnl/cm/ntfunc.c	2005-01-23 22:42:31 UTC (rev
13234)
+++ trunk/reactos/ntoskrnl/cm/ntfunc.c	2005-01-23 23:02:19 UTC (rev
13235)
@@ -1638,7 +1638,7 @@

       KeyCell->Flags |= REG_KEY_LINK_CELL;
     }
 
-  NtQuerySystemTime (&KeyCell->LastWriteTime);
+  ZwQuerySystemTime (&KeyCell->LastWriteTime);
   CmiMarkBlockDirty (RegistryHive, KeyObject->KeyCellOffset);
 
   ExReleaseResourceLite(&CmiRegistryLock);
@@ -1683,7 +1683,7 @@
 				 KeyObject->KeyCellOffset,
 				 ValueName);
 
-  NtQuerySystemTime (&KeyObject->KeyCell->LastWriteTime);
+  ZwQuerySystemTime (&KeyObject->KeyCell->LastWriteTime);
   CmiMarkBlockDirty (KeyObject->RegistryHive,
KeyObject->KeyCellOffset);
 
   /* Release hive lock */
  _____  

Modified: trunk/reactos/ntoskrnl/ex/profile.c
--- trunk/reactos/ntoskrnl/ex/profile.c	2005-01-23 22:42:31 UTC (rev
13234)
+++ trunk/reactos/ntoskrnl/ex/profile.c	2005-01-23 23:02:19 UTC (rev
13235)
@@ -178,6 +178,7 @@

       if(!SeSinglePrivilegeCheck(SeSystemProfilePrivilege,
                                  PreviousMode))
       {
+        DPRINT1("NtCreateProfile: Caller requires the
SeSystemProfilePrivilege privilege!\n");
         return STATUS_PRIVILEGE_NOT_HELD;
       }
     }
  _____  

Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
--- trunk/reactos/ntoskrnl/ex/sysinfo.c	2005-01-23 22:42:31 UTC (rev
13234)
+++ trunk/reactos/ntoskrnl/ex/sysinfo.c	2005-01-23 23:02:19 UTC (rev
13235)
@@ -154,6 +154,7 @@

       RtlReleaseCapturedUnicodeString(&WName,
                                      PreviousMode,
                                      FALSE);
+      DPRINT1("NtQuerySystemEnvironmentValue: Caller requires the
SeSystemEnvironmentPrivilege privilege!\n");
       return STATUS_PRIVILEGE_NOT_HELD;
     }
     
@@ -295,6 +296,7 @@
       }
       else
       {
+        DPRINT1("NtSetSystemEnvironmentValue: Caller requires the
SeSystemEnvironmentPrivilege privilege!\n");
         Status = STATUS_PRIVILEGE_NOT_HELD;
       }
       
  _____  

Modified: trunk/reactos/ntoskrnl/ex/time.c
--- trunk/reactos/ntoskrnl/ex/time.c	2005-01-23 22:42:31 UTC (rev
13234)
+++ trunk/reactos/ntoskrnl/ex/time.c	2005-01-23 23:02:19 UTC (rev
13235)
@@ -142,28 +142,57 @@

  * RETURNS: Status
  */
 NTSTATUS STDCALL
-NtSetSystemTime(IN PLARGE_INTEGER UnsafeNewSystemTime,
-		OUT PLARGE_INTEGER UnsafeOldSystemTime OPTIONAL)
+NtSetSystemTime(IN PLARGE_INTEGER SystemTime,
+		OUT PLARGE_INTEGER PreviousTime OPTIONAL)
 {
   LARGE_INTEGER OldSystemTime;
   LARGE_INTEGER NewSystemTime;
   LARGE_INTEGER LocalTime;
   TIME_FIELDS TimeFields;
-  NTSTATUS Status;
-
-  /* FIXME: Check for SeSystemTimePrivilege */
-
-  Status = MmCopyFromCaller(&NewSystemTime, UnsafeNewSystemTime,
-			    sizeof(NewSystemTime));
-  if (!NT_SUCCESS(Status))
+  KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
+  
+  PreviousMode = ExGetPreviousMode();
+  
+  if(PreviousMode != KernelMode)
+  {
+    _SEH_TRY
     {
+      ProbeForRead(SystemTime,
+                   sizeof(LARGE_INTEGER),
+                   sizeof(ULONG));
+      NewSystemTime = *SystemTime;
+      if(PreviousTime != NULL)
+      {
+        ProbeForWrite(PreviousTime,
+                      sizeof(LARGE_INTEGER),
+                      sizeof(ULONG));
+      }
+    }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+    
+    if(!NT_SUCCESS(Status))
+    {
       return Status;
     }
+  }
+  
+  if(!SeSinglePrivilegeCheck(SeSystemtimePrivilege,
+                             PreviousMode))
+  {
+    DPRINT1("NtSetSystemTime: Caller requires the SeSystemtimePrivilege
privilege!\n");
+    return STATUS_PRIVILEGE_NOT_HELD;
+  }
+  
+  if(PreviousTime != NULL)
+  {
+    KeQuerySystemTime(&OldSystemTime);
+  }
 
-  if (UnsafeOldSystemTime != NULL)
-    {
-      KeQuerySystemTime(&OldSystemTime);
-    }
   ExSystemTimeToLocalTime(&NewSystemTime,
 			  &LocalTime);
   RtlTimeToTimeFields(&LocalTime,
@@ -173,15 +202,18 @@
   /* Set system time */
   KiSetSystemTime(&NewSystemTime);
 
-  if (UnsafeOldSystemTime != NULL)
+  if(PreviousTime != NULL)
+  {
+    _SEH_TRY
     {
-      Status = MmCopyToCaller(UnsafeOldSystemTime, &OldSystemTime,
-			      sizeof(OldSystemTime));
-      if (!NT_SUCCESS(Status))
-	{
-          return Status;
-	}
+      *PreviousTime = OldSystemTime;
     }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+  }
 
   return STATUS_SUCCESS;
 }
@@ -194,19 +226,38 @@
  *          time of day in the standard time format.
  */
 NTSTATUS STDCALL
-NtQuerySystemTime(OUT PLARGE_INTEGER UnsafeCurrentTime)
+NtQuerySystemTime(OUT PLARGE_INTEGER SystemTime)
 {
-  LARGE_INTEGER CurrentTime;
-  NTSTATUS Status;
+  KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
 
-  KeQuerySystemTime(&CurrentTime);
-  Status = MmCopyToCaller(UnsafeCurrentTime, &CurrentTime,
-			  sizeof(CurrentTime));
-  if (!NT_SUCCESS(Status))
+  PreviousMode = ExGetPreviousMode();
+
+  if(PreviousMode != KernelMode)
+  {
+    _SEH_TRY
     {
-      return(Status);
+      ProbeForRead(SystemTime,
+                   sizeof(LARGE_INTEGER),
+                   sizeof(ULONG));
+
+      /* it's safe to pass the pointer directly to KeQuerySystemTime as
it's just
+         a basic copy to these pointer, if it raises an exception
nothing dangerous
+         can happen! */
+      KeQuerySystemTime(SystemTime);
     }
-  return STATUS_SUCCESS;
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+  }
+  else
+  {
+    KeQuerySystemTime(SystemTime);
+  }
+  
+  return Status;
 }
 
 
  _____  

Modified: trunk/reactos/ntoskrnl/ob/symlink.c
--- trunk/reactos/ntoskrnl/ob/symlink.c	2005-01-23 22:42:31 UTC (rev
13234)
+++ trunk/reactos/ntoskrnl/ob/symlink.c	2005-01-23 23:02:19 UTC (rev
13235)
@@ -256,7 +256,7 @@

 
   DPRINT("DeviceName %S\n", SymbolicLink->TargetName.Buffer);
 
-  NtQuerySystemTime (&SymbolicLink->CreateTime);
+  ZwQuerySystemTime (&SymbolicLink->CreateTime);
 
   DPRINT("%s() = STATUS_SUCCESS\n",__FUNCTION__);
   ObDereferenceObject(SymbolicLink);
  _____  

Modified: trunk/reactos/ntoskrnl/ps/process.c
--- trunk/reactos/ntoskrnl/ps/process.c	2005-01-23 22:42:31 UTC (rev
13234)
+++ trunk/reactos/ntoskrnl/ps/process.c	2005-01-23 23:02:19 UTC (rev
13235)
@@ -1932,6 +1932,7 @@

             if(!SeSinglePrivilegeCheck(SeTcbPrivilege,
                                        PreviousMode))
             {
+              DPRINT1("NtSetInformationProcess: Caller requires the
SeTcbPrivilege privilege for setting ProcessSessionInformation!\n");
               /* can't set the session id, bail! */
               Status = STATUS_PRIVILEGE_NOT_HELD;
               break;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-diffs/attachments/20050124/1c95062f/attachment.html


More information about the Ros-diffs mailing list