[REACTOS] Fix 64 bit build (#465)
[reactos.git] / modules / rostests / apitests / ntdll / NtCreateKey.c
1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for NtCreateKey
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include "precomp.h"
9
10 static
11 VOID
12 VerifyAccess_(
13 _In_ HANDLE Handle,
14 _In_ ACCESS_MASK ExpectedAccess,
15 _In_ PCSTR File,
16 _In_ INT Line)
17 {
18 NTSTATUS Status;
19 OBJECT_BASIC_INFORMATION BasicInfo;
20 ULONG Length;
21
22 Status = NtQueryObject(Handle,
23 ObjectBasicInformation,
24 &BasicInfo,
25 sizeof(BasicInfo),
26 &Length);
27 ok_(File, Line)(Status == STATUS_SUCCESS, "NtQueryObject returned 0x%lx\n", Status);
28 ok_(File, Line)(BasicInfo.GrantedAccess == ExpectedAccess,
29 "GrantedAccess is 0x%lx, expected 0x%lx\n",
30 BasicInfo.GrantedAccess, ExpectedAccess);
31 }
32 #define VerifyAccess(h, e) VerifyAccess_(h, e, __FILE__, __LINE__)
33
34 static
35 VOID
36 TestCreateOpen_(
37 _In_ ACCESS_MASK DesiredAccess,
38 _In_ ACCESS_MASK ExpectedAccess,
39 _In_ NTSTATUS ExpectedStatus,
40 _In_ PCSTR File,
41 _In_ INT Line)
42 {
43 NTSTATUS Status;
44 HANDLE KeyHandle;
45 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software");
46 OBJECT_ATTRIBUTES ObjectAttributes;
47
48 InitializeObjectAttributes(&ObjectAttributes,
49 &KeyName,
50 OBJ_CASE_INSENSITIVE,
51 NULL,
52 NULL);
53 Status = NtCreateKey(&KeyHandle,
54 DesiredAccess,
55 &ObjectAttributes,
56 0,
57 NULL,
58 REG_OPTION_NON_VOLATILE,
59 NULL);
60 ok_(File, Line)(Status == ExpectedStatus,
61 "NtCreateKey returned 0x%lx, expected 0x%lx\n",
62 Status, ExpectedStatus);
63 if (NT_SUCCESS(Status))
64 {
65 VerifyAccess_(KeyHandle, ExpectedAccess, File, Line);
66 Status = NtClose(KeyHandle);
67 ok_(File, Line)(Status == STATUS_SUCCESS,
68 "NtClose from NtCreateKey returned 0x%lx\n",
69 Status);
70 }
71 else if (NT_SUCCESS(ExpectedStatus))
72 {
73 skip_(File, Line)("NtCreateKey failed, skipping\n");
74 }
75
76 Status = NtOpenKey(&KeyHandle,
77 DesiredAccess,
78 &ObjectAttributes);
79 ok_(File, Line)(Status == ExpectedStatus,
80 "NtOpenKey returned 0x%lx, expected 0x%lx\n",
81 Status, ExpectedStatus);
82 if (NT_SUCCESS(Status))
83 {
84 VerifyAccess_(KeyHandle, ExpectedAccess, File, Line);
85 Status = NtClose(KeyHandle);
86 ok_(File, Line)(Status == STATUS_SUCCESS,
87 "NtClose from NtOpenKey returned 0x%lx\n",
88 Status);
89 }
90 else if (NT_SUCCESS(ExpectedStatus))
91 {
92 skip_(File, Line)("NtOpenKey failed, skipping\n");
93 }
94 }
95 #define TestCreateOpen(d, ea, es) TestCreateOpen_(d, ea, es, __FILE__, __LINE__)
96
97 START_TEST(NtCreateKey)
98 {
99 TestCreateOpen(0, 0, STATUS_ACCESS_DENIED);
100 TestCreateOpen(KEY_WOW64_32KEY, 0, STATUS_ACCESS_DENIED);
101 TestCreateOpen(KEY_WOW64_64KEY, 0, STATUS_ACCESS_DENIED);
102 TestCreateOpen(KEY_WOW64_32KEY | KEY_WOW64_64KEY, 0, STATUS_ACCESS_DENIED); // STATUS_INVALID_PARAMETER on Win7
103 TestCreateOpen(READ_CONTROL, READ_CONTROL, STATUS_SUCCESS);
104 TestCreateOpen(READ_CONTROL | KEY_WOW64_32KEY, READ_CONTROL, STATUS_SUCCESS);
105 TestCreateOpen(READ_CONTROL | KEY_WOW64_64KEY, READ_CONTROL, STATUS_SUCCESS);
106 TestCreateOpen(READ_CONTROL | KEY_WOW64_32KEY | KEY_WOW64_64KEY, READ_CONTROL, STATUS_SUCCESS); // STATUS_INVALID_PARAMETER on Win7
107 }