2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for RtlpEnsureBufferSize
5 * PROGRAMMER: Mark Jansen
13 NTSTATUS (NTAPI
*pRtlpEnsureBufferSize
)(_In_ ULONG Flags
, _Inout_ PRTL_BUFFER Buffer
, _In_ SIZE_T RequiredSize
);
16 static BOOL
IsBlockFromHeap(HANDLE hHeap
, PVOID ptr
)
18 /* Use when this is implemented */
20 PROCESS_HEAP_ENTRY Entry
;
24 skip("Unable to lock heap\n");
29 while (!ret
&& HeapWalk(hHeap
, &Entry
))
31 if ((Entry
.wFlags
& PROCESS_HEAP_ENTRY_BUSY
) &&
32 (Entry
.lpData
== ptr
))
43 HANDLE hHeapSnap
= CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST
, GetCurrentProcessId());
45 if (hHeapSnap
== INVALID_HANDLE_VALUE
)
48 he
.dwSize
= sizeof(he
);
50 if (Heap32First(&he
, GetCurrentProcessId(), (DWORD_PTR
)hHeap
))
53 if ((DWORD_PTR
)ptr
>= he
.dwAddress
&& (DWORD_PTR
)ptr
<= (he
.dwAddress
+ he
.dwBlockSize
))
55 } while (!ret
&& Heap32Next(&he
));
58 CloseHandle(hHeapSnap
);
65 START_TEST(RtlpEnsureBufferSize
)
67 RTL_BUFFER Buffer
= { 0 };
73 HMODULE mod
= GetModuleHandleW(L
"ntdll.dll");
74 pRtlpEnsureBufferSize
= (void *)GetProcAddress(mod
, "RtlpEnsureBufferSize");
76 if (!pRtlpEnsureBufferSize
)
78 skip("No RtlpEnsureBufferSize\n");
82 memset(StaticBuf
, 0xba, sizeof(StaticBuf
));
83 RtlInitBuffer(&Buffer
, StaticBuf
, sizeof(StaticBuf
));
85 /* NULL buffer yields a failure */
86 ok_ntstatus(pRtlpEnsureBufferSize(0, NULL
, 0), STATUS_INVALID_PARAMETER
);
88 /* All flags other than '1' yield a failure */
89 for (Flag
= 2; Flag
; Flag
<<= 1)
91 ok_ntstatus(pRtlpEnsureBufferSize(Flag
, &Buffer
, 0), STATUS_INVALID_PARAMETER
);
92 ok_ptr(Buffer
.Buffer
, Buffer
.StaticBuffer
);
93 ok_int(Buffer
.Size
, Buffer
.StaticSize
);
94 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
95 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
96 RtlFreeBuffer(&Buffer
);
99 ok_ntstatus(pRtlpEnsureBufferSize(0, &Buffer
, 0), STATUS_SUCCESS
);
100 ok_ptr(Buffer
.Buffer
, Buffer
.StaticBuffer
);
101 ok_int(Buffer
.Size
, Buffer
.StaticSize
);
102 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
103 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
104 RtlFreeBuffer(&Buffer
);
106 ok_ntstatus(pRtlpEnsureBufferSize(0, &Buffer
, 1), STATUS_SUCCESS
);
107 ok_ptr(Buffer
.Buffer
, Buffer
.StaticBuffer
);
108 ok_int(Buffer
.Size
, Buffer
.StaticSize
);
109 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
110 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
111 RtlFreeBuffer(&Buffer
);
113 ok_ntstatus(pRtlpEnsureBufferSize(0, &Buffer
, 2), STATUS_SUCCESS
);
114 ok_ptr(Buffer
.Buffer
, Buffer
.StaticBuffer
);
115 ok_int(Buffer
.Size
, Buffer
.StaticSize
);
116 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
117 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
118 RtlFreeBuffer(&Buffer
);
120 ok_ntstatus(pRtlpEnsureBufferSize(0, &Buffer
, 3), STATUS_SUCCESS
);
121 ok_ptr(Buffer
.Buffer
, Buffer
.StaticBuffer
);
122 ok_int(Buffer
.Size
, Buffer
.StaticSize
);
123 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
124 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
125 RtlFreeBuffer(&Buffer
);
127 ok_ntstatus(pRtlpEnsureBufferSize(0, &Buffer
, 4), STATUS_SUCCESS
);
128 ok_ptr(Buffer
.Buffer
, Buffer
.StaticBuffer
);
129 ok_int(Buffer
.Size
, Buffer
.StaticSize
);
130 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
131 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
132 RtlFreeBuffer(&Buffer
);
134 /* Check that IsBlockFromHeap works! */
135 tmp
= RtlAllocateHeap(RtlGetProcessHeap(), 0, 5);
136 SkipHeapCheck
= (IsBlockFromHeap(RtlGetProcessHeap(), StaticBuf
) != FALSE
) ||
137 (IsBlockFromHeap(RtlGetProcessHeap(), tmp
) != TRUE
);
138 RtlFreeHeap(RtlGetProcessHeap(), 0, tmp
);
141 skip("Unable to verify the heap used\n");
143 /* Allocated is exactly what is asked for, not rounded to nearest whatever */
144 ok_ntstatus(pRtlpEnsureBufferSize(0, &Buffer
, 5), STATUS_SUCCESS
);
146 ok_int(IsBlockFromHeap(RtlGetProcessHeap(), Buffer
.Buffer
), TRUE
);
147 ok(!memcmp(Buffer
.Buffer
, StaticBuf
, sizeof(StaticBuf
)), "Expected First 4 bytes to be the same!\n");
148 ok_int(Buffer
.Size
, 5);
149 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
150 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
151 RtlFreeBuffer(&Buffer
);
153 ok_ntstatus(pRtlpEnsureBufferSize(RTL_SKIP_BUFFER_COPY
, &Buffer
, 5), STATUS_SUCCESS
);
155 ok_int(IsBlockFromHeap(RtlGetProcessHeap(), Buffer
.Buffer
), TRUE
);
156 ok(memcmp(Buffer
.Buffer
, StaticBuf
, sizeof(StaticBuf
)), "Expected First 4 bytes to be different!\n");
157 ok_int(Buffer
.Size
, 5);
158 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
159 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
160 RtlFreeBuffer(&Buffer
);
162 /* Size is not limited to UNICODE_STRING sizes */
163 ok_ntstatus(pRtlpEnsureBufferSize(RTL_SKIP_BUFFER_COPY
, &Buffer
, UNICODE_STRING_MAX_BYTES
+ 1), STATUS_SUCCESS
);
165 ok_int(IsBlockFromHeap(RtlGetProcessHeap(), Buffer
.Buffer
), TRUE
);
166 ok(memcmp(Buffer
.Buffer
, StaticBuf
, sizeof(StaticBuf
)), "Expected First 4 bytes to be different!\n");
167 ok_int(Buffer
.Size
, UNICODE_STRING_MAX_BYTES
+ 1);
168 ok_ptr(Buffer
.StaticBuffer
, StaticBuf
);
169 ok_int(Buffer
.StaticSize
, sizeof(StaticBuf
));
170 RtlFreeBuffer(&Buffer
);