[NTDLL_APITEST] Test unaligned pointers for NtOpenKey
authorMark Jansen <mark.jansen@reactos.org>
Thu, 17 Aug 2017 11:42:13 +0000 (11:42 +0000)
committerMark Jansen <mark.jansen@reactos.org>
Thu, 17 Aug 2017 11:42:13 +0000 (11:42 +0000)
CORE-13689

svn path=/trunk/; revision=75588

rostests/apitests/ntdll/CMakeLists.txt
rostests/apitests/ntdll/NtOpenKey.c [new file with mode: 0644]
rostests/apitests/ntdll/testlist.c

index d4263ed..7a56d74 100644 (file)
@@ -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 (file)
index 0000000..e5520fb
--- /dev/null
@@ -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 <apitest.h>
+
+#include <ntndk.h>
+
+
+#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));
+    }
+}
index 8b4de32..8b4f8f6 100644 (file)
@@ -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 },