Fixes on incorrect version detections
This commit is contained in:
parent
a251a9ee5a
commit
bb7d53110f
@ -8,11 +8,10 @@
|
|||||||
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
|
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Derping Drivers - Windows driver compatibility detection tool"
|
Title="Derping Drivers - Windows driver compatibility detection tool"
|
||||||
Height="400" Width="700"
|
Height="440" Width="700"
|
||||||
ShowMaxRestoreButton="False"
|
ShowMaxRestoreButton="False"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="NoResize"
|
||||||
WindowStartupLocation="CenterScreen"
|
WindowStartupLocation="CenterScreen"
|
||||||
SaveWindowPosition="True"
|
|
||||||
BorderThickness="0"
|
BorderThickness="0"
|
||||||
GlowBrush="{DynamicResource AccentColorBrush}"
|
GlowBrush="{DynamicResource AccentColorBrush}"
|
||||||
DataContext="{Binding RelativeSource={RelativeSource Self}}">
|
DataContext="{Binding RelativeSource={RelativeSource Self}}">
|
||||||
@ -28,6 +27,7 @@
|
|||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@ -41,28 +41,32 @@
|
|||||||
<Label Grid.Row="0" Grid.Column="2" Content="{Binding Path=OsVersionName}"
|
<Label Grid.Row="0" Grid.Column="2" Content="{Binding Path=OsVersionName}"
|
||||||
ToolTip="Product name of the operating system." />
|
ToolTip="Product name of the operating system." />
|
||||||
|
|
||||||
<Label Grid.Row="1" Grid.Column="0">Windows version number:</Label>
|
<Label Grid.Row="1" Grid.Column="0">Windows edition name:</Label>
|
||||||
<Label Grid.Row="1" Grid.Column="2" Content="{Binding Path=OsVersion}"
|
<Label Grid.Row="1" Grid.Column="2" Content="{Binding Path=OsEditionName}"
|
||||||
|
ToolTip="Edition name of the operating system (if any)." />
|
||||||
|
|
||||||
|
<Label Grid.Row="2" Grid.Column="0">Windows version number:</Label>
|
||||||
|
<Label Grid.Row="2" Grid.Column="2" Content="{Binding Path=OsVersion}"
|
||||||
ToolTip="Detailed build number of the operating system." />
|
ToolTip="Detailed build number of the operating system." />
|
||||||
|
|
||||||
<Label Grid.Row="2" Grid.Column="0">Windows architecture:</Label>
|
<Label Grid.Row="3" Grid.Column="0">Windows architecture:</Label>
|
||||||
<Label Grid.Row="2" Grid.Column="2" Content="{Binding Path=OsArchitecture}"
|
<Label Grid.Row="3" Grid.Column="2" Content="{Binding Path=OsArchitecture}"
|
||||||
ToolTip="The architecture of the operating system. A 32-bit driver can't get loaded on a 64-bit system and vice versa." />
|
ToolTip="The architecture of the operating system. A 32-bit driver can't get loaded on a 64-bit system and vice versa." />
|
||||||
|
|
||||||
<Label Grid.Row="3" Grid.Column="0">Current boot mode:</Label>
|
<Label Grid.Row="4" Grid.Column="0">Current boot mode:</Label>
|
||||||
<Label Grid.Row="3" Grid.Column="2" Content="{Binding Path=BootMode}"
|
<Label Grid.Row="4" Grid.Column="2" Content="{Binding Path=BootMode}"
|
||||||
ToolTip="The current boot mode. Either UEFI (modern) or Legacy BIOS (old)." />
|
ToolTip="The current boot mode. Either UEFI (modern) or Legacy BIOS (old)." />
|
||||||
|
|
||||||
<Label Grid.Row="4" Grid.Column="0">Secure Boot state:</Label>
|
<Label Grid.Row="5" Grid.Column="0">Secure Boot state:</Label>
|
||||||
<Label Grid.Row="4" Grid.Column="2" Content="{Binding Path=SecureBootEnabled}"
|
<Label Grid.Row="5" Grid.Column="2" Content="{Binding Path=SecureBootEnabled}"
|
||||||
ToolTip="Enforces stricter cryptographic driver signatures." />
|
ToolTip="Enforces stricter cryptographic driver signatures." />
|
||||||
|
|
||||||
<Label Grid.Row="5" Grid.Column="0">OS upgrade status:</Label>
|
<Label Grid.Row="6" Grid.Column="0">OS upgrade status:</Label>
|
||||||
<Label Grid.Row="5" Grid.Column="2" Content="{Binding Path=OsUpgradeStatus}"
|
<Label Grid.Row="6" Grid.Column="2" Content="{Binding Path=OsUpgradeStatus}"
|
||||||
ToolTip="Determines if the system has been in-place upgraded from an older version of Windows." />
|
ToolTip="Determines if the system has been in-place upgraded from an older version of Windows." />
|
||||||
|
|
||||||
<Label Grid.Row="6" Grid.Column="0">Test Signing state:</Label>
|
<Label Grid.Row="7" Grid.Column="0">Test Signing state:</Label>
|
||||||
<Label Grid.Row="6" Grid.Column="2" Content="{Binding Path=TestSigningStatus}"
|
<Label Grid.Row="7" Grid.Column="2" Content="{Binding Path=TestSigningStatus}"
|
||||||
ToolTip="Allows loading of test/self-signed drivers if enabled." />
|
ToolTip="Allows loading of test/self-signed drivers if enabled." />
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
@ -33,7 +33,12 @@ namespace DerpingDrivers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets Operating System display name.
|
/// Gets Operating System display name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string OsVersionName => $"{OsVersionInfo.Name} {OsVersionInfo.Edition}";
|
public string OsVersionName => OsVersionInfo.Name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets Operating System edition name.
|
||||||
|
/// </summary>
|
||||||
|
public string OsEditionName => string.IsNullOrEmpty(OsVersionInfo.Edition) ? "None" : OsVersionInfo.Edition;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets Operating System build number.
|
/// Gets Operating System build number.
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Windows;
|
||||||
|
using Markdig.Helpers;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
// http://www.codeproject.com/Articles/73000/Getting-Operating-System-Version-Info-Even-for-Win
|
// http://www.codeproject.com/Articles/73000/Getting-Operating-System-Version-Info-Even-for-Win
|
||||||
@ -18,6 +22,16 @@ namespace DerpingDrivers.Util
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class OsVersionInfo
|
public static class OsVersionInfo
|
||||||
{
|
{
|
||||||
|
private static readonly List<string> Windows10ReleaseIds = new OrderedList<string>
|
||||||
|
{
|
||||||
|
"1507",
|
||||||
|
"1607",
|
||||||
|
"1703",
|
||||||
|
"1709",
|
||||||
|
"1803",
|
||||||
|
"1809"
|
||||||
|
};
|
||||||
|
|
||||||
#region SERVICE PACK
|
#region SERVICE PACK
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -39,14 +53,15 @@ namespace DerpingDrivers.Util
|
|||||||
|
|
||||||
#endregion SERVICE PACK
|
#endregion SERVICE PACK
|
||||||
|
|
||||||
#region Windows 10 Detection
|
#region Windows 10/Server 2016+ Detection
|
||||||
|
|
||||||
private static bool IsWindows10()
|
private static bool IsWindows10()
|
||||||
{
|
{
|
||||||
var productName = RegistryRead(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion",
|
var releaseId = (string) Registry.GetValue(
|
||||||
"ProductName", "");
|
@"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion",
|
||||||
if (productName.StartsWith("Windows 10", StringComparison.OrdinalIgnoreCase)) return true;
|
"ReleaseId", null);
|
||||||
return false;
|
|
||||||
|
return !string.IsNullOrEmpty(releaseId) && Windows10ReleaseIds.Any(id => id.Contains(releaseId));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -244,8 +259,7 @@ namespace DerpingDrivers.Util
|
|||||||
var edition = string.Empty;
|
var edition = string.Empty;
|
||||||
|
|
||||||
var osVersion = Environment.OSVersion;
|
var osVersion = Environment.OSVersion;
|
||||||
var osVersionInfo = new OSVERSIONINFOEX();
|
var osVersionInfo = new OSVERSIONINFOEX {dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX))};
|
||||||
osVersionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX));
|
|
||||||
|
|
||||||
if (GetVersionEx(ref osVersionInfo))
|
if (GetVersionEx(ref osVersionInfo))
|
||||||
{
|
{
|
||||||
@ -556,6 +570,10 @@ namespace DerpingDrivers.Util
|
|||||||
|
|
||||||
private static string _name;
|
private static string _name;
|
||||||
|
|
||||||
|
private static string ReleaseId => (string) Registry.GetValue(
|
||||||
|
@"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion",
|
||||||
|
"ReleaseId", null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the name of the operating system running on this computer.
|
/// Gets the name of the operating system running on this computer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -673,76 +691,11 @@ namespace DerpingDrivers.Util
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
switch (minorVersion)
|
name = ParseVistaThrough8(minorVersion, productType);
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
switch (productType)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
name = "Windows Vista";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
name = "Windows Server 2008";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
switch (productType)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
name = "Windows 7";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
name = "Windows Server 2008 R2";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
switch (productType)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
name = "Windows 8";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
name = "Windows Server 2012";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
switch (productType)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
name = "Windows 8.1";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
name = "Windows Server 2012 R2";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
switch (minorVersion)
|
name = ParseWindows10Version(minorVersion, productType, ReleaseId);
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
switch (productType)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
name = "Windows 10";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
name = "Windows Server 2016";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -757,6 +710,83 @@ namespace DerpingDrivers.Util
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string ParseVistaThrough8(int minorVersion, byte productType)
|
||||||
|
{
|
||||||
|
switch (minorVersion)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
switch (productType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return "Windows Vista";
|
||||||
|
case 3:
|
||||||
|
return "Windows Server 2008";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
switch (productType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return "Windows 7";
|
||||||
|
case 3:
|
||||||
|
return "Windows Server 2008 R2";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (productType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return "Windows 8";
|
||||||
|
case 3:
|
||||||
|
return "Windows Server 2012";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
switch (productType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return "Windows 8.1";
|
||||||
|
case 3:
|
||||||
|
return "Windows Server 2012 R2";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ParseWindows10Version(int minorVersion, byte productType, string releaseId)
|
||||||
|
{
|
||||||
|
switch (minorVersion)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
switch (productType)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return "Windows 10";
|
||||||
|
case 3:
|
||||||
|
switch (releaseId)
|
||||||
|
{
|
||||||
|
case "1607":
|
||||||
|
return "Windows Server 2016";
|
||||||
|
case "1809":
|
||||||
|
return "Windows Server 2019";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion NAME
|
#endregion NAME
|
||||||
|
|
||||||
#region PINVOKE
|
#region PINVOKE
|
||||||
@ -829,16 +859,16 @@ namespace DerpingDrivers.Util
|
|||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
private struct SYSTEM_INFO
|
private struct SYSTEM_INFO
|
||||||
{
|
{
|
||||||
internal _PROCESSOR_INFO_UNION uProcessorInfo;
|
internal readonly _PROCESSOR_INFO_UNION uProcessorInfo;
|
||||||
public uint dwPageSize;
|
public readonly uint dwPageSize;
|
||||||
public IntPtr lpMinimumApplicationAddress;
|
public readonly IntPtr lpMinimumApplicationAddress;
|
||||||
public IntPtr lpMaximumApplicationAddress;
|
public readonly IntPtr lpMaximumApplicationAddress;
|
||||||
public IntPtr dwActiveProcessorMask;
|
public readonly IntPtr dwActiveProcessorMask;
|
||||||
public uint dwNumberOfProcessors;
|
public readonly uint dwNumberOfProcessors;
|
||||||
public uint dwProcessorType;
|
public readonly uint dwProcessorType;
|
||||||
public uint dwAllocationGranularity;
|
public readonly uint dwAllocationGranularity;
|
||||||
public ushort dwProcessorLevel;
|
public readonly ushort dwProcessorLevel;
|
||||||
public ushort dwProcessorRevision;
|
public readonly ushort dwProcessorRevision;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion SYSTEM_INFO
|
#endregion SYSTEM_INFO
|
||||||
@ -848,9 +878,9 @@ namespace DerpingDrivers.Util
|
|||||||
[StructLayout(LayoutKind.Explicit)]
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
private struct _PROCESSOR_INFO_UNION
|
private struct _PROCESSOR_INFO_UNION
|
||||||
{
|
{
|
||||||
[FieldOffset(0)] internal uint dwOemId;
|
[FieldOffset(0)] internal readonly uint dwOemId;
|
||||||
[FieldOffset(0)] internal ushort wProcessorArchitecture;
|
[FieldOffset(0)] internal readonly ushort wProcessorArchitecture;
|
||||||
[FieldOffset(2)] internal ushort wReserved;
|
[FieldOffset(2)] internal readonly ushort wReserved;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion _PROCESSOR_INFO_UNION
|
#endregion _PROCESSOR_INFO_UNION
|
||||||
|
Loading…
Reference in New Issue
Block a user