https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e8f9564c2079203d3e029…
commit e8f9564c2079203d3e0291cbe8889e2a935b7d1b
Author: Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Fri Dec 8 00:18:57 2023 +0100
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Sun Dec 17 22:28:40 2023 +0100
[NTDLL_APITEST] Add test for RtlGetProcessHeaps
---
modules/rostests/apitests/ntdll/CMakeLists.txt | 1 +
.../rostests/apitests/ntdll/RtlGetProcessHeaps.c | 48 ++++++++++++++++++++++
modules/rostests/apitests/ntdll/testlist.c | 2 +
3 files changed, 51 insertions(+)
diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt
b/modules/rostests/apitests/ntdll/CMakeLists.txt
index f48d4e53dec..abda236e613 100644
--- a/modules/rostests/apitests/ntdll/CMakeLists.txt
+++ b/modules/rostests/apitests/ntdll/CMakeLists.txt
@@ -79,6 +79,7 @@ list(APPEND SOURCE
RtlGetLengthWithoutTrailingPathSeperators.c
RtlGetLongestNtPathLength.c
RtlGetNtProductType.c
+ RtlGetProcessHeaps.c
RtlGetUnloadEventTrace.c
RtlHandle.c
RtlImageDirectoryEntryToData.c
diff --git a/modules/rostests/apitests/ntdll/RtlGetProcessHeaps.c
b/modules/rostests/apitests/ntdll/RtlGetProcessHeaps.c
new file mode 100644
index 00000000000..25b1959a41d
--- /dev/null
+++ b/modules/rostests/apitests/ntdll/RtlGetProcessHeaps.c
@@ -0,0 +1,48 @@
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: LGPL-2.1-or-later (
https://spdx.org/licenses/LGPL-2.1-or-later)
+ * PURPOSE: Test for RtlGetProcessHeaps
+ * COPYRIGHT: Copyright 2023 Mark Jansen <mark.jansen(a)reactos.org>
+ */
+
+#include "precomp.h"
+
+START_TEST(RtlGetProcessHeaps)
+{
+ HANDLE HeapArray[40] = {0};
+ ULONG MaxHeapArraySize = _countof(HeapArray);
+
+ // Can call it with NULL
+ ULONG InitialNumHeaps = RtlGetProcessHeaps(0, NULL);
+ ok(InitialNumHeaps > 0, "Expected at least one heap\n");
+ ok(InitialNumHeaps < MaxHeapArraySize, "Expected less heaps, got %lu\n",
InitialNumHeaps);
+
+ // Grab all heaps
+ ULONG NumHeaps = RtlGetProcessHeaps(MaxHeapArraySize, HeapArray);
+ ok_eq_ulong(NumHeaps, InitialNumHeaps);
+ for (ULONG n = 0; n < min(NumHeaps, MaxHeapArraySize); ++n)
+ {
+ ok(HeapArray[n] != NULL, "Heap[%lu] == NULL\n", n);
+ }
+
+ PVOID HeapPtr = RtlCreateHeap(HEAP_GROWABLE, NULL, 0, 0x10000, NULL, NULL);
+
+ memset(HeapArray, 0, sizeof(HeapArray));
+ NumHeaps = RtlGetProcessHeaps(MaxHeapArraySize, HeapArray);
+ ok_eq_ulong(InitialNumHeaps + 1, NumHeaps);
+ if (NumHeaps > 0 && NumHeaps <= MaxHeapArraySize)
+ {
+ // A new heap is added at the end
+ ok_ptr(HeapArray[NumHeaps - 1], HeapPtr);
+ }
+
+ RtlDestroyHeap(HeapPtr);
+
+ // Just ask for one heap, the number of heaps available is returned, but only one
heap ptr filled!
+ memset(HeapArray, 0xff, sizeof(HeapArray));
+ NumHeaps = RtlGetProcessHeaps(1, HeapArray);
+ ok_eq_ulong(NumHeaps, InitialNumHeaps);
+
+ ok_ptr(HeapArray[0], RtlGetProcessHeap()); // First item is the process heap
+ ok_ptr(HeapArray[1], INVALID_HANDLE_VALUE); // Next item is not touched!
+}
diff --git a/modules/rostests/apitests/ntdll/testlist.c
b/modules/rostests/apitests/ntdll/testlist.c
index 6d22f349692..a34b06f12d7 100644
--- a/modules/rostests/apitests/ntdll/testlist.c
+++ b/modules/rostests/apitests/ntdll/testlist.c
@@ -76,6 +76,7 @@ extern void func_RtlGetLengthWithoutLastFullDosOrNtPathElement(void);
extern void func_RtlGetLengthWithoutTrailingPathSeperators(void);
extern void func_RtlGetLongestNtPathLength(void);
extern void func_RtlGetNtProductType(void);
+extern void func_RtlGetProcessHeaps(void);
extern void func_RtlGetUnloadEventTrace(void);
extern void func_RtlHandle(void);
extern void func_RtlImageDirectoryEntryToData(void);
@@ -175,6 +176,7 @@ const struct test winetest_testlist[] =
{ "RtlGetLengthWithoutTrailingPathSeperators",
func_RtlGetLengthWithoutTrailingPathSeperators },
{ "RtlGetLongestNtPathLength", func_RtlGetLongestNtPathLength },
{ "RtlGetNtProductType", func_RtlGetNtProductType },
+ { "RtlGetProcessHeaps", func_RtlGetProcessHeaps },
{ "RtlGetUnloadEventTrace", func_RtlGetUnloadEventTrace },
{ "RtlHandle", func_RtlHandle },
{ "RtlImageDirectoryEntryToData", func_RtlImageDirectoryEntryToData },