ntdll: Split RtlSizeHeap to a separate heap_size helper.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2022-04-28 01:33:23 +02:00 committed by Alexandre Julliard
parent 8dd04c77cb
commit 1c873e8719
1 changed files with 30 additions and 41 deletions

View File

@ -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;
}