Skip to content

Commit 609d7e7

Browse files
committed
Extend LDR_DATA_TABLE_ENTRY to Windows 11
1 parent fc4e272 commit 609d7e7

8 files changed

Lines changed: 98 additions & 120 deletions

File tree

MemoryModule/Initialize.cpp

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,13 @@ VOID InitializeWindowsVersion() {
191191
case 5: {
192192
switch (MmpGlobalDataPtr->NtVersions.MinorVersion) {
193193
case 1:
194-
version = MmpGlobalDataPtr->NtVersions.BuildNumber == 2600 ? WINDOWS_VERSION::xp : WINDOWS_VERSION::invalid;
194+
if (MmpGlobalDataPtr->NtVersions.BuildNumber == 2600)
195+
version = WINDOWS_VERSION::xp;
195196
break;
196197

197198
case 2:
198-
version = MmpGlobalDataPtr->NtVersions.BuildNumber == 3790 ? WINDOWS_VERSION::xp : WINDOWS_VERSION::invalid;
199+
if (MmpGlobalDataPtr->NtVersions.BuildNumber == 3790)
200+
version = WINDOWS_VERSION::xp;
199201
break;
200202
}
201203
break;
@@ -225,12 +227,14 @@ VOID InitializeWindowsVersion() {
225227
}
226228

227229
case 2: {
228-
if (MmpGlobalDataPtr->NtVersions.BuildNumber == 9200) version = WINDOWS_VERSION::win8;
230+
if (MmpGlobalDataPtr->NtVersions.BuildNumber == 9200)
231+
version = WINDOWS_VERSION::win8;
229232
break;
230233
}
231234

232235
case 3: {
233-
if (MmpGlobalDataPtr->NtVersions.BuildNumber == 9600) version = WINDOWS_VERSION::win8_1;
236+
if (MmpGlobalDataPtr->NtVersions.BuildNumber == 9600)
237+
version = WINDOWS_VERSION::winBlue;
234238
break;
235239
}
236240

@@ -240,27 +244,29 @@ VOID InitializeWindowsVersion() {
240244

241245
case 10: {
242246
if (MmpGlobalDataPtr->NtVersions.MinorVersion)break;
243-
switch (MmpGlobalDataPtr->NtVersions.BuildNumber) {
244-
case 10240:
245-
case 10586:
246-
version = WINDOWS_VERSION::win10;
247-
break;
248-
249-
case 14393:
250-
version = WINDOWS_VERSION::win10_1;
251-
break;
252247

253-
case 15063:
254-
case 16299:
255-
case 17134:
256-
case 17763:
257-
case 18362:
258-
version = WINDOWS_VERSION::win10_2;
259-
break;
260-
261-
default:
262-
if (RtlIsWindowsVersionOrGreater(MmpGlobalDataPtr->NtVersions.MajorVersion, MmpGlobalDataPtr->NtVersions.MinorVersion, 15063)) version = WINDOWS_VERSION::win10_2;
263-
break;
248+
DWORD BuildNumber = MmpGlobalDataPtr->NtVersions.BuildNumber;
249+
if (BuildNumber >= 10240) {
250+
if (BuildNumber >= 14393) {
251+
if (BuildNumber >= 15063) {
252+
if (BuildNumber >= 22000) {
253+
// [22000, ?)
254+
version = WINDOWS_VERSION::win11;
255+
}
256+
else {
257+
// [15063, 22000)
258+
version = WINDOWS_VERSION::win10_2;
259+
}
260+
}
261+
else {
262+
// [13494, 15063)
263+
version = WINDOWS_VERSION::win10_1;
264+
}
265+
}
266+
else {
267+
// [10240, 14393)
268+
version = WINDOWS_VERSION::win10;
269+
}
264270
}
265271

266272
break;
@@ -369,8 +375,8 @@ NTSTATUS InitializeLockHeld() {
369375
MmpGlobalDataPtr->LdrDataTableEntrySize = sizeof(LDR_DATA_TABLE_ENTRY_WIN8);
370376
break;
371377

372-
case WINDOWS_VERSION::win8_1:
373-
MmpGlobalDataPtr->LdrDataTableEntrySize = sizeof(LDR_DATA_TABLE_ENTRY_WIN8_1);
378+
case WINDOWS_VERSION::winBlue:
379+
MmpGlobalDataPtr->LdrDataTableEntrySize = sizeof(LDR_DATA_TABLE_ENTRY_WINBLUE);
374380
break;
375381

376382
case WINDOWS_VERSION::win10:
@@ -385,14 +391,25 @@ NTSTATUS InitializeLockHeld() {
385391
MmpGlobalDataPtr->LdrDataTableEntrySize = sizeof(LDR_DATA_TABLE_ENTRY_WIN10_2);
386392
break;
387393

394+
case WINDOWS_VERSION::win11:
395+
MmpGlobalDataPtr->LdrDataTableEntrySize = sizeof(LDR_DATA_TABLE_ENTRY_WIN11);
396+
break;
397+
388398
default:
389-
MmpGlobalDataPtr->LdrDataTableEntrySize = sizeof(LDR_DATA_TABLE_ENTRY_WIN10_2);
399+
NtUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
400+
status = STATUS_NOT_SUPPORTED;
390401
break;
391402
}
392403

404+
if (!NT_SUCCESS(status))break;
405+
393406
MmpGlobalDataPtr->MmpBaseAddressIndex.NtdllLdrEntry = RtlFindLdrTableEntryByBaseName(L"ntdll.dll");
394407
MmpGlobalDataPtr->MmpBaseAddressIndex.LdrpModuleBaseAddressIndex = FindLdrpModuleBaseAddressIndex();
395408

409+
HMODULE hNtdll = (HMODULE)MmpGlobalDataPtr->MmpBaseAddressIndex.NtdllLdrEntry->DllBase;
410+
MmpGlobalDataPtr->MmpLdrEntry._RtlRbInsertNodeEx = decltype(&RtlRbInsertNodeEx)(GetProcAddress(hNtdll, "RtlRbInsertNodeEx"));
411+
MmpGlobalDataPtr->MmpLdrEntry._RtlRbRemoveNode = decltype(&RtlRbRemoveNode)(GetProcAddress(hNtdll, "RtlRbRemoveNode"));
412+
396413
MmpGlobalDataPtr->MmpLdrEntry.LdrpHashTable = FindLdrpHashTable();
397414

398415
MmpGlobalDataPtr->MmpInvertedFunctionTable.LdrpInvertedFunctionTable = FindLdrpInvertedFunctionTable();

MemoryModule/LdrEntry.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,19 @@ BOOL NTAPI RtlInitializeLdrDataTableEntry(
120120
}
121121

122122
switch (MmpGlobalDataPtr->WindowsVersion) {
123+
case WINDOWS_VERSION::win11: {
124+
auto entry = (PLDR_DATA_TABLE_ENTRY_WIN11)LdrEntry;
125+
entry->CheckSum = headers->OptionalHeader.CheckSum;
126+
}
127+
123128
case WINDOWS_VERSION::win10:
124129
case WINDOWS_VERSION::win10_1:
125130
case WINDOWS_VERSION::win10_2: {
126131
auto entry = (PLDR_DATA_TABLE_ENTRY_WIN10)LdrEntry;
127132
entry->ReferenceCount = 1;
128133
}
129134
case WINDOWS_VERSION::win8:
130-
case WINDOWS_VERSION::win8_1: {
135+
case WINDOWS_VERSION::winBlue: {
131136
auto entry = (PLDR_DATA_TABLE_ENTRY_WIN8)LdrEntry;
132137
const static bool IsWin8 = RtlIsWindowsVersionInScope(6, 2, 0, 6, 3, -1);
133138
NtQuerySystemTime(&entry->LoadTime);
@@ -137,9 +142,7 @@ BOOL NTAPI RtlInitializeLdrDataTableEntry(
137142
if (!NT_SUCCESS(RtlInsertModuleBaseAddressIndexNode(LdrEntry, BaseAddress)))return FALSE;
138143
if (!(entry->DdagNode = (decltype(entry->DdagNode))
139144
RtlAllocateHeap(heap, HEAP_ZERO_MEMORY, IsWin8 ? sizeof(_LDR_DDAG_NODE_WIN8) : sizeof(_LDR_DDAG_NODE))))return FALSE;
140-
//RtlInitializeListEntry(&entry->NodeModuleLink);
141-
//RtlInitializeListEntry(&entry->DdagNode->Modules);
142-
//RtlInitializeSingleEntry(&entry->DdagNode->CondenseLink);
145+
143146
entry->NodeModuleLink.Flink = &entry->DdagNode->Modules;
144147
entry->NodeModuleLink.Blink = &entry->DdagNode->Modules;
145148
entry->DdagNode->Modules.Flink = &entry->NodeModuleLink;
@@ -198,7 +201,7 @@ BOOL NTAPI RtlFreeLdrDataTableEntry(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry) {
198201
case WINDOWS_VERSION::win10_1:
199202
case WINDOWS_VERSION::win10_2:
200203
case WINDOWS_VERSION::win8:
201-
case WINDOWS_VERSION::win8_1: {
204+
case WINDOWS_VERSION::winBlue: {
202205
auto entry = (PLDR_DATA_TABLE_ENTRY_WIN10)LdrEntry;
203206
RtlFreeDependencies(entry);
204207
RtlFreeHeap(heap, 0, entry->DdagNode);
@@ -274,20 +277,17 @@ VOID NTAPI RtlRbInsertNodeEx(
274277
_In_ PRTL_BALANCED_NODE Parent,
275278
_In_ BOOLEAN Right,
276279
_Out_ PRTL_BALANCED_NODE Node) {
277-
static decltype(&RtlRbInsertNodeEx)_RtlRbInsertNodeEx = decltype(_RtlRbInsertNodeEx)(RtlGetNtProcAddress("RtlRbInsertNodeEx"));
278-
279280
RtlZeroMemory(Node, sizeof(*Node));
280281

281-
if (!_RtlRbInsertNodeEx)return;
282-
return _RtlRbInsertNodeEx(Tree, Parent, Right, Node);
282+
if (!MmpGlobalDataPtr->MmpLdrEntry._RtlRbInsertNodeEx)return;
283+
return MmpGlobalDataPtr->MmpLdrEntry._RtlRbInsertNodeEx(Tree, Parent, Right, Node);
283284
}
284285

285286
VOID NTAPI RtlRbRemoveNode(
286287
_In_ PRTL_RB_TREE Tree,
287288
_In_ PRTL_BALANCED_NODE Node) {
288-
static decltype(&RtlRbRemoveNode)_RtlRbRemoveNode = decltype(_RtlRbRemoveNode)(RtlGetNtProcAddress("RtlRbRemoveNode"));
289-
if (!_RtlRbRemoveNode)return;
290-
return _RtlRbRemoveNode(Tree, Node);
289+
if (!MmpGlobalDataPtr->MmpLdrEntry._RtlRbRemoveNode)return;
290+
return MmpGlobalDataPtr->MmpLdrEntry._RtlRbRemoveNode(Tree, Node);
291291
}
292292

293293
PLDR_DATA_TABLE_ENTRY NTAPI RtlFindLdrTableEntryByHandle(_In_ PVOID BaseAddress) {
@@ -317,15 +317,15 @@ PLDR_DATA_TABLE_ENTRY NTAPI RtlFindLdrTableEntryByBaseName(_In_z_ PCWSTR BaseNam
317317
return nullptr;
318318
}
319319

320-
ULONG NTAPI LdrHashEntry(_In_ UNICODE_STRING& str, _In_ BOOL _xor) {
320+
ULONG NTAPI LdrHashEntry(_In_ UNICODE_STRING& DllBaseName, _In_ BOOL ToIndex) {
321321
ULONG result = 0;
322322
if (RtlIsWindowsVersionOrGreater(6, 2, 0)) {
323-
RtlHashUnicodeString(&str, TRUE, HASH_STRING_ALGORITHM_DEFAULT, &result);
323+
RtlHashUnicodeString(&DllBaseName, TRUE, HASH_STRING_ALGORITHM_DEFAULT, &result);
324324
}
325325
else {
326-
for (USHORT i = 0; i < (str.Length / sizeof(wchar_t)); ++i)
327-
result += 0x1003F * RtlUpcaseUnicodeChar(str.Buffer[i]);
326+
for (USHORT i = 0; i < (DllBaseName.Length / sizeof(wchar_t)); ++i)
327+
result += 0x1003F * RtlUpcaseUnicodeChar(DllBaseName.Buffer[i]);
328328
}
329-
if (_xor)result &= (LDR_HASH_TABLE_ENTRIES - 1);
329+
if (ToIndex)result &= (LDR_HASH_TABLE_ENTRIES - 1);
330330
return result;
331331
}

MemoryModule/LdrEntry.h

Lines changed: 13 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ typedef struct _LDR_DATA_TABLE_ENTRY_WIN8 {
199199
}LDR_DATA_TABLE_ENTRY_WIN8, * PLDR_DATA_TABLE_ENTRY_WIN8;
200200

201201
//6.3.9600 Windows 8.1 | 2012R2 RTM | 2012R2 Update 1
202-
typedef struct _LDR_DATA_TABLE_ENTRY_WIN8_1 :public _LDR_DATA_TABLE_ENTRY_WIN8 {
202+
typedef struct _LDR_DATA_TABLE_ENTRY_WINBLUE :public _LDR_DATA_TABLE_ENTRY_WIN8 {
203203
ULONG ImplicitPathOptions;
204-
}LDR_DATA_TABLE_ENTRY_WIN8_1, * PLDR_DATA_TABLE_ENTRY_WIN8_1;
204+
}LDR_DATA_TABLE_ENTRY_WINBLUE, * PLDR_DATA_TABLE_ENTRY_WINBLUE;
205205

206206
//10.0.10240 Windows 10 | 2016 1507 Threshold 1
207207
//10.0.10586 Windows 10 | 2016 1511 Threshold 2
@@ -280,69 +280,18 @@ typedef struct _LDR_DATA_TABLE_ENTRY_WIN10_1 :public _LDR_DATA_TABLE_ENTRY_WIN10
280280
//10.0.18362 Windows 10 | 2016 1903 19H1 (May 2019 Update) | 2016 1909 19H2 (November 2019 Update)
281281
//10.0.19041 Windows 10 | 2016 2004 20H1 (May 2020 Update)
282282
//10.0.19042 Windows 10 | 2016 2009 20H2 (October 2020 Update)
283-
typedef struct _LDR_DATA_TABLE_ENTRY_WIN10_2 {
284-
_LIST_ENTRY InLoadOrderLinks; //0x0
285-
_LIST_ENTRY InMemoryOrderLinks; //0x10
286-
_LIST_ENTRY InInitializationOrderLinks; //0x20
287-
VOID* DllBase; //0x30
288-
VOID* EntryPoint; //0x38
289-
ULONG SizeOfImage; //0x40
290-
_UNICODE_STRING FullDllName; //0x48
291-
_UNICODE_STRING BaseDllName; //0x58
292-
union {
293-
UCHAR FlagGroup[4]; //0x68
294-
ULONG Flags; //0x68
295-
struct {
296-
ULONG PackagedBinary : 1; //0x68
297-
ULONG MarkedForRemoval : 1; //0x68
298-
ULONG ImageDll : 1; //0x68
299-
ULONG LoadNotificationsSent : 1; //0x68
300-
ULONG TelemetryEntryProcessed : 1; //0x68
301-
ULONG ProcessStaticImport : 1; //0x68
302-
ULONG InLegacyLists : 1; //0x68
303-
ULONG InIndexes : 1; //0x68
304-
ULONG ShimDll : 1; //0x68
305-
ULONG InExceptionTable : 1; //0x68
306-
ULONG ReservedFlags1 : 2; //0x68
307-
ULONG LoadInProgress : 1; //0x68
308-
ULONG LoadConfigProcessed : 1; //0x68
309-
ULONG EntryProcessed : 1; //0x68
310-
ULONG ProtectDelayLoad : 1; //0x68
311-
ULONG ReservedFlags3 : 2; //0x68
312-
ULONG DontCallForThreads : 1; //0x68
313-
ULONG ProcessAttachCalled : 1; //0x68
314-
ULONG ProcessAttachFailed : 1; //0x68
315-
ULONG CorDeferredValidate : 1; //0x68
316-
ULONG CorImage : 1; //0x68
317-
ULONG DontRelocate : 1; //0x68
318-
ULONG CorILOnly : 1; //0x68
319-
ULONG ReservedFlags5 : 3; //0x68
320-
ULONG Redirected : 1; //0x68
321-
ULONG ReservedFlags6 : 2; //0x68
322-
ULONG CompatDatabaseProcessed : 1; //0x68
323-
};
324-
};
325-
USHORT ObsoleteLoadCount; //0x6c
326-
USHORT TlsIndex; //0x6e
327-
_LIST_ENTRY HashLinks; //0x70
328-
ULONG TimeDateStamp; //0x80
329-
_ACTIVATION_CONTEXT* EntryPointActivationContext; //0x88
330-
VOID* Lock; //0x90
331-
_LDR_DDAG_NODE* DdagNode; //0x98
332-
_LIST_ENTRY NodeModuleLink; //0xa0
333-
VOID* LoadContext; //0xb0
334-
VOID* ParentDllBase; //0xb8
335-
VOID* SwitchBackContext; //0xc0
336-
_RTL_BALANCED_NODE BaseAddressIndexNode; //0xc8
337-
_RTL_BALANCED_NODE MappingInfoIndexNode; //0xe0
338-
ULONGLONG OriginalBase; //0xf8
339-
_LARGE_INTEGER LoadTime; //0x100
340-
ULONG BaseNameHashValue; //0x108
341-
_LDR_DLL_LOAD_REASON LoadReason; //0x10c
342-
ULONG ImplicitPathOptions; //0x110
343-
ULONG ReferenceCount; //0x114
283+
typedef struct _LDR_DATA_TABLE_ENTRY_WIN10_2 :LDR_DATA_TABLE_ENTRY_WIN10 {
344284
ULONG DependentLoadFlags; //0x118
345285
UCHAR SigningLevel; //0x11c
346286
}LDR_DATA_TABLE_ENTRY_WIN10_2, * PLDR_DATA_TABLE_ENTRY_WIN10_2;
347287

348-
ULONG NTAPI LdrHashEntry(_In_ UNICODE_STRING& str, _In_ BOOL _xor = TRUE);
288+
//10.0.22000 Windows 11 Insider Preview (Jun 2021)
289+
//10.0.22000 Windows 11 21H2 (RTM)
290+
//10.0.22621 Windows 11 22H2 (2022 Update)
291+
typedef struct _LDR_DATA_TABLE_ENTRY_WIN11 :LDR_DATA_TABLE_ENTRY_WIN10_2 {
292+
ULONG CheckSum; //0x120
293+
VOID* ActivePatchImageBase; //0x128
294+
LDR_HOT_PATCH_STATE HotPatchState; //0x130
295+
}LDR_DATA_TABLE_ENTRY_WIN11, * PLDR_DATA_TABLE_ENTRY_WIN11;
296+
297+
ULONG NTAPI LdrHashEntry(_In_ UNICODE_STRING& DllBaseName, _In_ BOOL ToIndex = TRUE);

MemoryModule/Loader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ NTSTATUS NTAPI LdrUnloadDllMemory(_In_ HMEMORYMODULE BaseAddress) {
256256
if (!(count & ~1)) {
257257
module->underUnload = true;
258258
if (module->initialized) {
259-
PDLL_STARTUP_ROUTINE((LPVOID)(module->codeBase + headers->OptionalHeader.AddressOfEntryPoint))(
259+
PLDR_INIT_ROUTINE((LPVOID)(module->codeBase + headers->OptionalHeader.AddressOfEntryPoint))(
260260
(HINSTANCE)module->codeBase,
261261
DLL_PROCESS_DETACH,
262262
0

MemoryModule/MmpGlobalData.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ typedef struct _MMP_INVERTED_FUNCTION_TABLE_DATA {
1414
//LdrEntry.cpp
1515
typedef struct _MMP_LDR_ENTRY_DATA {
1616
PLIST_ENTRY LdrpHashTable;
17+
18+
decltype(&RtlRbInsertNodeEx)_RtlRbInsertNodeEx;
19+
decltype(&RtlRbRemoveNode)_RtlRbRemoveNode;
1720
}MMP_LDR_ENTRY_DATA, * PMMP_LDR_ENTRY_DATA;
1821

1922
//MmpTls.cpp
@@ -65,10 +68,11 @@ typedef enum class _WINDOWS_VERSION :BYTE {
6568
vista,
6669
win7,
6770
win8,
68-
win8_1,
71+
winBlue,
6972
win10,
7073
win10_1,
7174
win10_2,
75+
win11,
7276
invalid
7377
}WINDOWS_VERSION;
7478

MemoryModule/Utils.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ BOOL NTAPI LdrpCallInitializers(PMEMORYMODULE module, DWORD dwReason) {
138138
if (headers->OptionalHeader.AddressOfEntryPoint) {
139139
__try {
140140
// notify library about attaching to process
141-
if (((PDLL_STARTUP_ROUTINE)(module->codeBase + headers->OptionalHeader.AddressOfEntryPoint))((HINSTANCE)module->codeBase, dwReason, 0)) {
141+
if (((PLDR_INIT_ROUTINE)(module->codeBase + headers->OptionalHeader.AddressOfEntryPoint))((HINSTANCE)module->codeBase, dwReason, 0)) {
142142
module->initialized = TRUE;
143143
return TRUE;
144144
}
@@ -311,10 +311,6 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
311311
return result;
312312
}
313313

314-
FARPROC NTAPI RtlGetNtProcAddress(LPCSTR func_name) {
315-
return GetProcAddress(GetModuleHandleA("ntdll.dll"), func_name);
316-
}
317-
318314
BOOLEAN NTAPI VirtualAccessCheckNoException(LPCVOID pBuffer, size_t size, ACCESS_MASK protect) {
319315
if (size) {
320316
MEMORY_BASIC_INFORMATION mbi{};

MemoryModule/Utils.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ NTSTATUS NTAPI RtlFindMemoryBlockFromModuleSection(
2626
_Inout_ PSEARCH_CONTEXT SearchContext
2727
);
2828

29-
typedef BOOL(WINAPI* PDLL_STARTUP_ROUTINE)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);
30-
3129
NTSTATUS NTAPI RtlResolveDllNameUnicodeString(
3230
_In_opt_ PCWSTR DllName,
3331
_In_opt_ PCWSTR DllFullName,
@@ -44,8 +42,6 @@ BOOLEAN NTAPI RtlIsValidImageBuffer(
4442
_Out_opt_ size_t* Size
4543
);
4644

47-
FARPROC NTAPI RtlGetNtProcAddress(LPCSTR func_name);
48-
4945
BOOLEAN NTAPI VirtualAccessCheck(LPCVOID pBuffer, size_t size, ACCESS_MASK protect);
5046
BOOLEAN NTAPI VirtualAccessCheckNoException(LPCVOID pBuffer, size_t size, ACCESS_MASK protect);
5147
#define ProbeForRead(pBuffer, size) VirtualAccessCheck(pBuffer, size, PAGE_READONLY | PAGE_READWRITE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE)

test/test.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,22 @@ int test() {
4949
}
5050

5151
int main() {
52-
test();
52+
if (MmpGlobalDataPtr->WindowsVersion == WINDOWS_VERSION::win11) {
53+
auto head = &NtCurrentPeb()->Ldr->InLoadOrderModuleList;
54+
auto entry = head->Flink;
55+
while (entry != head) {
56+
PLDR_DATA_TABLE_ENTRY_WIN11 __entry = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY_WIN11, InLoadOrderLinks);
57+
wprintf(L"%s\t0x%08X, 0x%08X, 0x%p, %d\n",
58+
__entry->BaseDllName.Buffer,
59+
__entry->CheckSum,
60+
RtlImageNtHeader(__entry->DllBase)->OptionalHeader.CheckSum,
61+
__entry->ActivePatchImageBase,
62+
__entry->HotPatchState
63+
);
64+
65+
entry = entry->Flink;
66+
}
67+
}
68+
5369
return 0;
5470
}

0 commit comments

Comments
 (0)