1
0

Fixes on incorrect version detections

This commit is contained in:
Benjamin Höglinger-Stelzer 2018-10-24 22:02:36 +02:00
parent a251a9ee5a
commit bb7d53110f
3 changed files with 141 additions and 102 deletions

View File

@ -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>

View File

@ -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.

View File

@ -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