Skip to content

Commit 84f3bdc

Browse files
committed
[NT:VERSION] Introduce new version control macros
1 parent 3fe0a7f commit 84f3bdc

File tree

6 files changed

+119
-22
lines changed

6 files changed

+119
-22
lines changed

Source/Include/KNSoft/NDK/NT/MinDef.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,10 @@
22

33
#pragma once
44

5-
#include <SdkDdkVer.h>
5+
/* Version control */
6+
#include "Version.h"
67

7-
/* Patch undocumented NTDDI versions */
8-
#define NTDDI_WIN10_GE NTDDI_WIN11_ZN /* Introduced in Windows SDK 10.0.26100.1 (Win11), later than all NTDDI_WIN10_* */
9-
#define NTDDI_WIN11_DT NTDDI_WIN11_GE /* Introduced in Windows SDK 10.0.26100.3916, later than NTDDI_WIN11_GE */
10-
11-
/* Minimum support NT6.0 by default */
12-
#ifndef _KNSOFT_NDK_NTDDI_MIN
13-
#define _KNSOFT_NDK_NTDDI_MIN NTDDI_VISTA
14-
#endif
15-
16-
// MS-Spec: Nonstandard extension used: zero-sized array in struct/union
8+
/* MS-Spec: Nonstandard extension used: zero-sized array in struct/union */
179
#pragma warning(disable: 4200)
1810

1911
#if defined(_DEBUG) && !defined(DBG)

Source/Include/KNSoft/NDK/NT/NT.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,14 @@
4040
#include "Extension/Runtime.h"
4141
#include "Extension/Security.h"
4242
#endif
43+
44+
__forceinline
45+
ULONG
46+
GET_NT_VERSION(VOID)
47+
{
48+
return NT_VERSION(SharedUserData->NtMajorVersion,
49+
SharedUserData->NtMinorVersion,
50+
SharedUserData->NtBuildNumber);
51+
}
52+
53+
#define IS_NT_VERSION_GE(NtVersion) (NT_VERSION_MIN >= NtVersion || GET_NT_VERSION() >= NtVersion)
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* KNSoft.NDK NT version control
3+
*
4+
* NT_VERSION: Make NT version number (ULONG)
5+
* NT_VERSION_*: NT version numbers
6+
* NT_VERSION_MIN: Minimum support NT version, can be set by user and will not lower than NT_VERSION_MIN_CONSTRAINED
7+
*
8+
* Defined in "NT.h":
9+
* GET_NT_VERSION: Get NT version number from `SharedUserData`
10+
* IS_NT_VERSION_GE: Return whether NT_VERSION_MIN or GET_NT_VERSION is greater than or equal to the given NT version number
11+
*/
12+
13+
#pragma once
14+
15+
#include <SdkDdkVer.h>
16+
17+
/* Patch undocumented NTDDI versions */
18+
#define NTDDI_WIN10_GE NTDDI_WIN11_ZN /* Introduced in Windows SDK 10.0.26100.1 (Win11), later than all NTDDI_WIN10_* */
19+
#define NTDDI_WIN11_DT NTDDI_WIN11_GE /* Introduced in Windows SDK 10.0.26100.3916, later than NTDDI_WIN11_GE */
20+
21+
#define NT_VERSION(Major, Minor, Build) (((((Major) & 0xFF) << 24) | (((Minor) & 0xFF) << 16)) | ((Build) & 0xFFFF))
22+
23+
#define NT_VERSION_WIN2K NT_VERSION(5, 0, 0)
24+
#define NT_VERSION_WINXP NT_VERSION(5, 1, 0)
25+
#define NT_VERSION_WS2K3 NT_VERSION(5, 2, 0)
26+
#define NT_VERSION_VISTA NT_VERSION(6, 0, 0)
27+
#define NT_VERSION_WIN7 NT_VERSION(6, 1, 0)
28+
#define NT_VERSION_WIN8 NT_VERSION(6, 2, 0)
29+
#define NT_VERSION_WINBLUE NT_VERSION(6, 3, 0)
30+
31+
#define NT_VERSION_WIN10 NT_VERSION(10, 0, 0)
32+
33+
#define NT_VERSION_WIN10_TH NT_VERSION(10, 0, 10240)
34+
#define NT_VERSION_WIN10_1507 NT_VERSION_WIN10_TH
35+
36+
#define NT_VERSION_WIN10_TH2 NT_VERSION(10, 0, 10586)
37+
#define NT_VERSION_WIN10_1511 NT_VERSION_WIN10_TH2
38+
39+
#define NT_VERSION_WIN10_RS1 NT_VERSION(10, 0, 14393)
40+
#define NT_VERSION_WIN10_1607 NT_VERSION_WIN10_RS1
41+
42+
#define NT_VERSION_WIN10_RS2 NT_VERSION(10, 0, 15063)
43+
#define NT_VERSION_WIN10_1703 NT_VERSION_WIN10_RS2
44+
45+
#define NT_VERSION_WIN10_RS3 NT_VERSION(10, 0, 16299)
46+
#define NT_VERSION_WIN10_1709 NT_VERSION_WIN10_RS3
47+
48+
#define NT_VERSION_WIN10_RS4 NT_VERSION(10, 0, 17134)
49+
#define NT_VERSION_WIN10_1803 NT_VERSION_WIN10_RS4
50+
51+
#define NT_VERSION_WIN10_RS5 NT_VERSION(10, 0, 17763)
52+
#define NT_VERSION_WIN10_1809 NT_VERSION_WIN10_RS5
53+
54+
#define NT_VERSION_WIN10_19H1 NT_VERSION(10, 0, 18362)
55+
#define NT_VERSION_WIN10_1903 NT_VERSION_WIN10_19H1
56+
57+
#define NT_VERSION_WIN10_19H2 NT_VERSION(10, 0, 18363)
58+
#define NT_VERSION_WIN10_1909 NT_VERSION_WIN10_19H2
59+
60+
#define NT_VERSION_WIN10_20H1 NT_VERSION(10, 0, 19041)
61+
#define NT_VERSION_WIN10_2004 NT_VERSION_WIN10_20H1
62+
63+
#define NT_VERSION_WIN10_20H2 NT_VERSION(10, 0, 19042)
64+
#define NT_VERSION_WIN10_21H1 NT_VERSION(10, 0, 19043)
65+
#define NT_VERSION_WIN10_21H2 NT_VERSION(10, 0, 19044)
66+
#define NT_VERSION_WIN10_22H2 NT_VERSION(10, 0, 19045)
67+
68+
#define NT_VERSION_WIN11 NT_VERSION(10, 0, 22000)
69+
#define NT_VERSION_WIN11_21H2 NT_VERSION_WIN11
70+
#define NT_VERSION_WIN11_22H2 NT_VERSION(10, 0, 22621)
71+
#define NT_VERSION_WIN11_23H2 NT_VERSION(10, 0, 22631)
72+
#define NT_VERSION_WIN11_24H2 NT_VERSION(10, 0, 26100)
73+
#define NT_VERSION_WIN11_25H2 NT_VERSION(10, 0, 26200)
74+
75+
/* ARM support since NT10 */
76+
#if defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM)
77+
#define NT_VERSION_MIN_CONSTRAINED NT_VERSION_WIN10
78+
#endif
79+
80+
/* Minimum support NT6.0 by default */
81+
#ifndef NT_VERSION_MIN
82+
#define NT_VERSION_MIN NT_VERSION_VISTA
83+
#endif
84+
85+
/* Adjust NT_VERSION_MIN if it is lower than NT_VERSION_MIN_CONSTRAINED */
86+
#if defined(NT_VERSION_MIN_CONSTRAINED) && (NT_VERSION_MIN < NT_VERSION_MIN_CONSTRAINED)
87+
#undef NT_VERSION_MIN
88+
#define NT_VERSION_MIN NT_VERSION_MIN_CONSTRAINED
89+
#endif

