@@ -15,6 +15,26 @@ typedef struct _STAGE2_LOADER_DATA {
1515 DWORD loader_pid;
1616} STAGE2_LOADER_DATA, *PSTAGE2_LOADER_DATA;
1717
18+ typedef struct _SYSTEM_KERNEL_VA_SHADOW_INFORMATION {
19+ union {
20+ ULONG KvaShadowFlags;
21+ struct {
22+ ULONG KvaShadowEnabled : 1 ;
23+ ULONG KvaShadowUserGlobal : 1 ;
24+ ULONG KvaShadowPcid : 1 ;
25+ ULONG KvaShadowInvpcid : 1 ;
26+ ULONG KvaShadowRequired : 1 ; // REDSTONE4
27+ ULONG KvaShadowRequiredAvailable : 1 ;
28+ ULONG InvalidPteBit : 6 ;
29+ ULONG L1DataCacheFlushSupported : 1 ;
30+ ULONG L1TerminalFaultMitigationPresent : 1 ;
31+ ULONG Reserved : 18 ;
32+ };
33+ };
34+ } SYSTEM_KERNEL_VA_SHADOW_INFORMATION, *PSYSTEM_KERNEL_VA_SHADOW_INFORMATION;
35+
36+ constexpr SYSTEM_INFORMATION_CLASS SystemKernelVaShadowInformation = (SYSTEM_INFORMATION_CLASS)196 ;
37+
1838extern " C" NTSYSAPI NTSTATUS NTAPI RtlGetVersion (
1939 _Out_ PRTL_OSVERSIONINFOW lpVersionInformation
2040);
@@ -43,6 +63,14 @@ inline bool isHvciEnabled() {
4363 return false ;
4464}
4565
66+ inline bool isKVAShadowEnabled () {
67+ SYSTEM_KERNEL_VA_SHADOW_INFORMATION kvs = { 0 };
68+ if (NT_SUCCESS (NtQuerySystemInformation (SystemKernelVaShadowInformation, &kvs, sizeof (kvs), NULL ))) {
69+ return kvs.KvaShadowEnabled ;
70+ }
71+ return false ;
72+ }
73+
4674inline std::wstring get_proces_name (HANDLE process) {
4775 std::wstring process_name;
4876 process_name.resize (MAX_PATH);
0 commit comments