2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for RtlReAllocateHeap
5 * PROGRAMMERS: Thomas Faber <thomas.faber@reactos.org>
9 #include <ndk/rtlfuncs.h>
18 PUCHAR Array
= Buffer
;
21 for (i
= 0; i
< Size
; i
++)
22 if (Array
[i
] != Value
)
24 trace("Expected %x, found %x at offset %lu\n", Value
, Array
[i
], (ULONG
)i
);
39 SIZE_T OldSize
= *OldSizePtr
;
41 RtlFillMemory(*Buffer
, OldSize
, 0x7a);
42 NewBuffer
= RtlReAllocateHeap(RtlGetProcessHeap(),
48 skip("RtlReAllocateHeap failed for size %lu (%s)\n", Size
, Action
);
52 ok_hex(RtlSizeHeap(RtlGetProcessHeap(), 0, NewBuffer
), Size
);
55 ok(CheckBuffer(NewBuffer
, OldSize
, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize
, Size
);
56 ok(CheckBuffer(NewBuffer
+ OldSize
, Size
- OldSize
, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx -> 0x%lx\n", OldSize
, Size
);
60 ok(CheckBuffer(NewBuffer
, Size
, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize
, Size
);
66 START_TEST(RtlReAllocateHeap
)
71 BOOLEAN Continue
= TRUE
;
78 Buffer
= RtlReAllocateHeap(RtlGetProcessHeap(),
82 ok(Buffer
== NULL
, "RtlReAllocateHeap succeeded for NULL\n");
84 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
86 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
91 skip("RtlAllocateHeap failed for size %lu\n", OldSize
);
94 ok(CheckBuffer(Buffer
, OldSize
, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx\n", OldSize
);
96 for (Size
= 0x78000; Size
< 0x90000 && Continue
; Size
+= 0x100)
98 Continue
= ReAllocBuffer(&Buffer
, Size
, &OldSize
, "growing");
102 for (Size
-= 0x100; Size
>= 0x78000 && Continue
; Size
-= 0x100)
104 Continue
= ReAllocBuffer(&Buffer
, Size
, &OldSize
, "shrinking");
106 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
108 /* Now make sure user flags/values get preserved */
110 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
111 HEAP_ZERO_MEMORY
| HEAP_SETTABLE_USER_VALUE
| HEAP_SETTABLE_USER_FLAG2
,
115 skip("RtlAllocateHeap failed for size %lu\n", OldSize
);
119 UserValue
= InvalidPointer
;
120 UserFlags
= 0x55555555;
121 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
126 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
127 ok(UserValue
== NULL
, "UserValue = %p\n", UserValue
);
128 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG2
, "UserFlags = %lx\n", UserFlags
);
130 Success
= RtlSetUserFlagsHeap(RtlGetProcessHeap(),
133 HEAP_SETTABLE_USER_FLAG1
| HEAP_SETTABLE_USER_FLAG2
,
134 HEAP_SETTABLE_USER_FLAG3
);
135 ok(Success
== TRUE
, "RtlSetUserFlagsHeap returned %u\n", Success
);
137 Success
= RtlSetUserValueHeap(RtlGetProcessHeap(),
141 ok(Success
== TRUE
, "RtlSetUserValueHeap returned %u\n", Success
);
143 UserValue
= InvalidPointer
;
144 UserFlags
= 0x55555555;
145 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
150 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
151 ok(UserValue
== &UserValue
, "UserValue = %p, expected %p\n", UserValue
, &UserValue
);
152 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG3
, "UserFlags = %lx\n", UserFlags
);
154 /* shrink (preserves flags) */
155 Buffer2
= RtlReAllocateHeap(RtlGetProcessHeap(),
156 HEAP_REALLOC_IN_PLACE_ONLY
| HEAP_SETTABLE_USER_FLAG2
,
159 ok(Buffer2
== Buffer
, "New Buffer is %p, expected %p\n", Buffer2
, Buffer
);
160 if (Buffer2
) Buffer
= Buffer2
;
161 UserValue
= InvalidPointer
;
162 UserFlags
= 0x55555555;
163 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
168 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
169 ok(UserValue
== &UserValue
, "UserValue = %p, expected %p\n", UserValue
, &UserValue
);
170 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG3
, "UserFlags = %lx\n", UserFlags
);
172 /* grow (overwrites flags) */
173 Buffer2
= RtlReAllocateHeap(RtlGetProcessHeap(),
174 HEAP_REALLOC_IN_PLACE_ONLY
| HEAP_SETTABLE_USER_FLAG1
,
177 ok(Buffer2
== Buffer
, "New Buffer is %p, expected %p\n", Buffer2
, Buffer
);
178 if (Buffer2
) Buffer
= Buffer2
;
179 UserValue
= InvalidPointer
;
180 UserFlags
= 0x55555555;
181 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
186 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
187 ok(UserValue
== &UserValue
, "UserValue = %p, expected %p\n", UserValue
, &UserValue
);
188 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG1
, "UserFlags = %lx\n", UserFlags
);
190 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);