[PATCH 1/6] ntoskrnl.exe: Add tests for permanent objects.
Zebediah Figura
z.figura12 at gmail.com
Wed Jul 15 18:34:15 CDT 2020
These tests have to live in ntoskrnl, since only kernel drivers and processes
running as LOCAL SYSTEM can create permanent objects.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 6 ++--
dlls/ntoskrnl.exe/tests/driver.c | 49 +++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 6acdec5dc5a..0f65490b487 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -1378,7 +1378,7 @@
@ stdcall ZwClose(long) NtClose
@ stub ZwCloseObjectAuditAlarm
@ stdcall -private ZwConnectPort(ptr ptr ptr ptr ptr ptr ptr ptr) NtConnectPort
-@ stdcall -private ZwCreateDirectoryObject(ptr long ptr) NtCreateDirectoryObject
+@ stdcall ZwCreateDirectoryObject(ptr long ptr) NtCreateDirectoryObject
@ stdcall ZwCreateEvent(ptr long ptr long long) NtCreateEvent
@ stdcall ZwCreateFile(ptr long ptr ptr ptr long long long long ptr long) NtCreateFile
@ stdcall -private ZwCreateIoCompletion(ptr long ptr long) NtCreateIoCompletion
@@ -1412,11 +1412,11 @@
@ stdcall -private ZwLoadKey(ptr ptr) NtLoadKey
@ stdcall -private ZwLockFile(long long ptr ptr ptr ptr ptr ptr long long) NtLockFile
@ stdcall -private ZwLockVirtualMemory(long ptr ptr long) NtLockVirtualMemory
-@ stdcall -private ZwMakeTemporaryObject(long) NtMakeTemporaryObject
+@ stdcall ZwMakeTemporaryObject(long) NtMakeTemporaryObject
@ stdcall -private ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
@ stdcall -private ZwNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long) NtNotifyChangeDirectoryFile
@ stdcall -private ZwNotifyChangeKey(long long ptr ptr ptr long long ptr long long) NtNotifyChangeKey
-@ stdcall -private ZwOpenDirectoryObject(ptr long ptr) NtOpenDirectoryObject
+@ stdcall ZwOpenDirectoryObject(ptr long ptr) NtOpenDirectoryObject
@ stdcall -private ZwOpenEvent(ptr long ptr) NtOpenEvent
@ stdcall ZwOpenFile(ptr long ptr ptr long long) NtOpenFile
@ stdcall -private ZwOpenJobObject(ptr long ptr) NtOpenJobObject
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index bb5bbeb4fa5..0ae63ffafb3 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -2024,6 +2024,54 @@ static void test_process_memory(const struct test_input *test_input)
ObDereferenceObject(process);
}
+static void test_permanence(void)
+{
+ OBJECT_ATTRIBUTES attr;
+ HANDLE handle, handle2;
+ UNICODE_STRING str;
+ NTSTATUS status;
+
+ RtlInitUnicodeString(&str, L"\\BaseNamedObjects\\wine_test_dir");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = ZwCreateDirectoryObject( &handle, GENERIC_ALL, &attr );
+ ok(!status, "got %#x\n", status);
+ status = ZwClose( handle );
+ ok(!status, "got %#x\n", status);
+ status = ZwOpenDirectoryObject( &handle, 0, &attr );
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "got %#x\n", status);
+
+ attr.Attributes = OBJ_PERMANENT;
+ status = ZwCreateDirectoryObject( &handle, GENERIC_ALL, &attr );
+ ok(!status, "got %#x\n", status);
+ status = ZwClose( handle );
+ ok(!status, "got %#x\n", status);
+
+ attr.Attributes = 0;
+ status = ZwOpenDirectoryObject( &handle, 0, &attr );
+ todo_wine ok(!status, "got %#x\n", status);
+ status = ZwMakeTemporaryObject( handle );
+ ok(!status, "got %#x\n", status);
+ status = ZwMakeTemporaryObject( handle );
+ ok(!status, "got %#x\n", status);
+ status = ZwClose( handle );
+ todo_wine ok(!status, "got %#x\n", status);
+ status = ZwOpenDirectoryObject( &handle, 0, &attr );
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "got %#x\n", status);
+
+ status = ZwCreateDirectoryObject( &handle, GENERIC_ALL, &attr );
+ ok(!status, "got %#x\n", status);
+ attr.Attributes = OBJ_PERMANENT;
+ status = ZwOpenDirectoryObject( &handle2, 0, &attr );
+ ok(status == STATUS_SUCCESS, "got %#x\n", status);
+ status = ZwClose( handle2 );
+ ok(!status, "got %#x\n", status);
+ status = ZwClose( handle );
+ ok(!status, "got %#x\n", status);
+ attr.Attributes = 0;
+ status = ZwOpenDirectoryObject( &handle, 0, &attr );
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "got %#x\n", status);
+}
+
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack)
{
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
@@ -2080,6 +2128,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
test_affinity();
test_dpc();
test_process_memory(test_input);
+ test_permanence();
if (main_test_work_item) return STATUS_UNEXPECTED_IO_ERROR;
--
2.27.0
More information about the wine-devel
mailing list