[ros-diffs] [fireball] 50892: [RTL/DPH] - Implement ValidateHeap API for DPH. Fixes attempts to validate DPH as a normal heap.

fireball at svn.reactos.org fireball at svn.reactos.org
Thu Feb 24 12:59:52 UTC 2011


Author: fireball
Date: Thu Feb 24 12:59:52 2011
New Revision: 50892

URL: http://svn.reactos.org/svn/reactos?rev=50892&view=rev
Log:
[RTL/DPH]
- Implement ValidateHeap API for DPH. Fixes attempts to validate DPH as a normal heap.

Modified:
    trunk/reactos/lib/rtl/heap.c
    trunk/reactos/lib/rtl/heap.h
    trunk/reactos/lib/rtl/heappage.c

Modified: trunk/reactos/lib/rtl/heap.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heap.c?rev=50892&r1=50891&r2=50892&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/heap.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heap.c [iso-8859-1] Thu Feb 24 12:59:52 2011
@@ -3707,7 +3707,9 @@
     BOOLEAN HeapLocked = FALSE;
     BOOLEAN HeapValid;
 
-    // FIXME Check for special heap
+    /* Check for page heap */
+    if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
+        return RtlpDebugPageHeapValidate(HeapPtr, Flags, Block);
 
     /* Check signature */
     if (Heap->Signature != HEAP_SIGNATURE)

Modified: trunk/reactos/lib/rtl/heap.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heap.h?rev=50892&r1=50891&r2=50892&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/heap.h [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heap.h [iso-8859-1] Thu Feb 24 12:59:52 2011
@@ -435,6 +435,12 @@
                          ULONG UserFlagsReset,
                          ULONG UserFlagsSet);
 
+BOOLEAN
+NTAPI
+RtlpDebugPageHeapValidate(PVOID HeapPtr,
+                          ULONG Flags,
+                          PVOID Block);
+
 SIZE_T NTAPI
 RtlpPageHeapSize(HANDLE HeapPtr,
                  ULONG Flags,

Modified: trunk/reactos/lib/rtl/heappage.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heappage.c?rev=50892&r1=50891&r2=50892&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/heappage.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heappage.c [iso-8859-1] Thu Feb 24 12:59:52 2011
@@ -191,6 +191,10 @@
 VOID NTAPI
 RtlpDphReportCorruptedBlock(PDPH_HEAP_ROOT DphRoot, ULONG Reserved, PVOID Block, ULONG ValidationInfo);
 
+BOOLEAN NTAPI
+RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot, ULONG Flags, PVOID BaseAddress);
+
+
 VOID NTAPI
 RtlpDphRaiseException(NTSTATUS Status)
 {
@@ -2224,4 +2228,68 @@
     return Size;
 }
 
+BOOLEAN
+NTAPI
+RtlpDebugPageHeapValidate(PVOID HeapHandle,
+                          ULONG Flags,
+                          PVOID BaseAddress)
+{
+    PDPH_HEAP_ROOT DphRoot;
+    PDPH_HEAP_BLOCK Node = NULL;
+    BOOLEAN Valid = FALSE;
+
+    /* Get a pointer to the heap root */
+    DphRoot = RtlpDphPointerFromHandle(HeapHandle);
+    if (!DphRoot) return -1;
+
+    /* Add heap flags */
+    Flags |= DphRoot->HeapFlags;
+
+    /* Acquire the heap lock */
+    RtlpDphPreProcessing(DphRoot, Flags);
+
+    /* Find busy memory */
+    if (BaseAddress)
+        Node = RtlpDphFindBusyMemory(DphRoot, BaseAddress);
+
+    if (!Node)
+    {
+        /* This block was not found in page heap, or the request is to validate all normal heap */
+        Valid = RtlpDphNormalHeapValidate(DphRoot, Flags, BaseAddress);
+    }
+
+    /* Leave the heap lock */
+    RtlpDphPostProcessing(DphRoot);
+
+    /* Return result of a normal heap validation */
+    if (BaseAddress && !Node)
+        return Valid;
+
+    /* Otherwise return our own result */
+    if (!BaseAddress || Node) Valid = TRUE;
+
+    return Valid;
+}
+
+BOOLEAN
+NTAPI
+RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot,
+                          ULONG Flags,
+                          PVOID BaseAddress)
+{
+    PDPH_BLOCK_INFORMATION BlockInfo = (PDPH_BLOCK_INFORMATION)BaseAddress - 1;
+    if (!BaseAddress)
+    {
+        /* Validate all normal heap */
+        return RtlValidateHeap(DphRoot->NormalHeap, Flags, NULL);
+    }
+
+    // FIXME: Check is this a normal heap block
+    /*if (!RtlpDphIsNormalHeapBlock(DphRoot, BaseAddress, &ValidationInfo))
+    {
+    }*/
+
+    return RtlValidateHeap(DphRoot->NormalHeap, Flags, BlockInfo);
+}
+
 /* EOF */




More information about the Ros-diffs mailing list