Source/Include/KNSoft/NDK/Win32/API/Kernel32.inl

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -502,19 +502,20 @@ _Inline_InitializeCriticalSectionAndSpinCount(
502502
_Out_ LPCRITICAL_SECTION lpCriticalSection,
503503
_In_ DWORD dwSpinCount)
504504
{
505-
#if _KNSOFT_NDK_NTDDI_MIN >= NTDDI_VISTA
506-
RtlInitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);
507-
return TRUE;
508-
#else
509-
NTSTATUS Status = RtlInitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);
510-
if (NT_SUCCESS(Status))
505+
if (IS_NT_VERSION_GE(NT_VERSION_VISTA))
511506
{
507+
RtlInitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);
512508
return TRUE;
509+
} else
510+
{
511+
NTSTATUS Status = RtlInitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);
512+
if (NT_SUCCESS(Status))
513+
{
514+
return TRUE;
515+
}
516+
_Inline_BaseSetLastNTError(Status);
517+
return FALSE;
513518
}
514-
515-
_Inline_BaseSetLastNTError(Status);
516-
return FALSE;
517-
#endif
518519
}
519520

520521
__inline
@@ -1481,7 +1482,7 @@ _Inline_InterlockedPushListSListEx(
14811482
_In_ ULONG Count)
14821483
{
14831484
return
1484-
#if _KNSOFT_NDK_NTDDI_MIN >= NTDDI_WIN8
1485+
#if NT_VERSION_MIN >= NT_VERSION_WIN8
14851486
RtlInterlockedPushListSListEx
14861487
#else
14871488
RtlInterlockedPushListSList

Source/KNSoft.NDK/KNSoft.NDK.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
<ClInclude Include="..\Include\KNSoft\NDK\NT\Sxs.h" />
214214
<ClInclude Include="..\Include\KNSoft\NDK\NT\Tm.h" />
215215
<ClInclude Include="..\Include\KNSoft\NDK\NT\Misc.h" />
216+
<ClInclude Include="..\Include\KNSoft\NDK\NT\Version.h" />
216217
<ClInclude Include="..\Include\KNSoft\NDK\NT\Win32K\Gdi.h" />
217218
<ClInclude Include="..\Include\KNSoft\NDK\NT\Win32K\Win32KApi.h" />
218219
<ClInclude Include="..\Include\KNSoft\NDK\NT\Win32K\Win32K.h" />

Source/KNSoft.NDK/KNSoft.NDK.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,9 @@
488488
<ClInclude Include="..\Include\KNSoft\NDK\NT\ZwApi.Manual.h">
489489
<Filter>NT</Filter>
490490
</ClInclude>
491+
<ClInclude Include="..\Include\KNSoft\NDK\NT\Version.h">
492+
<Filter>NT</Filter>
493+
</ClInclude>
491494
</ItemGroup>
492495
<ItemGroup>
493496
<None Include="..\Include\KNSoft\NDK\Package\UnitTest.inl">

0 commit comments

Comments
 (0)