From 2996e28ecd6bcdd09285ee05a872eaa7443a8cef Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sat, 31 May 2014 01:14:02 +0000 Subject: [PATCH] [NTDLL_APITESTS] Add tests for NtSaveKey. svn path=/trunk/; revision=63507 --- rostests/apitests/ntdll/CMakeLists.txt | 1 + rostests/apitests/ntdll/NtSaveKey.c | 131 +++++++++++++++++++++++++ rostests/apitests/ntdll/testlist.c | 2 + 3 files changed, 134 insertions(+) create mode 100644 rostests/apitests/ntdll/NtSaveKey.c diff --git a/rostests/apitests/ntdll/CMakeLists.txt b/rostests/apitests/ntdll/CMakeLists.txt index b0a13e45b4a..8891df5f712 100644 --- a/rostests/apitests/ntdll/CMakeLists.txt +++ b/rostests/apitests/ntdll/CMakeLists.txt @@ -11,6 +11,7 @@ list(APPEND SOURCE NtProtectVirtualMemory.c NtQuerySystemEnvironmentValue.c NtQueryVolumeInformationFile.c + NtSaveKey.c RtlBitmap.c RtlDetermineDosPathNameType.c RtlDoesFileExists.c diff --git a/rostests/apitests/ntdll/NtSaveKey.c b/rostests/apitests/ntdll/NtSaveKey.c new file mode 100644 index 00000000000..cea42251423 --- /dev/null +++ b/rostests/apitests/ntdll/NtSaveKey.c @@ -0,0 +1,131 @@ +/* + * PROJECT: ReactOS API Tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test for NtSaveKey + * PROGRAMMERS: Aleksandar Andrejevic + */ + +#include + +#define WIN32_NO_STATUS +#include +#include +#include +#include + +static +NTSTATUS +OpenRegistryKeyHandle(PHANDLE KeyHandle, + ACCESS_MASK AccessMask, + PWCHAR RegistryPath) +{ + UNICODE_STRING KeyName; + OBJECT_ATTRIBUTES Attributes; + + RtlInitUnicodeString(&KeyName, RegistryPath); + InitializeObjectAttributes(&Attributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + return NtOpenKey(KeyHandle, AccessMask, &Attributes); +} + +START_TEST(NtSaveKey) +{ + NTSTATUS Status; + HANDLE KeyHandle; + HANDLE FileHandle; + BOOLEAN OldPrivilegeStatus; + + /* Open the file */ + FileHandle = CreateFileW(L"saved_key.dat", + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, + NULL); + if (FileHandle == INVALID_HANDLE_VALUE) + { + skip("CreateFileW failed with error: %lu\n", GetLastError()); + return; + } + + /* Try saving HKEY_LOCAL_MACHINE\Hardware */ + Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\Machine\\Hardware"); + if (!NT_SUCCESS(Status)) + { + skip("NtOpenKey failed with status: 0x%08lX\n", Status); + NtClose(FileHandle); + return; + } + + Status = NtSaveKey(KeyHandle, FileHandle); + ok_ntstatus(Status, STATUS_PRIVILEGE_NOT_HELD); + + NtClose(KeyHandle); + + /* Set the SeBackupPrivilege */ + Status = RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE, + TRUE, + FALSE, + &OldPrivilegeStatus); + if (!NT_SUCCESS(Status)) + { + skip("RtlAdjustPrivilege failed with status: 0x%08lX\n", (ULONG)Status); + NtClose(FileHandle); + return; + } + + /* Try saving HKEY_LOCAL_MACHINE\Hardware again */ + Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\Machine\\Hardware"); + if (!NT_SUCCESS(Status)) + { + skip("NtOpenKey failed with status: 0x%08lX\n", Status); + goto Cleanup; + } + + Status = NtSaveKey(KeyHandle, FileHandle); + ok_ntstatus(Status, STATUS_SUCCESS); + + NtClose(KeyHandle); + + /* Try saving HKEY_LOCAL_MACHINE */ + Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\Machine"); + if (!NT_SUCCESS(Status)) + { + skip("NtOpenKey failed with status: 0x%08lX\n", Status); + goto Cleanup; + } + + Status = NtSaveKey(KeyHandle, FileHandle); + ok_ntstatus(Status, STATUS_ACCESS_DENIED); + + NtClose(KeyHandle); + + /* Try saving HKEY_USERS */ + Status = OpenRegistryKeyHandle(&KeyHandle, KEY_READ, L"\\Registry\\User"); + if (!NT_SUCCESS(Status)) + { + skip("NtOpenKey failed with status: 0x%08lX\n", Status); + goto Cleanup; + } + + Status = NtSaveKey(KeyHandle, FileHandle); + ok_ntstatus(Status, STATUS_ACCESS_DENIED); + + NtClose(KeyHandle); + +Cleanup: + + /* Restore the SeBackupPrivilege */ + RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE, + OldPrivilegeStatus, + FALSE, + &OldPrivilegeStatus); + + /* Close the file handle */ + NtClose(FileHandle); +} diff --git a/rostests/apitests/ntdll/testlist.c b/rostests/apitests/ntdll/testlist.c index 40bec87cde6..0a4a8466089 100644 --- a/rostests/apitests/ntdll/testlist.c +++ b/rostests/apitests/ntdll/testlist.c @@ -14,6 +14,7 @@ extern void func_NtMutant(void); extern void func_NtProtectVirtualMemory(void); extern void func_NtQuerySystemEnvironmentValue(void); extern void func_NtQueryVolumeInformationFile(void); +extern void func_NtSaveKey(void); extern void func_NtSystemInformation(void); extern void func_RtlBitmap(void); extern void func_RtlDetermineDosPathNameType(void); @@ -43,6 +44,7 @@ const struct test winetest_testlist[] = { "NtProtectVirtualMemory", func_NtProtectVirtualMemory }, { "NtQuerySystemEnvironmentValue", func_NtQuerySystemEnvironmentValue }, { "NtQueryVolumeInformationFile", func_NtQueryVolumeInformationFile }, + { "NtSaveKey", func_NtSaveKey}, { "NtSystemInformation", func_NtSystemInformation }, { "RtlBitmapApi", func_RtlBitmap }, { "RtlDetermineDosPathNameType", func_RtlDetermineDosPathNameType },