1 /*
2  * PROJECT:     ReactOS API tests
3  * LICENSE:     LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4  * PURPOSE:     Validate the apiset lookup in ApiSetResolveToHost
5  * COPYRIGHT:   Copyright 2024 Mark Jansen <mark.jansen@reactos.org>
6  */
7 
8 #include <ndk/umtypes.h>
9 #include <ndk/rtlfuncs.h>
10 #include <apitest.h>
11 #include "apisetsp.h"
12 
13 static void
resolve_single(PCUNICODE_STRING Apiset)14 resolve_single(PCUNICODE_STRING Apiset)
15 {
16     UNICODE_STRING Tmp = {0};
17     NTSTATUS Status = RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, Apiset, &Tmp);
18     ok_ntstatus(Status, STATUS_SUCCESS);
19 
20     BOOLEAN Resolved = FALSE;
21     UNICODE_STRING Result = {0};
22 
23     Status = ApiSetResolveToHost(~0u, &Tmp, &Resolved, &Result);
24     ok_ntstatus(Status, STATUS_SUCCESS);
25     ok_eq_bool(Resolved, TRUE);
26     ok(Result.Buffer != NULL, "Got NULL\n");
27 }
28 
29 static void
resolve_fail_single(PCUNICODE_STRING Apiset)30 resolve_fail_single(PCUNICODE_STRING Apiset)
31 {
32     UNICODE_STRING Tmp = {0};
33     NTSTATUS Status = RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, Apiset, &Tmp);
34     ok_ntstatus(Status, STATUS_SUCCESS);
35 
36     BOOLEAN Resolved = FALSE;
37     UNICODE_STRING Result = {0, 0, (PWSTR)0xbadbeef};
38 
39     Status = ApiSetResolveToHost(~0u, &Tmp, &Resolved, &Result);
40     ok_ntstatus(Status, STATUS_SUCCESS);
41     ok_eq_bool(Resolved, FALSE);
42     ok_ptr(Result.Buffer, (PWSTR)0xbadbeef);
43 }
44 
45 static void
test_single(PCUNICODE_STRING Apiset)46 test_single(PCUNICODE_STRING Apiset)
47 {
48     winetest_push_context("%S", Apiset->Buffer);
49     resolve_single(Apiset);
50     winetest_pop_context();
51 }
52 
53 static void
fail_single(PCUNICODE_STRING Apiset)54 fail_single(PCUNICODE_STRING Apiset)
55 {
56     winetest_push_context("%S", Apiset->Buffer);
57     resolve_fail_single(Apiset);
58     winetest_pop_context();
59 }
60 
61 
START_TEST(apisets)62 START_TEST(apisets)
63 {
64     // Ensure we can find some manually selected ones (both with and without extension):
65     UNICODE_STRING Console1 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Console-L1-1-0.dll");
66     UNICODE_STRING Console2 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Console-L1-1-0");
67     UNICODE_STRING Handle1 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Handle-L1-1-0.dll");
68     UNICODE_STRING Handle2 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Handle-L1-1-0");
69     UNICODE_STRING Heap1 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Heap-L1-1-0.dll");
70     UNICODE_STRING Heap2 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Heap-L1-1-0");
71 
72     test_single(&Console1);
73     test_single(&Console2);
74     test_single(&Handle1);
75     test_single(&Handle2);
76     test_single(&Heap1);
77     test_single(&Heap2);
78 
79     // Walk the entire table, to ensure we can find each entry
80     for (DWORD n = 0; n < g_ApisetsCount; ++n)
81     {
82         PCUNICODE_STRING Apiset = &g_Apisets[n].Name;
83         winetest_push_context("%ld: %S", n, Apiset->Buffer);
84         resolve_single(Apiset);
85         winetest_pop_context();
86     }
87 
88     UNICODE_STRING Fail1 = RTL_CONSTANT_STRING(L"");
89     UNICODE_STRING Fail2 = RTL_CONSTANT_STRING(L"api-");
90     UNICODE_STRING Fail3 = RTL_CONSTANT_STRING(L"ext");
91 
92     fail_single(&Fail1);
93     fail_single(&Fail2);
94     fail_single(&Fail3);
95 }
96