Index: apitests/ntdll/RtlReAllocateHeap.c =================================================================== --- apitests/ntdll/RtlReAllocateHeap.c (revision 66959) +++ apitests/ntdll/RtlReAllocateHeap.c (working copy) @@ -29,12 +29,48 @@ return TRUE; } +static +BOOLEAN +ReallocBuffer( + PUCHAR* Buffer, + SIZE_T Size, + SIZE_T* OldSizePtr, + const char* Action + ) +{ + PUCHAR NewBuffer; + SIZE_T OldSize = *OldSizePtr; + RtlFillMemory(*Buffer, OldSize, 0x7a); + NewBuffer = RtlReAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + *Buffer, + Size); + if (!NewBuffer) + { + skip("RtlReAllocateHeap failed for size %lu (%s)\n", Size, Action); + return FALSE; + } + *Buffer = NewBuffer; + ok_hex(RtlSizeHeap(RtlGetProcessHeap(), 0, NewBuffer), Size); + if (OldSize < Size) + { + ok(CheckBuffer(NewBuffer, OldSize, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize, Size); + ok(CheckBuffer(NewBuffer + OldSize, Size - OldSize, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx -> 0x%lx\n", OldSize, Size); + } + else + { + ok(CheckBuffer(NewBuffer, Size, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize, Size); + } + *OldSizePtr = Size; + return TRUE; +} + START_TEST(RtlReAllocateHeap) { PUCHAR Buffer = NULL; - PUCHAR NewBuffer; SIZE_T OldSize = 0; SIZE_T Size; + BOOLEAN Continue = TRUE; OldSize = 0x100; Buffer = RtlReAllocateHeap(RtlGetProcessHeap(), @@ -55,24 +91,16 @@ } ok(CheckBuffer(Buffer, OldSize, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx\n", OldSize); - for (Size = 0x78000; Size < 0x90000; Size += 0x100) + for (Size = 0x78000; Size < 0x90000 && Continue; Size += 0x100) { - RtlFillMemory(Buffer, OldSize, 0x7a); - NewBuffer = RtlReAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - Buffer, - Size); - if (!NewBuffer) - { - skip("RtlReAllocateHeap failed for size %lu\n", Size); - break; - } - Buffer = NewBuffer; - ok_hex(RtlSizeHeap(RtlGetProcessHeap(), 0, Buffer), Size); - ok(CheckBuffer(Buffer, OldSize, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize, Size); - ok(CheckBuffer(Buffer + OldSize, Size - OldSize, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx -> 0x%lx\n", OldSize, Size); - OldSize = Size; + Continue = ReallocBuffer(&Buffer, Size, &OldSize, "growing"); } + + /* and back again */ + for (Size -= 0x100; Size >= 0x78000 && Continue; Size -= 0x100) + { + Continue = ReallocBuffer(&Buffer, Size, &OldSize, "shrinking"); + } RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); }