Rework apisets to use a table

This removes all fake apiset forwarders,
and handles apisets inside ntdll.
This is not 100% compatible with how windows does it, but it should be good enough for us.
This commit is contained in:
Mark Jansen 2024-01-04 23:02:22 +01:00
parent 116c0cd9a5
commit 24a56f89ab
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
246 changed files with 1910 additions and 9091 deletions

View file

@ -7,6 +7,7 @@ add_subdirectory(acpi)
add_subdirectory(advapi32)
add_subdirectory(advpack)
add_subdirectory(afd)
add_subdirectory(apisets)
add_subdirectory(apphelp)
add_subdirectory(appshim)
add_subdirectory(atl)

View file

@ -0,0 +1,6 @@
add_executable(apisets_apitest apisets.c testlist.c)
set_module_type(apisets_apitest win32cui)
target_link_libraries(apisets_apitest apisets)
add_importlibs(apisets_apitest msvcrt kernel32 ntdll)
add_rostests_file(TARGET apisets_apitest)

View file

@ -0,0 +1,95 @@
/*
* PROJECT: ReactOS API tests
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Validate the apiset lookup in ApiSetResolveToHost
* COPYRIGHT: Copyright 2024 Mark Jansen <mark.jansen@reactos.org>
*/
#include <ndk/umtypes.h>
#include <ndk/rtlfuncs.h>
#include <apitest.h>
#include "apisetsp.h"
static void
resolve_single(PCUNICODE_STRING Apiset)
{
UNICODE_STRING Tmp = {0};
NTSTATUS Status = RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, Apiset, &Tmp);
ok_ntstatus(Status, STATUS_SUCCESS);
BOOLEAN Resolved = FALSE;
UNICODE_STRING Result = {0};
Status = ApiSetResolveToHost(~0u, &Tmp, &Resolved, &Result);
ok_ntstatus(Status, STATUS_SUCCESS);
ok_eq_bool(Resolved, TRUE);
ok(Result.Buffer != NULL, "Got NULL\n");
}
static void
resolve_fail_single(PCUNICODE_STRING Apiset)
{
UNICODE_STRING Tmp = {0};
NTSTATUS Status = RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, Apiset, &Tmp);
ok_ntstatus(Status, STATUS_SUCCESS);
BOOLEAN Resolved = FALSE;
UNICODE_STRING Result = {0, 0, (PWSTR)0xbadbeef};
Status = ApiSetResolveToHost(~0u, &Tmp, &Resolved, &Result);
ok_ntstatus(Status, STATUS_SUCCESS);
ok_eq_bool(Resolved, FALSE);
ok_ptr(Result.Buffer, (PWSTR)0xbadbeef);
}
static void
test_single(PCUNICODE_STRING Apiset)
{
winetest_push_context("%S", Apiset->Buffer);
resolve_single(Apiset);
winetest_pop_context();
}
static void
fail_single(PCUNICODE_STRING Apiset)
{
winetest_push_context("%S", Apiset->Buffer);
resolve_fail_single(Apiset);
winetest_pop_context();
}
START_TEST(apisets)
{
// Ensure we can find some manually selected ones (both with and without extension):
UNICODE_STRING Console1 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Console-L1-1-0.dll");
UNICODE_STRING Console2 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Console-L1-1-0");
UNICODE_STRING Handle1 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Handle-L1-1-0.dll");
UNICODE_STRING Handle2 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Handle-L1-1-0");
UNICODE_STRING Heap1 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Heap-L1-1-0.dll");
UNICODE_STRING Heap2 = RTL_CONSTANT_STRING(L"api-MS-Win-Core-Heap-L1-1-0");
test_single(&Console1);
test_single(&Console2);
test_single(&Handle1);
test_single(&Handle2);
test_single(&Heap1);
test_single(&Heap2);
// Walk the entire table, to ensure we can find each entry
for (DWORD n = 0; n < g_ApisetsCount; ++n)
{
PCUNICODE_STRING Apiset = &g_Apisets[n].Name;
winetest_push_context("%ld: %S", n, Apiset->Buffer);
resolve_single(Apiset);
winetest_pop_context();
}
UNICODE_STRING Fail1 = RTL_CONSTANT_STRING(L"");
UNICODE_STRING Fail2 = RTL_CONSTANT_STRING(L"api-");
UNICODE_STRING Fail3 = RTL_CONSTANT_STRING(L"ext");
fail_single(&Fail1);
fail_single(&Fail2);
fail_single(&Fail3);
}

View file

@ -0,0 +1,11 @@
#define STANDALONE
#include <apitest.h>
extern void func_apisets(void);
const struct test winetest_testlist[] =
{
{ "apisets", func_apisets },
{ 0, 0 }
};