diff --git a/trunk/CHANGELOG.txt b/trunk/CHANGELOG.txt
index c0bb813d0..6cd30fa2d 100644
--- a/trunk/CHANGELOG.txt
+++ b/trunk/CHANGELOG.txt
@@ -26,6 +26,7 @@ Process Hacker
* Crash when viewing error details in the event
of a corrupt configuration file
* Notification icons were fixed at 16x16 size
+ * Sort order for the relative start time column
1.5
* NEW/IMPROVED:
diff --git a/trunk/ProcessHacker.Common/Utils.cs b/trunk/ProcessHacker.Common/Utils.cs
index 23ae0c7b7..e35bd81fb 100644
--- a/trunk/ProcessHacker.Common/Utils.cs
+++ b/trunk/ProcessHacker.Common/Utils.cs
@@ -770,15 +770,6 @@ namespace ProcessHacker.Common
return data;
}
- ///
- /// Converts a 64-bit Windows time value to a DateTime object.
- ///
- /// The Windows time value.
- public static DateTime GetDateTimeFromLongTime(long time)
- {
- return (new DateTime(1601, 1, 1)).AddTicks(time).ToLocalTime();
- }
-
///
/// Converts a 32-bit Unix time value into a DateTime object.
///
diff --git a/trunk/ProcessHacker.Native/Api/Functions.cs b/trunk/ProcessHacker.Native/Api/Functions.cs
index e9f5cf604..6f82bd6d4 100644
--- a/trunk/ProcessHacker.Native/Api/Functions.cs
+++ b/trunk/ProcessHacker.Native/Api/Functions.cs
@@ -1486,10 +1486,10 @@ namespace ProcessHacker.Native.Api
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetProcessTimes(
[In] IntPtr ProcessHandle,
- [Out] out FileTime CreationTime,
- [Out] out FileTime ExitTime,
- [Out] out FileTime KernelTime,
- [Out] out FileTime UserTime
+ [Out] out LargeInteger CreationTime,
+ [Out] out LargeInteger ExitTime,
+ [Out] out LargeInteger KernelTime,
+ [Out] out LargeInteger UserTime
);
[DllImport("kernel32.dll", SetLastError = true)]
@@ -1502,20 +1502,19 @@ namespace ProcessHacker.Native.Api
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetSystemTimes(
- [Out] out FileTime IdleTime,
- [Out] out FileTime KernelTime,
- [Out] out FileTime UserTime
+ [Out] out LargeInteger IdleTime,
+ [Out] out LargeInteger KernelTime,
+ [Out] out LargeInteger UserTime
);
- // From MSDN: Do not cast a pointer to a FILETIME structure to either a ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows.
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetThreadTimes(
- [In] IntPtr hThread,
- [Out] out FileTime lpCreationTime,
- [Out] out FileTime lpExitTime,
- [Out] out FileTime lpKernelTime,
- [Out] out FileTime lpUserTime
+ [In] IntPtr ThreadHandle,
+ [Out] out LargeInteger CreationTime,
+ [Out] out LargeInteger ExitTime,
+ [Out] out LargeInteger KernelTime,
+ [Out] out LargeInteger UserTime
);
#endregion
diff --git a/trunk/ProcessHacker.Native/Api/LsaEnums.cs b/trunk/ProcessHacker.Native/Api/LsaEnums.cs
index 0c72bee75..9dca920ef 100644
--- a/trunk/ProcessHacker.Native/Api/LsaEnums.cs
+++ b/trunk/ProcessHacker.Native/Api/LsaEnums.cs
@@ -27,6 +27,7 @@ using System.Text;
namespace ProcessHacker.Native.Api
{
+ [Flags]
public enum LsaOperationalMode
{
PasswordProtected = 0x1,
@@ -85,6 +86,7 @@ namespace ProcessHacker.Native.Api
CachedUnlock
}
+ [Flags]
public enum SecuritySystemAccess : int
{
Interactive = 0x1,
diff --git a/trunk/ProcessHacker.Native/Api/Structs.cs b/trunk/ProcessHacker.Native/Api/Structs.cs
index da76d6a7e..0977c765a 100644
--- a/trunk/ProcessHacker.Native/Api/Structs.cs
+++ b/trunk/ProcessHacker.Native/Api/Structs.cs
@@ -78,21 +78,6 @@ namespace ProcessHacker.Native.Api
public ServiceStatusProcess ServiceStatusProcess;
}
- [StructLayout(LayoutKind.Sequential)]
- public struct FileTime
- {
- public uint LowDateTime;
- public int HighDateTime;
-
- public static implicit operator long(FileTime fileTime)
- {
- LargeInteger integer = new LargeInteger();
- integer.LowPart = fileTime.LowDateTime;
- integer.HighPart = fileTime.HighDateTime;
- return integer.QuadPart;
- }
- }
-
[StructLayout(LayoutKind.Sequential)]
public struct FpoData
{
diff --git a/trunk/ProcessHacker.Native/Objects/FileHandle.cs b/trunk/ProcessHacker.Native/Objects/FileHandle.cs
index a3073c2eb..fc2456316 100644
--- a/trunk/ProcessHacker.Native/Objects/FileHandle.cs
+++ b/trunk/ProcessHacker.Native/Objects/FileHandle.cs
@@ -775,10 +775,10 @@ namespace ProcessHacker.Native.Objects
if (!callback(new FileEntry(
name,
info.FileIndex,
- Utils.GetDateTimeFromLongTime(info.CreationTime),
- Utils.GetDateTimeFromLongTime(info.LastAccessTime),
- Utils.GetDateTimeFromLongTime(info.LastWriteTime),
- Utils.GetDateTimeFromLongTime(info.ChangeTime),
+ DateTime.FromFileTime(info.CreationTime),
+ DateTime.FromFileTime(info.LastAccessTime),
+ DateTime.FromFileTime(info.LastWriteTime),
+ DateTime.FromFileTime(info.ChangeTime),
info.EndOfFile,
info.AllocationSize,
info.FileAttributes
diff --git a/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs b/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs
index 8c4e0a34c..3e3a17a58 100644
--- a/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs
+++ b/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs
@@ -934,9 +934,9 @@ namespace ProcessHacker.Native.Objects
///
/// Gets the creation time of the process.
///
- public long GetCreateTime()
+ public DateTime GetCreateTime()
{
- return this.GetTimes()[0];
+ return DateTime.FromFileTime(this.GetTimes()[0]);
}
///
@@ -1111,9 +1111,9 @@ namespace ProcessHacker.Native.Objects
///
/// Gets the exit time of the process.
///
- public long GetExitTime()
+ public DateTime GetExitTime()
{
- return this.GetTimes()[1];
+ return DateTime.FromFileTime(this.GetTimes()[1]);
}
///
@@ -1713,12 +1713,12 @@ namespace ProcessHacker.Native.Objects
}
///
- /// Gets an array of FileTimes for the process.
+ /// Gets an array of times for the process.
///
/// An array of times: creation time, exit time, kernel time, user time.
- private FileTime[] GetTimes()
+ private LargeInteger[] GetTimes()
{
- FileTime[] times = new FileTime[4];
+ LargeInteger[] times = new LargeInteger[4];
if (!Win32.GetProcessTimes(this, out times[0], out times[1], out times[2], out times[3]))
Win32.ThrowLastError();
diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs
index e7095ffb4..4264d4782 100644
--- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs
+++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs
@@ -218,7 +218,7 @@ namespace ProcessHacker
public int ModifySort(int sortResult, SortOrder order)
{
if (order == SortOrder.Ascending)
- return sortResult * -1;
+ return -sortResult;
else if (order == SortOrder.Descending)
return sortResult;
else
@@ -314,8 +314,10 @@ namespace ProcessHacker
case "page priority":
return ModifySort(n1.PagePriority.CompareTo(n2.PagePriority), sortO);
case "start time":
- case "start time (relative)":
return ModifySort(n1.ProcessItem.CreateTime.CompareTo(n2.ProcessItem.CreateTime), sortO);
+ case "start time (relative)":
+ // Invert the order - bigger dates are actually smaller if we use the relative time span.
+ return -ModifySort(n1.ProcessItem.CreateTime.CompareTo(n2.ProcessItem.CreateTime), sortO);
case "total cpu time":
return ModifySort((n1.ProcessItem.Process.KernelTime + n1.ProcessItem.Process.UserTime).
CompareTo(n2.ProcessItem.Process.KernelTime + n2.ProcessItem.Process.UserTime), sortO);
diff --git a/trunk/ProcessHacker/Forms/HiddenProcessesWindow.cs b/trunk/ProcessHacker/Forms/HiddenProcessesWindow.cs
index ec5f5a213..06bf1e67c 100644
--- a/trunk/ProcessHacker/Forms/HiddenProcessesWindow.cs
+++ b/trunk/ProcessHacker/Forms/HiddenProcessesWindow.cs
@@ -97,12 +97,12 @@ namespace ProcessHacker
// Check if the process has terminated. This is possible because
// a process can be terminated while its object is still being
// referenced.
- long exitTime = -1;
+ DateTime exitTime = DateTime.MinValue;
try { exitTime = phandle.GetExitTime(); }
catch { }
- if (exitTime != 0)
+ if (exitTime.ToFileTime() == 0)
{
item.BackColor = Color.DarkGray;
item.ForeColor = Color.White;
diff --git a/trunk/ProcessHacker/Forms/RunWindow.cs b/trunk/ProcessHacker/Forms/RunWindow.cs
index 890d055cc..aeb2569f8 100644
--- a/trunk/ProcessHacker/Forms/RunWindow.cs
+++ b/trunk/ProcessHacker/Forms/RunWindow.cs
@@ -55,10 +55,9 @@ namespace ProcessHacker
try
{
- using (var policy =
- new LsaPolicyHandle(LsaPolicyAccess.LookupNames | LsaPolicyAccess.ViewLocalInformation))
+ using (var phandle = new LsaPolicyHandle(LsaPolicyAccess.ViewLocalInformation))
{
- foreach (var sid in policy.GetAccounts())
+ foreach (var sid in phandle.GetAccounts())
if (sid.NameUse == SidNameUse.User)
users.Add(sid.GetFullName(true));
}
diff --git a/trunk/ProcessHacker/Program/Save.cs b/trunk/ProcessHacker/Program/Save.cs
index b49fe0a2f..5087761a6 100644
--- a/trunk/ProcessHacker/Program/Save.cs
+++ b/trunk/ProcessHacker/Program/Save.cs
@@ -265,7 +265,7 @@ namespace ProcessHacker
sb.AppendLine("Version info section failed! " + ex2.Message);
}
- sb.AppendLine("Started: " + Utils.GetDateTimeFromLongTime(phandle.GetCreateTime()).ToString());
+ sb.AppendLine("Started: " + phandle.GetCreateTime().ToString());
var memoryInfo = phandle.GetMemoryStatistics();
diff --git a/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs b/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs
index 484d1ceaa..233c31a56 100644
--- a/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs
+++ b/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs
@@ -939,7 +939,7 @@ namespace ProcessHacker
try
{
- item.CreateTime = Utils.GetDateTimeFromLongTime(processInfo.CreateTime);
+ item.CreateTime = DateTime.FromFileTime(processInfo.CreateTime);
}
catch
{ }