Skip to content

Commit 5821136

Browse files
committed
[AVRF] Hook up debug functions, add noisy stub for AVrfpGetStackTraceAddress
1 parent a7a504a commit 5821136

File tree

5 files changed

+88
-12
lines changed

5 files changed

+88
-12
lines changed

dll/ntdll/ldr/ldrinit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1517,7 +1517,7 @@ LdrpInitializeExecutionOptions(PUNICODE_STRING ImagePathName, PPEB Peb, PHANDLE
15171517
/* Call AVRF if necessary */
15181518
if (Peb->NtGlobalFlag & (FLG_APPLICATION_VERIFIER | FLG_HEAP_PAGE_ALLOCS))
15191519
{
1520-
Status = LdrpInitializeApplicationVerifierPackage(KeyHandle, Peb, TRUE, FALSE);
1520+
Status = LdrpInitializeApplicationVerifierPackage(KeyHandle, Peb, FALSE, FALSE);
15211521
if (!NT_SUCCESS(Status))
15221522
{
15231523
DPRINT1("AVRF: LdrpInitializeApplicationVerifierPackage failed with %08X\n", Status);

dll/ntdll/ldr/verifier.c

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
44
* PURPOSE: Verifier support routines
55
* COPYRIGHT: Copyright 2011 Aleksey Bragin ([email protected])
6-
* Copyright 2018 Mark Jansen ([email protected])
6+
* Copyright 2018-2025 Mark Jansen ([email protected])
77
*/
88

99

@@ -13,6 +13,10 @@
1313
#define NDEBUG
1414
#include <debug.h>
1515

16+
/* heappage.c */
17+
HANDLE NTAPI RtlpPageHeapCreate(ULONG Flags, PVOID Addr, SIZE_T TotalSize, SIZE_T CommitSize, PVOID Lock, PRTL_HEAP_PARAMETERS Parameters);
18+
PVOID NTAPI RtlpPageHeapDestroy(HANDLE HeapPtr);
19+
1620
extern PLDR_DATA_TABLE_ENTRY LdrpImageEntry;
1721
ULONG AVrfpVerifierFlags = 0;
1822
WCHAR AVrfpVerifierDllsString[256] = { 0 };
@@ -355,6 +359,31 @@ AVrfDllUnloadNotification(IN PLDR_DATA_TABLE_ENTRY LdrEntry)
355359
RtlLeaveCriticalSection(&AVrfpVerifierLock);
356360
}
357361

362+
VOID
363+
NTAPI
364+
AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize)
365+
{
366+
PLIST_ENTRY Entry;
367+
368+
if (!(NtCurrentPeb()->NtGlobalFlag & FLG_APPLICATION_VERIFIER))
369+
return;
370+
371+
RtlEnterCriticalSection(&AVrfpVerifierLock);
372+
for (Entry = AVrfpVerifierProvidersList.Flink; Entry != &AVrfpVerifierProvidersList; Entry = Entry->Flink)
373+
{
374+
PVERIFIER_PROVIDER Provider;
375+
RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK ProviderHeapFreeCallback;
376+
377+
Provider = CONTAINING_RECORD(Entry, VERIFIER_PROVIDER, ListEntry);
378+
379+
ProviderHeapFreeCallback = Provider->ProviderNtdllHeapFreeCallback;
380+
if (ProviderHeapFreeCallback)
381+
{
382+
ProviderHeapFreeCallback(AllocationBase, AllocationSize);
383+
}
384+
}
385+
RtlLeaveCriticalSection(&AVrfpVerifierLock);
386+
}
358387

359388
VOID
360389
NTAPI
@@ -480,13 +509,48 @@ AVrfpChainDuplicateThunks(VOID)
480509
}
481510
}
482511

