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;