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>
17 PUCHAR Array
= Buffer
;
20 for (i
= 0; i
< Size
; i
++)
21 if (Array
[i
] != Value
)
23 trace("Expected %x, found %x at offset %lu\n", Value
, Array
[i
], (ULONG
)i
);
38 SIZE_T OldSize
= *OldSizePtr
;
40 RtlFillMemory(*Buffer
, OldSize
, 0x7a);
41 NewBuffer
= RtlReAllocateHeap(RtlGetProcessHeap(),
47 skip("RtlReAllocateHeap failed for size %lu (%s)\n", Size
, Action
);
51 ok_hex(RtlSizeHeap(RtlGetProcessHeap(), 0, NewBuffer
), Size
);
54 ok(CheckBuffer(NewBuffer
, OldSize
, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize
, Size
);
55 ok(CheckBuffer(NewBuffer
+ OldSize
, Size
- OldSize
, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx -> 0x%lx\n", OldSize
, Size
);
59 ok(CheckBuffer(NewBuffer
, Size
, 0x7a), "CheckBuffer failed at size 0x%lx -> 0x%lx\n", OldSize
, Size
);
65 START_TEST(RtlReAllocateHeap
)
70 BOOLEAN Continue
= TRUE
;
77 Buffer
= RtlReAllocateHeap(RtlGetProcessHeap(),
81 ok(Buffer
== NULL
, "RtlReAllocateHeap succeeded for NULL\n");
83 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
85 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
90 skip("RtlAllocateHeap failed for size %lu\n", OldSize
);
93 ok(CheckBuffer(Buffer
, OldSize
, 0), "HEAP_ZERO_MEMORY not respected for 0x%lx\n", OldSize
);
95 for (Size
= 0x78000; Size
< 0x90000 && Continue
; Size
+= 0x100)
97 Continue
= ReAllocBuffer(&Buffer
, Size
, &OldSize
, "growing");
101 for (Size
-= 0x100; Size
>= 0x78000 && Continue
; Size
-= 0x100)
103 Continue
= ReAllocBuffer(&Buffer
, Size
, &OldSize
, "shrinking");
105 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);
107 /* Now make sure user flags/values get preserved */
109 Buffer
= RtlAllocateHeap(RtlGetProcessHeap(),
110 HEAP_ZERO_MEMORY
| HEAP_SETTABLE_USER_VALUE
| HEAP_SETTABLE_USER_FLAG2
,
114 skip("RtlAllocateHeap failed for size %lu\n", OldSize
);
118 UserValue
= InvalidPointer
;
119 UserFlags
= 0x55555555;
120 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
125 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
126 ok(UserValue
== NULL
, "UserValue = %p\n", UserValue
);
127 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG2
, "UserFlags = %lx\n", UserFlags
);
129 Success
= RtlSetUserFlagsHeap(RtlGetProcessHeap(),
132 HEAP_SETTABLE_USER_FLAG1
| HEAP_SETTABLE_USER_FLAG2
,
133 HEAP_SETTABLE_USER_FLAG3
);
134 ok(Success
== TRUE
, "RtlSetUserFlagsHeap returned %u\n", Success
);
136 Success
= RtlSetUserValueHeap(RtlGetProcessHeap(),
140 ok(Success
== TRUE
, "RtlSetUserValueHeap returned %u\n", Success
);
142 UserValue
= InvalidPointer
;
143 UserFlags
= 0x55555555;
144 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
149 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
150 ok(UserValue
== &UserValue
, "UserValue = %p, expected %p\n", UserValue
, &UserValue
);
151 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG3
, "UserFlags = %lx\n", UserFlags
);
153 /* shrink (preserves flags) */
154 Buffer2
= RtlReAllocateHeap(RtlGetProcessHeap(),
155 HEAP_REALLOC_IN_PLACE_ONLY
| HEAP_SETTABLE_USER_FLAG2
,
158 ok(Buffer2
== Buffer
, "New Buffer is %p, expected %p\n", Buffer2
, Buffer
);
159 if (Buffer2
) Buffer
= Buffer2
;
160 UserValue
= InvalidPointer
;
161 UserFlags
= 0x55555555;
162 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
167 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
168 ok(UserValue
== &UserValue
, "UserValue = %p, expected %p\n", UserValue
, &UserValue
);
169 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG3
, "UserFlags = %lx\n", UserFlags
);
171 /* grow (overwrites flags) */
172 Buffer2
= RtlReAllocateHeap(RtlGetProcessHeap(),
173 HEAP_REALLOC_IN_PLACE_ONLY
| HEAP_SETTABLE_USER_FLAG1
,
176 ok(Buffer2
== Buffer
, "New Buffer is %p, expected %p\n", Buffer2
, Buffer
);
177 if (Buffer2
) Buffer
= Buffer2
;
178 UserValue
= InvalidPointer
;
179 UserFlags
= 0x55555555;
180 Success
= RtlGetUserInfoHeap(RtlGetProcessHeap(),
185 ok(Success
== TRUE
, "RtlGetUserInfoHeap returned %u\n", Success
);
186 ok(UserValue
== &UserValue
, "UserValue = %p, expected %p\n", UserValue
, &UserValue
);
187 ok(UserFlags
== HEAP_SETTABLE_USER_FLAG1
, "UserFlags = %lx\n", UserFlags
);
189 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
);