diff --git a/Include/Aurora/SWInfo/WinVersion.hpp b/Include/Aurora/SWInfo/WinVersion.hpp index a60ac73f..5a9ddc9e 100644 --- a/Include/Aurora/SWInfo/WinVersion.hpp +++ b/Include/Aurora/SWInfo/WinVersion.hpp @@ -38,6 +38,34 @@ namespace Aurora::SWInfo AUKN_SYM bool IsWindows8Any(); AUKN_SYM bool IsWindows10OrGreater(); AUKN_SYM bool IsWindows10(); + AUKN_SYM bool IsWindows10MilestoneTH1OrGreater(); + AUKN_SYM bool IsWindows10MilestoneTH1(); + AUKN_SYM bool IsWindows10MilestoneTH2OrGreater(); + AUKN_SYM bool IsWindows10MilestoneTH2(); + AUKN_SYM bool IsWindows10MilestoneRS1OrGreater(); + AUKN_SYM bool IsWindows10MilestoneRS1(); + AUKN_SYM bool IsWindows10MilestoneRS2OrGreater(); + AUKN_SYM bool IsWindows10MilestoneRS2(); + AUKN_SYM bool IsWindows10MilestoneRS3OrGreater(); + AUKN_SYM bool IsWindows10MilestoneRS3(); + AUKN_SYM bool IsWindows10MilestoneRS4OrGreater(); + AUKN_SYM bool IsWindows10MilestoneRS4(); + AUKN_SYM bool IsWindows10MilestoneRS5OrGreater(); + AUKN_SYM bool IsWindows10MilestoneRS5(); + AUKN_SYM bool IsWindows10Milestone19H1OrGreater(); + AUKN_SYM bool IsWindows10Milestone19H1(); + AUKN_SYM bool IsWindows10Milestone19H2OrGreater(); + AUKN_SYM bool IsWindows10Milestone19H2(); + AUKN_SYM bool IsWindows10Milestone20H1OrGreater(); + AUKN_SYM bool IsWindows10Milestone20H1(); + AUKN_SYM bool IsWindows10Milestone20H2OrGreater(); + AUKN_SYM bool IsWindows10Milestone20H2(); + AUKN_SYM bool IsWindows10Milestone21H1OrGreater(); + AUKN_SYM bool IsWindows10Milestone21H1(); + AUKN_SYM bool IsWindows10Milestone21H2OrGreater(); + AUKN_SYM bool IsWindows10Milestone21H2(); + AUKN_SYM bool IsWindows10Milestone22H2OrGreater(); + AUKN_SYM bool IsWindows10Milestone22H2(); AUKN_SYM bool IsWindows11OrGreater(); AUKN_SYM bool IsWindows11(); } \ No newline at end of file diff --git a/Source/SWInfo/AuVersionHelpers.cpp b/Source/SWInfo/AuVersionHelpers.cpp index 734e3b57..5a868c0a 100644 --- a/Source/SWInfo/AuVersionHelpers.cpp +++ b/Source/SWInfo/AuVersionHelpers.cpp @@ -11,18 +11,33 @@ namespace Aurora::SWInfo { - static AuUInt16 kWinVerNT4 = 0x0400; - static AuUInt16 kWinVerWin2K = 0x0500; - static AuUInt16 kWinVerWinXP = 0x0501; - static AuUInt16 kWinVerWS03 = 0x0502; - static AuUInt16 kWinVerWin6 = 0x0600; - static AuUInt16 kWinVerVista = 0x0600; - static AuUInt16 kWinVerWS08 = 0x0600; - static AuUInt16 kWinVerWin7 = 0x0601; - static AuUInt16 kWinVerWin8 = 0x0602; - static AuUInt16 kWinVerWinBlue = 0x0603; - static AuUInt16 kWinVerWin10 = 0x0A00; - static AuUInt16 kKernPatchWin11 = 22000; + static const AuUInt16 kWinVerNT4 = 0x0400; + static const AuUInt16 kWinVerWin2K = 0x0500; + static const AuUInt16 kWinVerWinXP = 0x0501; + static const AuUInt16 kWinVerWS03 = 0x0502; + static const AuUInt16 kWinVerWin6 = 0x0600; + static const AuUInt16 kWinVerVista = 0x0600; + static const AuUInt16 kWinVerWS08 = 0x0600; + static const AuUInt16 kWinVerWin7 = 0x0601; + static const AuUInt16 kWinVerWin8 = 0x0602; + static const AuUInt16 kWinVerWinBlue = 0x0603; + static const AuUInt16 kWinVerWin10 = 0x0A00; + static const AuUInt16 kKernPatchWin11 = 22000; + static const AuUInt16 kWin10KernPatchTH1 = 10240; + static const AuUInt16 kWin10KernPatchTH2 = 10586; + static const AuUInt16 kWin10KernPatchRS1 = 14393; + static const AuUInt16 kWin10KernPatchRS2 = 15063; + static const AuUInt16 kWin10KernPatchRS3 = 16299; + static const AuUInt16 kWin10KernPatchRS4 = 17134; + static const AuUInt16 kWin10KernPatchRS5 = 17763; + static const AuUInt16 kWin10KernPatch19H1 = 18362; + static const AuUInt16 kWin10KernPatch19H2 = 18363; + static const AuUInt16 kWin10KernPatch20H1 = 19041; + static const AuUInt16 kWin10KernPatch20H2 = 19042; + static const AuUInt16 kWin10KernPatch21H1 = 19043; + static const AuUInt16 kWin10KernPatch21H2 = 19044; + static const AuUInt16 kWin10KernPatch22H2 = 19045; + static const AuUInt16 kWin10KernPatchDummy = kKernPatchWin11; static bool IsWindowsVersionOrGreater(AuUInt8 major, AuUInt8 minor, AuUInt16 sp) { @@ -32,6 +47,25 @@ namespace Aurora::SWInfo ((info.uKernelMajor == major && info.uKernelMinor == minor) ? info.uUserlandMinor >= sp : true); } + static bool DoWin10PatchGreaterCheck(AuUInt32 uPatch) + { + auto &info = GetPlatformInfo(); + return info.ePlatform == Build::EPlatform::ePlatformWin32 && + (info.uKernelMajor > AuBitsToHigher(kWinVerWin10) || + (info.uKernelMajor == AuBitsToHigher(kWinVerWin10) && + info.uKernelMinor || info.uKernelPatch >= uPatch)); + } + + static bool DoWin10PatchEqCheck(AuUInt32 uPatch, AuUInt32 uPatch2) + { + auto &info = GetPlatformInfo(); + return info.ePlatform == Build::EPlatform::ePlatformWin32 && + info.uKernelPatch >= uPatch && + info.uKernelPatch < uPatch2 && + info.uKernelMajor == AuBitsToHigher(kWinVerWin10) && + info.uKernelMinor == AuBitsToLower(kWinVerWin10); + } + AUKN_SYM bool IsWindowsXPOrGreater() { return IsWindowsVersionOrGreater(AuBitsToHigher(kWinVerWinXP), AuBitsToLower(kWinVerWinXP), 0); @@ -94,9 +128,7 @@ namespace Aurora::SWInfo AUKN_SYM bool IsWindows11OrGreater() { - auto &info = GetPlatformInfo(); - return IsWindowsVersionOrGreater(AuBitsToHigher(kWinVerWin10), AuBitsToLower(kWinVerWin10), 0) && - (info.uKernelPatch >= kKernPatchWin11 || info.uKernelMajor > AuBitsToHigher(kWinVerWin10)); + return DoWin10PatchGreaterCheck(kKernPatchWin11); } #define ADD_ABS_CHECK(A, B) \ @@ -142,4 +174,30 @@ namespace Aurora::SWInfo { return IsWindows8OrGreater() && !IsWindows10OrGreater(); } + +#define ADD_WIN10_VER(name, next) \ + \ + AUKN_SYM bool IsWindows10Milestone ## name ## OrGreater() \ + { \ + return DoWin10PatchGreaterCheck(kWin10KernPatch ## name); \ + } \ + \ + AUKN_SYM bool IsWindows10Milestone ## name() \ + { \ + return DoWin10PatchEqCheck(kWin10KernPatch ## name, kWin10KernPatch ## next); \ + } + + ADD_WIN10_VER(TH1, TH2); + ADD_WIN10_VER(TH2, RS1); + ADD_WIN10_VER(RS1, RS2); + ADD_WIN10_VER(RS2, RS4); + ADD_WIN10_VER(RS4, RS5); + ADD_WIN10_VER(RS5, 19H1); + ADD_WIN10_VER(19H1, 19H2); + ADD_WIN10_VER(19H2, 20H1); + ADD_WIN10_VER(20H1, 20H2); + ADD_WIN10_VER(20H2, 21H1); + ADD_WIN10_VER(21H1, 21H2); + ADD_WIN10_VER(21H2, 22H2); + ADD_WIN10_VER(22H2, Dummy); } \ No newline at end of file