Reactos

[AVRF] Hook up debug functions, add noisy stub for AVrfpGetStackTraceAddress

+88 -12
+1 -1
dll/ntdll/ldr/ldrinit.c
··· 1517 1517 /* Call AVRF if necessary */ 1518 1518 if (Peb->NtGlobalFlag & (FLG_APPLICATION_VERIFIER | FLG_HEAP_PAGE_ALLOCS)) 1519 1519 { 1520 - Status = LdrpInitializeApplicationVerifierPackage(KeyHandle, Peb, TRUE, FALSE); 1520 + Status = LdrpInitializeApplicationVerifierPackage(KeyHandle, Peb, FALSE, FALSE); 1521 1521 if (!NT_SUCCESS(Status)) 1522 1522 { 1523 1523 DPRINT1("AVRF: LdrpInitializeApplicationVerifierPackage failed with %08X\n", Status);
+69 -9
dll/ntdll/ldr/verifier.c
··· 3 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 4 * PURPOSE: Verifier support routines 5 5 * COPYRIGHT: Copyright 2011 Aleksey Bragin (aleksey@reactos.org) 6 - * Copyright 2018 Mark Jansen (mark.jansen@reactos.org) 6 + * Copyright 2018-2025 Mark Jansen (mark.jansen@reactos.org) 7 7 */ 8 8 9 9 ··· 12 12 13 13 #define NDEBUG 14 14 #include <debug.h> 15 + 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); 15 19 16 20 extern PLDR_DATA_TABLE_ENTRY LdrpImageEntry; 17 21 ULONG AVrfpVerifierFlags = 0; ··· 355 359 RtlLeaveCriticalSection(&AVrfpVerifierLock); 356 360 } 357 361 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 + } 358 387 359 388 VOID 360 389 NTAPI ··· 480 509 } 481 510 } 482 511 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 + 483 547 NTSTATUS 484 548 NTAPI 485 549 AVrfpLoadAndInitializeProvider(PVERIFIER_PROVIDER Provider) 486 550 { 487 551 WCHAR StringBuffer[MAX_PATH + 11]; 488 552 UNICODE_STRING DllPath; 489 - PRTL_VERIFIER_PROVIDER_DESCRIPTOR Descriptor; 553 + PRTL_VERIFIER_PROVIDER_DESCRIPTOR Descriptor = NULL; 490 554 PIMAGE_NT_HEADERS ImageNtHeader; 491 555 NTSTATUS Status; 492 556 ··· 544 608 Descriptor->VerifierFlags = AVrfpVerifierFlags; 545 609 Descriptor->VerifierDebug = AVrfpDebug; 546 610 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; 554 614 Status = STATUS_SUCCESS; 555 615 } 556 616 else
+5
modules/rostests/apitests/rtl/ldrstubs.c
··· 15 15 { 16 16 } 17 17 18 + VOID NTAPI 19 + AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize) 20 + { 21 + /* Stub for linking against rtl */ 22 + }
+8
ntoskrnl/rtl/misc.c
··· 222 222 } 223 223 #endif 224 224 225 + VOID NTAPI 226 + AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize) 227 + { 228 + /* Stub for linking against rtl */ 229 + } 230 + 231 + 232 + 225 233 /* EOF */
+5 -2
sdk/lib/rtl/heappage.c
··· 202 202 BOOLEAN NTAPI 203 203 RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot, ULONG Flags, PVOID BaseAddress); 204 204 205 + /* verifier.c */ 206 + VOID NTAPI 207 + AVrfInternalHeapFreeNotification(PVOID AllocationBase, SIZE_T AllocationSize); 208 + 205 209 206 210 VOID NTAPI 207 211 RtlpDphRaiseException(NTSTATUS Status) ··· 1712 1716 } 1713 1717 } 1714 1718 1715 - /* FIXME: Call AV notification */ 1716 - //AVrfInternalHeapFreeNotification(); 1719 + AVrfInternalHeapFreeNotification(Node->pUserAllocation, Node->nUserRequestedSize); 1717 1720 1718 1721 /* Go to the next node */ 1719 1722 Ptr = RtlEnumerateGenericTableAvl(&DphRoot->BusyNodesTable, FALSE);