1 /*
2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for NtSaveKey
5 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
6 */
7
8 #include "precomp.h"
9
10 static
11 NTSTATUS
OpenRegistryKeyHandle(PHANDLE KeyHandle,ACCESS_MASK AccessMask,PWCHAR RegistryPath)12 OpenRegistryKeyHandle(PHANDLE KeyHandle,
13 ACCESS_MASK AccessMask,
14 PWCHAR RegistryPath)
15 {
16 UNICODE_STRING KeyName;
17 OBJECT_ATTRIBUTES Attributes;
18
19 RtlInitUnicodeString(&KeyName, RegistryPath);
20 InitializeObjectAttributes(&Attributes,
21 &KeyName,
22 OBJ_CASE_INSENSITIVE,
23 NULL,
24 NULL);
25
26 return NtOpenKey(KeyHandle, AccessMask, &Attributes);
27 }
28
START_TEST(NtSaveKey)29 START_TEST(NtSaveKey)
30 {
31 NTSTATUS Status;
32 HANDLE KeyHandle;
33 HANDLE FileHandle;
34 BOOLEAN PrivilegeEnabled = FALSE;
35 BOOLEAN OldPrivilegeStatus;
36
37 /* Make sure we don't have backup privileges initially, otherwise WHS testbot fails */
38 Status = RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE, FALSE, FALSE, &PrivilegeEnabled);
39 ok(Status == STATUS_SUCCESS, "RtlAdjustPrivilege returned %lx\n", Status);
40
41 /* Open the file */
42 FileHandle = CreateFileW(L"saved_key.dat",
43 GENERIC_READ | GENERIC_WRITE,
44 0,
45 NULL,
46 CREATE_ALWAYS,
47 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,
48 NULL);
49 if (FileHandle == INVALID_HANDLE_VALUE)
50 {
51 skip("CreateFileW failed with error: %lu\n", GetLastError());
52 return;
53 }
54
55 /* Try saving HKEY_LOCAL_MACHINE\Hardware */
56 Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\Machine\\Hardware");
57 if (!NT_SUCCESS(Status))
58 {
59 skip("NtOpenKey failed with status: 0x%08lX\n", Status);
60 NtClose(FileHandle);
61 return;
62 }
63
64 Status = NtSaveKey(KeyHandle, FileHandle);
65 ok_ntstatus(Status, STATUS_PRIVILEGE_NOT_HELD);
66
67 NtClose(KeyHandle);
68
69 /* Set the SeBackupPrivilege */
70 Status = RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE,
71 TRUE,
72 FALSE,
73 &OldPrivilegeStatus);
74 if (!NT_SUCCESS(Status))
75 {
76 skip("RtlAdjustPrivilege failed with status: 0x%08lX\n", (ULONG)Status);
77 NtClose(FileHandle);
78 return;
79 }
80
81 /* Try saving HKEY_LOCAL_MACHINE\Hardware again */
82 Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\Machine\\Hardware");
83 if (!NT_SUCCESS(Status))
84 {
85 skip("NtOpenKey failed with status: 0x%08lX\n", Status);
86 goto Cleanup;
87 }
88
89 Status = NtSaveKey(KeyHandle, FileHandle);
90 ok_ntstatus(Status, STATUS_SUCCESS);
91
92 NtClose(KeyHandle);
93
94 /* Try saving HKEY_LOCAL_MACHINE */
95 Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\Machine");
96 if (!NT_SUCCESS(Status))
97 {
98 skip("NtOpenKey failed with status: 0x%08lX\n", Status);
99 goto Cleanup;
100 }
101
102 Status = NtSaveKey(KeyHandle, FileHandle);
103 ok_ntstatus(Status, STATUS_ACCESS_DENIED);
104
105 NtClose(KeyHandle);
106
107 /* Try saving HKEY_USERS */
108 Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\User");
109 if (!NT_SUCCESS(Status))
110 {
111 skip("NtOpenKey failed with status: 0x%08lX\n", Status);
112 goto Cleanup;
113 }
114
115 Status = NtSaveKey(KeyHandle, FileHandle);
116 ok_ntstatus(Status, STATUS_ACCESS_DENIED);
117
118 NtClose(KeyHandle);
119
120 Cleanup:
121
122 /* Restore the SeBackupPrivilege */
123 RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE,
124 OldPrivilegeStatus,
125 FALSE,
126 &OldPrivilegeStatus);
127
128 /* Close the file handle */
129 NtClose(FileHandle);
130 }
131