Rémi Bernon : ntdll: Split RtlSizeHeap to a separate heap_size helper.
Alexandre Julliard
julliard at winehq.org
Thu May 12 15:55:50 CDT 2022
Module: wine
Branch: master
Commit: 1c873e87194ebb7b0870726beb9b1127f8d84684
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1c873e87194ebb7b0870726beb9b1127f8d84684
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Thu Apr 28 01:33:23 2022 +0200
ntdll: Split RtlSizeHeap to a separate heap_size helper.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/heap.c | 71 +++++++++++++++++++++++--------------------------------
1 file changed, 30 insertions(+), 41 deletions(-)
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index 2d03cd59729..51567d0552b 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -1958,58 +1958,47 @@ BOOLEAN WINAPI RtlUnlockHeap( HANDLE heap )
}
-/***********************************************************************
- * RtlSizeHeap (NTDLL.@)
- *
- * Get the actual size of a memory block allocated from a Heap.
- *
- * PARAMS
- * heap [I] Heap that block was allocated from
- * flags [I] HEAP_ flags from "winnt.h"
- * ptr [I] Block to get the size of
- *
- * RETURNS
- * Success: The size of the block.
- * Failure: -1, heap or ptr are invalid.
- *
- * NOTES
- * The size may be bigger than what was passed to RtlAllocateHeap().
- */
-SIZE_T WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, const void *ptr )
+static NTSTATUS heap_size( HEAP *heap, const void *ptr, SIZE_T *size )
{
- SIZE_T ret;
- const ARENA_INUSE *pArena;
+ const ARENA_INUSE *block;
SUBHEAP *subheap;
- HEAP *heapPtr = HEAP_GetPtr( heap );
-
- if (!heapPtr)
- {
- RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_HANDLE );
- return ~(SIZE_T)0;
- }
-
- heap_lock( heapPtr, flags );
- pArena = (const ARENA_INUSE *)ptr - 1;
- if (!validate_block_pointer( heapPtr, &subheap, pArena ))
- {
- RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER );
- ret = ~(SIZE_T)0;
- }
- else if (!subheap)
+ block = (const ARENA_INUSE *)ptr - 1;
+ if (!validate_block_pointer( heap, &subheap, block )) return STATUS_INVALID_PARAMETER;
+ if (!subheap)
{
const ARENA_LARGE *large_arena = (const ARENA_LARGE *)ptr - 1;
- ret = large_arena->data_size;
+ *size = large_arena->data_size;
}
else
{
- ret = (pArena->size & ARENA_SIZE_MASK) - pArena->unused_bytes;
+ *size = (block->size & ARENA_SIZE_MASK) - block->unused_bytes;
}
- heap_unlock( heapPtr, flags );
+ return STATUS_SUCCESS;
+}
- TRACE("(%p,%08x,%p): returning %08lx\n", heap, flags, ptr, ret );
- return ret;
+/***********************************************************************
+ * RtlSizeHeap (NTDLL.@)
+ */
+SIZE_T WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, const void *ptr )
+{
+ SIZE_T size = ~(SIZE_T)0;
+ NTSTATUS status;
+ HEAP *heapPtr;
+
+ if (!(heapPtr = HEAP_GetPtr( heap )))
+ status = STATUS_INVALID_PARAMETER;
+ else
+ {
+ heap_lock( heapPtr, flags );
+ status = heap_size( heapPtr, ptr, &size );
+ heap_unlock( heapPtr, flags );
+ }
+
+ TRACE( "heap %p, flags %#x, ptr %p, return %#Ix, status %#x.\n", heap, flags, ptr, size, status );
+ heap_set_status( heapPtr, flags, status );
+ return size;
}
More information about the wine-cvs
mailing list