|
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 ([email protected]) |
6 | | - * Copyright 2018 Mark Jansen ([email protected]) |
| 6 | + * Copyright 2018-2025 Mark Jansen ([email protected]) |
7 | 7 | */ |
8 | 8 |
|
9 | 9 |
|
|
13 | 13 | #define NDEBUG |
14 | 14 | #include <debug.h> |
15 | 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); |
| 19 | + |
16 | 20 | extern PLDR_DATA_TABLE_ENTRY LdrpImageEntry; |
17 | 21 | ULONG AVrfpVerifierFlags = 0; |
18 | 22 | WCHAR AVrfpVerifierDllsString[256] = { 0 }; |
@@ -355,6 +359,31 @@ AVrfDllUnloadNotification(IN PLDR_DATA_TABLE_ENTRY LdrEntry) |
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,13 +509,48 @@ AVrfpChainDuplicateThunks(VOID) |
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,13 +608,9 @@ AVrfpLoadAndInitializeProvider(PVERIFIER_PROVIDER Provider) |
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 |
|
0 commit comments