ntoskrnl/tests: Retrieve test global variables from a memory section.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
801d116733
commit
55a166d17e
|
@ -1427,7 +1427,7 @@
|
|||
@ stdcall -private ZwLockFile(long long ptr ptr ptr ptr ptr ptr long long) NtLockFile
|
||||
@ stdcall -private ZwLockVirtualMemory(long ptr ptr long) NtLockVirtualMemory
|
||||
@ stdcall ZwMakeTemporaryObject(long) NtMakeTemporaryObject
|
||||
@ stdcall -private ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
|
||||
@ stdcall ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
|
||||
@ stdcall -private ZwNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long) NtNotifyChangeDirectoryFile
|
||||
@ stdcall -private ZwNotifyChangeKey(long long ptr ptr ptr long long ptr long long) NtNotifyChangeKey
|
||||
@ stdcall ZwOpenDirectoryObject(ptr long ptr) NtOpenDirectoryObject
|
||||
|
@ -1441,7 +1441,7 @@
|
|||
@ stdcall -private ZwOpenProcess(ptr long ptr ptr) NtOpenProcess
|
||||
@ stdcall -private ZwOpenProcessToken(long long ptr) NtOpenProcessToken
|
||||
@ stdcall -private ZwOpenProcessTokenEx(long long long ptr) NtOpenProcessTokenEx
|
||||
@ stdcall -private ZwOpenSection(ptr long ptr) NtOpenSection
|
||||
@ stdcall ZwOpenSection(ptr long ptr) NtOpenSection
|
||||
@ stdcall -private ZwOpenSymbolicLinkObject(ptr long ptr) NtOpenSymbolicLinkObject
|
||||
@ stdcall -private ZwOpenThread(ptr long ptr ptr) NtOpenThread
|
||||
@ stdcall -private ZwOpenThreadToken(long long long ptr) NtOpenThreadToken
|
||||
|
@ -1517,7 +1517,7 @@
|
|||
@ stdcall -private ZwUnloadKey(ptr) NtUnloadKey
|
||||
@ stdcall -private ZwUnlockFile(long ptr ptr ptr ptr) NtUnlockFile
|
||||
@ stdcall -private ZwUnlockVirtualMemory(long ptr ptr long) NtUnlockVirtualMemory
|
||||
@ stdcall -private ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
|
||||
@ stdcall ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
|
||||
@ stdcall -private ZwWaitForMultipleObjects(long ptr long long ptr) NtWaitForMultipleObjects
|
||||
@ stdcall ZwWaitForSingleObject(long long ptr) NtWaitForSingleObject
|
||||
@ stdcall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile
|
||||
|
|
|
@ -1990,7 +1990,7 @@ static void test_dpc(void)
|
|||
KeRevertToUserAffinityThread();
|
||||
}
|
||||
|
||||
static void test_process_memory(const struct test_input *test_input)
|
||||
static void test_process_memory(const struct main_test_input *test_input)
|
||||
{
|
||||
NTSTATUS (WINAPI *pMmCopyVirtualMemory)(PEPROCESS fromprocess, void *fromaddress, PEPROCESS toprocess,
|
||||
void *toaddress, SIZE_T bufsize, KPROCESSOR_MODE mode, SIZE_T *copied);
|
||||
|
@ -2044,7 +2044,7 @@ static void test_process_memory(const struct test_input *test_input)
|
|||
win_skip("MmCopyVirtualMemory is not available.\n");
|
||||
}
|
||||
|
||||
if (!test_input->running_under_wine)
|
||||
if (!running_under_wine)
|
||||
{
|
||||
KeStackAttachProcess((PKPROCESS)process, &state);
|
||||
todo_wine ok(!strcmp(teststr, (char *)(base + test_input->teststr_offset)),
|
||||
|
@ -2107,7 +2107,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
|||
{
|
||||
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
|
||||
void *buffer = irp->AssociatedIrp.SystemBuffer;
|
||||
struct test_input *test_input = (struct test_input *)buffer;
|
||||
struct main_test_input *test_input = (struct main_test_input *)buffer;
|
||||
NTSTATUS status;
|
||||
|
||||
if (!buffer)
|
||||
|
@ -2115,10 +2115,6 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
|||
if (length < sizeof(failures))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
|
||||
running_under_wine = test_input->running_under_wine;
|
||||
winetest_debug = test_input->winetest_debug;
|
||||
winetest_report_success = test_input->winetest_report_success;
|
||||
|
||||
if ((status = winetest_init()))
|
||||
return status;
|
||||
|
||||
|
|
|
@ -38,11 +38,15 @@
|
|||
|
||||
static const char teststr[] = "Wine is not an emulator";
|
||||
|
||||
struct test_input
|
||||
struct test_data
|
||||
{
|
||||
int running_under_wine;
|
||||
int winetest_report_success;
|
||||
int winetest_debug;
|
||||
};
|
||||
|
||||
struct main_test_input
|
||||
{
|
||||
DWORD process_id;
|
||||
SIZE_T teststr_offset;
|
||||
ULONG64 *modified_value;
|
||||
|
|
|
@ -467,7 +467,6 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
|||
{
|
||||
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
|
||||
void *buffer = irp->AssociatedIrp.SystemBuffer;
|
||||
struct test_input *test_input = buffer;
|
||||
NTSTATUS status;
|
||||
|
||||
if (!buffer)
|
||||
|
@ -475,10 +474,6 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
|||
if (length < sizeof(failures))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
|
||||
running_under_wine = test_input->running_under_wine;
|
||||
winetest_debug = test_input->winetest_debug;
|
||||
winetest_report_success = test_input->winetest_report_success;
|
||||
|
||||
if ((status = winetest_init()))
|
||||
return status;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
* Copyright 2015 Sebastian Lackner
|
||||
* Copyright 2015 Michael Müller
|
||||
* Copyright 2015 Christian Costa
|
||||
* Copyright 2020-2021 Zebediah Figura for CodeWeavers
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -367,7 +368,7 @@ static ULONG64 modified_value;
|
|||
|
||||
static void main_test(void)
|
||||
{
|
||||
struct test_input *test_input;
|
||||
struct main_test_input *test_input;
|
||||
DWORD written, read;
|
||||
LONG new_failures;
|
||||
char buffer[512];
|
||||
|
@ -381,9 +382,6 @@ static void main_test(void)
|
|||
ok(okfile != INVALID_HANDLE_VALUE, "failed to create file, error %u\n", GetLastError());
|
||||
|
||||
test_input = heap_alloc( sizeof(*test_input) );
|
||||
test_input->running_under_wine = !strcmp(winetest_platform, "wine");
|
||||
test_input->winetest_report_success = winetest_report_success;
|
||||
test_input->winetest_debug = winetest_debug;
|
||||
test_input->process_id = GetCurrentProcessId();
|
||||
test_input->teststr_offset = (SIZE_T)((BYTE *)&teststr - (BYTE *)NtCurrentTeb()->Peb->ImageBaseAddress);
|
||||
test_input->modified_value = &modified_value;
|
||||
|
@ -1195,7 +1193,9 @@ START_TEST(ntoskrnl)
|
|||
WCHAR filename[MAX_PATH], filename2[MAX_PATH];
|
||||
struct testsign_context ctx;
|
||||
SC_HANDLE service, service2;
|
||||
struct test_data *data;
|
||||
BOOL ret, is_wow64;
|
||||
HANDLE mapping;
|
||||
DWORD written;
|
||||
|
||||
pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(GetModuleHandleA("ntdll"), "RtlDosPathNameToNtPathName_U");
|
||||
|
@ -1215,18 +1215,22 @@ START_TEST(ntoskrnl)
|
|||
if (!testsign_create_cert(&ctx))
|
||||
return;
|
||||
|
||||
mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
|
||||
0, sizeof(*data), "Global\\winetest_ntoskrnl_section");
|
||||
ok(!!mapping, "got error %u\n", GetLastError());
|
||||
data = MapViewOfFile(mapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 1024);
|
||||
data->running_under_wine = !strcmp(winetest_platform, "wine");
|
||||
data->winetest_report_success = winetest_report_success;
|
||||
data->winetest_debug = winetest_debug;
|
||||
|
||||
subtest("driver");
|
||||
if (!(service = load_driver(&ctx, filename, L"driver.dll", L"WineTestDriver")))
|
||||
{
|
||||
testsign_cleanup(&ctx);
|
||||
return;
|
||||
}
|
||||
goto out;
|
||||
|
||||
if (!start_driver(service, FALSE))
|
||||
{
|
||||
DeleteFileW(filename);
|
||||
testsign_cleanup(&ctx);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
service2 = load_driver(&ctx, filename2, L"driver2.dll", L"WineTestDriver2");
|
||||
|
||||
|
@ -1265,5 +1269,8 @@ START_TEST(ntoskrnl)
|
|||
|
||||
test_pnp_driver(&ctx);
|
||||
|
||||
out:
|
||||
testsign_cleanup(&ctx);
|
||||
UnmapViewOfFile(data);
|
||||
CloseHandle(mapping);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* Copyright 2015 Michael Müller
|
||||
* Copyright 2015 Christian Costa
|
||||
* Copyright 2020 Paul Gofman for CodeWeavers
|
||||
* Copyright 2020-2021 Zebediah Figura for CodeWeavers
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -51,13 +52,36 @@ static inline void WINAPIV kprintf(const char *format, ...)
|
|||
|
||||
static inline NTSTATUS winetest_init(void)
|
||||
{
|
||||
const struct test_data *data;
|
||||
SIZE_T size = sizeof(*data);
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
UNICODE_STRING string;
|
||||
IO_STATUS_BLOCK io;
|
||||
void *addr = NULL;
|
||||
HANDLE section;
|
||||
NTSTATUS ret;
|
||||
|
||||
RtlInitUnicodeString(&string, L"\\??\\C:\\windows\\winetest_ntoskrnl_okfile");
|
||||
RtlInitUnicodeString(&string, L"\\BaseNamedObjects\\winetest_ntoskrnl_section");
|
||||
/* OBJ_KERNEL_HANDLE is necessary for the file to be accessible from system threads */
|
||||
InitializeObjectAttributes(&attr, &string, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, NULL);
|
||||
if ((ret = ZwOpenSection(§ion, SECTION_MAP_READ, &attr)))
|
||||
return ret;
|
||||
|
||||
if ((ret = ZwMapViewOfSection(section, NtCurrentProcess(), &addr,
|
||||
0, 0, NULL, &size, ViewUnmap, 0, PAGE_READONLY)))
|
||||
{
|
||||
ZwClose(section);
|
||||
return ret;
|
||||
}
|
||||
data = addr;
|
||||
running_under_wine = data->running_under_wine;
|
||||
winetest_debug = data->winetest_debug;
|
||||
winetest_report_success = data->winetest_report_success;
|
||||
|
||||
ZwUnmapViewOfSection(NtCurrentProcess(), addr);
|
||||
ZwClose(section);
|
||||
|
||||
RtlInitUnicodeString(&string, L"\\??\\C:\\windows\\winetest_ntoskrnl_okfile");
|
||||
return ZwOpenFile(&okfile, FILE_APPEND_DATA | SYNCHRONIZE, &attr, &io,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue