Clean-up
Refined error handling
This commit is contained in:
parent
ab0ef80819
commit
b3786a0487
@ -16,7 +16,8 @@ namespace DerpingDrivers
|
||||
"Release",
|
||||
0);
|
||||
|
||||
// This is a big ugly but catches cases where invoked without the app.config
|
||||
// This is a bit ugly but catches cases where invoked without the app.config
|
||||
// will lead to a silent crash because of missing methods etc.
|
||||
if (netRelease < 394254)
|
||||
{
|
||||
MessageBox.Show(
|
||||
|
@ -111,6 +111,7 @@
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="Exceptions\NtQuerySystemInformationException.cs" />
|
||||
<Compile Include="Util\CodeIntegrityHelper.cs" />
|
||||
<Compile Include="Util\OsUpgradeDetection.cs" />
|
||||
<Compile Include="Util\OSVersionInfo.cs" />
|
||||
|
@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace DerpingDrivers.Exceptions
|
||||
{
|
||||
public class NtQuerySystemInformationException : Exception
|
||||
{
|
||||
public NtQuerySystemInformationException()
|
||||
{
|
||||
}
|
||||
|
||||
public NtQuerySystemInformationException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
public NtQuerySystemInformationException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
}
|
||||
|
||||
protected NtQuerySystemInformationException(SerializationInfo info, StreamingContext context) : base(info, context)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -1,25 +1,15 @@
|
||||
using PInvoke;
|
||||
using System;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using DerpingDrivers.Exceptions;
|
||||
using PInvoke;
|
||||
|
||||
namespace DerpingDrivers.Util
|
||||
{
|
||||
public static class CodeIntegrityHelper
|
||||
{
|
||||
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
||||
private delegate Int32 NtQuerySystemInformation(
|
||||
UInt32 SystemInformationClass,
|
||||
IntPtr SystemInformation,
|
||||
UInt32 SystemInformationLength,
|
||||
out UInt32 ReturnLength);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct SYSTEM_CODEINTEGRITY_INFORMATION
|
||||
{
|
||||
public UInt32 Length;
|
||||
public UInt32 CodeIntegrityOptions;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Determines if the system is currently in TESTSIGNING mode.
|
||||
/// </summary>
|
||||
public static bool IsTestSignEnabled
|
||||
{
|
||||
get
|
||||
@ -35,9 +25,9 @@ namespace DerpingDrivers.Util
|
||||
Marshal.GetDelegateForFunctionPointer<NtQuerySystemInformation>(fptr);
|
||||
|
||||
SYSTEM_CODEINTEGRITY_INFORMATION integrity;
|
||||
integrity.Length = (uint)Marshal.SizeOf<SYSTEM_CODEINTEGRITY_INFORMATION>();
|
||||
integrity.Length = (uint) Marshal.SizeOf<SYSTEM_CODEINTEGRITY_INFORMATION>();
|
||||
integrity.CodeIntegrityOptions = 0;
|
||||
|
||||
|
||||
Marshal.StructureToPtr(integrity, pIntegrity, false);
|
||||
|
||||
var status = ntQuerySystemInformation(
|
||||
@ -47,9 +37,15 @@ namespace DerpingDrivers.Util
|
||||
out _
|
||||
);
|
||||
|
||||
var error = Kernel32.GetLastError();
|
||||
|
||||
if (status != 0)
|
||||
throw new NtQuerySystemInformationException(
|
||||
$"NtQuerySystemInformation failed with status {error}");
|
||||
|
||||
integrity = Marshal.PtrToStructure<SYSTEM_CODEINTEGRITY_INFORMATION>(pIntegrity);
|
||||
|
||||
return ((integrity.CodeIntegrityOptions & /* CODEINTEGRITY_OPTION_TESTSIGN */ 0x02) != 0);
|
||||
return (integrity.CodeIntegrityOptions & /* CODEINTEGRITY_OPTION_TESTSIGN */ 0x02) != 0;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -57,5 +53,23 @@ namespace DerpingDrivers.Util
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region Native
|
||||
|
||||
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
||||
private delegate int NtQuerySystemInformation(
|
||||
uint SystemInformationClass,
|
||||
IntPtr SystemInformation,
|
||||
uint SystemInformationLength,
|
||||
out uint ReturnLength);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct SYSTEM_CODEINTEGRITY_INFORMATION
|
||||
{
|
||||
public uint Length;
|
||||
public uint CodeIntegrityOptions;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -594,6 +594,7 @@ namespace DerpingDrivers.Util
|
||||
var majorVersion = osVersion.Version.Major;
|
||||
var minorVersion = osVersion.Version.Minor;
|
||||
|
||||
// TODO: deprecate this. Use a proper manifest. Always.
|
||||
if (majorVersion == 6 && minorVersion == 2)
|
||||
{
|
||||
//The registry read workaround is by Scott Vickery. Thanks a lot for the help!
|
||||
|
@ -9,6 +9,9 @@ namespace DerpingDrivers.Util
|
||||
/// </summary>
|
||||
public class OsUpgradeDetection
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets whether the system has been in-place upgraded.
|
||||
/// </summary>
|
||||
public static bool IsGrandfathered
|
||||
{
|
||||
get
|
||||
@ -39,7 +42,6 @@ namespace DerpingDrivers.Util
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: untested but should work
|
||||
if (productName.StartsWith("Windows 8", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
return true;
|
||||
|
@ -13,10 +13,10 @@ namespace DerpingDrivers.Util
|
||||
{
|
||||
get
|
||||
{
|
||||
var val = Convert.ToInt32(Registry.GetValue(
|
||||
@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecureBoot\State",
|
||||
var val = (int) Registry.GetValue(
|
||||
@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecureBoot\State",
|
||||
"UEFISecureBootEnabled",
|
||||
0));
|
||||
0);
|
||||
|
||||
return val > 0;
|
||||
}
|
||||
@ -30,20 +30,24 @@ namespace DerpingDrivers.Util
|
||||
{
|
||||
get
|
||||
{
|
||||
// The arguments submitted are dummy values; GetLastError will
|
||||
// report ERROR_INVALID_FUNCTION on Legacy BIOS systems.
|
||||
GetFirmwareEnvironmentVariable(
|
||||
string.Empty,
|
||||
"{00000000-0000-0000-0000-000000000000}",
|
||||
IntPtr.Zero, 0);
|
||||
|
||||
var error = Marshal.GetLastWin32Error();
|
||||
|
||||
return error != 0x01; // ERROR_INVALID_FUNCTION
|
||||
return Marshal.GetLastWin32Error() != 0x01; // ERROR_INVALID_FUNCTION
|
||||
}
|
||||
}
|
||||
|
||||
#region Native
|
||||
|
||||
[DllImport("kernel32.dll", EntryPoint = "GetFirmwareEnvironmentVariableW", SetLastError = true,
|
||||
CharSet = CharSet.Unicode, ExactSpelling = true)]
|
||||
private static extern uint GetFirmwareEnvironmentVariable(string lpName, string lpGuid, IntPtr pBuffer,
|
||||
uint nSize);
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user