512+
static
513+
PVOID
514+
NTAPI
515+
AVrfpGetStackTraceAddress(ULONG Arg0)
516+
{
517+
UNIMPLEMENTED;
518+
DbgBreakPoint();
519+
return NULL;
520+
}
521+
522+
static
523+
HANDLE
524+
NTAPI
525+
AVrfpDebugPageHeapCreate(ULONG Flags,
526+
PVOID Addr,
527+
SIZE_T TotalSize,
528+
SIZE_T CommitSize,
529+
PVOID Lock,
530+
PRTL_HEAP_PARAMETERS Parameters)
531+
{
532+
HANDLE hHeap;
533+
hHeap = RtlpPageHeapCreate(Flags, Addr, TotalSize, CommitSize, Lock, Parameters);
534+
DbgPrint("AVRF: DebugPageHeapCreate(Flags=%x, Addr=%p, TotalSize=%u, CommitSize=%u, Lock=%p, Parameters=%p) = %p\n",
535+
Flags, Addr, TotalSize, CommitSize, Lock, Parameters, hHeap);
536+
return hHeap;
537+
}
538+
539+
static
540+
PVOID
541+
AVrfpDebugPageHeapDestroy(HANDLE HeapPtr)
542+
{
543+
DbgPrint("AVRF: DebugPageHeapDestroy(HeapPtr=%p)\n", HeapPtr);
544+
return RtlpPageHeapDestroy(HeapPtr);
545+
}
546+
483547
NTSTATUS
484548
NTAPI
485549
AVrfpLoadAndInitializeProvider(PVERIFIER_PROVIDER Provider)
486550
{
487551
WCHAR StringBuffer[MAX_PATH + 11];
488552
UNICODE_STRING DllPath;
489-
PRTL_VERIFIER_PROVIDER_DESCRIPTOR Descriptor;
553+
PRTL_VERIFIER_PROVIDER_DESCRIPTOR Descriptor = NULL;
490554
PIMAGE_NT_HEADERS ImageNtHeader;
491555
NTSTATUS Status;
492556

@@ -544,13 +608,9 @@ AVrfpLoadAndInitializeProvider(PVERIFIER_PROVIDER Provider)
544608
Descriptor->VerifierFlags = AVrfpVerifierFlags;
545609
Descriptor->VerifierDebug = AVrfpDebug;
546610

547-
/* We don't have these yet */
548-
DPRINT1("AVRF: RtlpGetStackTraceAddress MISSING\n");
549-
DPRINT1("AVRF: RtlpDebugPageHeapCreate MISSING\n");
550-
DPRINT1("AVRF: RtlpDebugPageHeapDestroy MISSING\n");
551-
Descriptor->RtlpGetStackTraceAddress = NULL;
552-
Descriptor->RtlpDebugPageHeapCreate = NULL;
553-
Descriptor->RtlpDebugPageHeapDestroy = NULL;
611+
Descriptor->RtlpGetStackTraceAddress = AVrfpGetStackTraceAddress;
612+
Descriptor->RtlpDebugPageHeapCreate = AVrfpDebugPageHeapCreate;
613+
Descriptor->RtlpDebugPageHeapDestroy = AVrfpDebugPageHeapDestroy;
554614
Status = STATUS_SUCCESS;
555615
}
556616
else

modules/rostests/apitests/rtl/ldrstubs.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,8 @@ LdrpInitializeProcessCompat(PVOID pProcessActctx, PVOID* pOldShimData)
1515
{
1616
}
1717

18+
VOID NTAPI
19+
AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize)
20+
{
21+
/* Stub for linking against rtl */
22+
}

ntoskrnl/rtl/misc.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,12 @@ RtlPrefetchMemoryNonTemporal(IN PVOID Source,
222222
}
223223
#endif
224224

225+
VOID NTAPI
226+
AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize)
227+
{
228+
/* Stub for linking against rtl */
229+
}
230+
231+
232+
225233
/* EOF */

sdk/lib/rtl/heappage.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ RtlpDphReportCorruptedBlock(
202202
BOOLEAN NTAPI
203203
RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot, ULONG Flags, PVOID BaseAddress);
204204

205+
/* verifier.c */
206+
VOID NTAPI
207+
AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize);
208+
205209

206210
VOID NTAPI
207211
RtlpDphRaiseException(NTSTATUS Status)
@@ -1712,8 +1716,7 @@ RtlpPageHeapDestroy(HANDLE HeapPtr)
17121716
}
17131717
}
17141718

1715-
/* FIXME: Call AV notification */
1716-
//AVrfInternalHeapFreeNotification();
1719+
AVrfInternalHeapFreeNotification(Node->pUserAllocation, Node->nUserRequestedSize);
17171720

17181721
/* Go to the next node */
17191722
Ptr = RtlEnumerateGenericTableAvl(&DphRoot->BusyNodesTable, FALSE);

0 commit comments

Comments
 (0)