From dd1078cd1771e4e15571fd1ad89b4bbe6757dbd7 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Thu, 17 Aug 2017 11:42:13 +0000 Subject: [PATCH] [NTDLL_APITEST] Test unaligned pointers for NtOpenKey CORE-13689 svn path=/trunk/; revision=75588 --- rostests/apitests/ntdll/CMakeLists.txt | 1 + rostests/apitests/ntdll/NtOpenKey.c | 58 ++++++++++++++++++++++++++ rostests/apitests/ntdll/testlist.c | 2 + 3 files changed, 61 insertions(+) create mode 100644 rostests/apitests/ntdll/NtOpenKey.c diff --git a/rostests/apitests/ntdll/CMakeLists.txt b/rostests/apitests/ntdll/CMakeLists.txt index d4263edaa11..7a56d74a857 100644 --- a/rostests/apitests/ntdll/CMakeLists.txt +++ b/rostests/apitests/ntdll/CMakeLists.txt @@ -13,6 +13,7 @@ list(APPEND SOURCE NtLoadUnloadKey.c NtMapViewOfSection.c NtMutant.c + NtOpenKey.c NtOpenProcessToken.c NtOpenThreadToken.c NtProtectVirtualMemory.c diff --git a/rostests/apitests/ntdll/NtOpenKey.c b/rostests/apitests/ntdll/NtOpenKey.c new file mode 100644 index 00000000000..e5520fb07d7 --- /dev/null +++ b/rostests/apitests/ntdll/NtOpenKey.c @@ -0,0 +1,58 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory + * PURPOSE: Test for NtOpenKey data alignment + * PROGRAMMER: Mark Jansen (mark.jansen@reactos.org) + */ + +#include + +#include + + +#define TEST_STR L"\\Registry\\Machine\\SOFTWARE" + + + +START_TEST(NtOpenKey) +{ + OBJECT_ATTRIBUTES Object; + UNICODE_STRING String; + char GccShouldNotAlignThis[40 * 2]; + char GccShouldNotAlignThis2[20]; + PVOID Alias = GccShouldNotAlignThis + 1; + PVOID UnalignedKey = GccShouldNotAlignThis2 + 1; + + HANDLE KeyHandle; + NTSTATUS Status; + + memcpy(Alias, TEST_STR, sizeof(TEST_STR)); + + + RtlInitUnicodeString(&String, TEST_STR); + InitializeObjectAttributes(&Object, &String, OBJ_CASE_INSENSITIVE, NULL, NULL); + + Status = NtOpenKey(&KeyHandle, KEY_QUERY_VALUE, &Object); + ok_ntstatus(Status, STATUS_SUCCESS); + + if (!NT_SUCCESS(Status)) + return; + + NtClose(KeyHandle); + + String.Buffer = Alias; + ok_hex(((ULONG_PTR)String.Buffer) % 2, 1); + Status = NtOpenKey(&KeyHandle, KEY_QUERY_VALUE, &Object); + ok_ntstatus(Status, STATUS_DATATYPE_MISALIGNMENT); // FIXME: Later windows versions succeed here. + if (NT_SUCCESS(Status)) + NtClose(KeyHandle); + + RtlInitUnicodeString(&String, TEST_STR); + ok_hex(((ULONG_PTR)UnalignedKey) % 2, 1); + Status = NtOpenKey(UnalignedKey, KEY_QUERY_VALUE, &Object); + ok_ntstatus(Status, STATUS_SUCCESS); + if (NT_SUCCESS(Status)) + { + NtClose(*(HANDLE*)(UnalignedKey)); + } +} diff --git a/rostests/apitests/ntdll/testlist.c b/rostests/apitests/ntdll/testlist.c index 8b4de326f21..8b4f8f657d7 100644 --- a/rostests/apitests/ntdll/testlist.c +++ b/rostests/apitests/ntdll/testlist.c @@ -16,6 +16,7 @@ extern void func_NtFreeVirtualMemory(void); extern void func_NtLoadUnloadKey(void); extern void func_NtMapViewOfSection(void); extern void func_NtMutant(void); +extern void func_NtOpenKey(void); extern void func_NtOpenProcessToken(void); extern void func_NtOpenThreadToken(void); extern void func_NtProtectVirtualMemory(void); @@ -72,6 +73,7 @@ const struct test winetest_testlist[] = { "NtLoadUnloadKey", func_NtLoadUnloadKey }, { "NtMapViewOfSection", func_NtMapViewOfSection }, { "NtMutant", func_NtMutant }, + { "NtOpenKey", func_NtOpenKey }, { "NtOpenProcessToken", func_NtOpenProcessToken }, { "NtOpenThreadToken", func_NtOpenThreadToken }, { "NtProtectVirtualMemory", func_NtProtectVirtualMemory }, -- 2.17.1