[PATCH] ntoskrnl.exe: Add internal directory object-type.

Derek Lesho dereklesho52 at gmail.com
Fri Mar 22 10:20:14 CDT 2019


Signed-off-by: Derek Lesho <dereklesho52 at Gmail.com>
---
 dlls/ntoskrnl.exe/ntoskrnl.c        | 12 +++++++++++-
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |  2 +-
 dlls/ntoskrnl.exe/tests/driver.c    | 17 ++++++++++++++++-
 3 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 27c7d00c1a..3481f9da0e 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -315,6 +315,7 @@ static void ObReferenceObject( void *obj )
     TRACE( "(%p) ref=%u\n", obj, ref );
 }
 
+extern POBJECT_TYPE directory_type;
 static const POBJECT_TYPE *known_types[] =
 {
     &ExEventObjectType,
@@ -324,7 +325,8 @@ static const POBJECT_TYPE *known_types[] =
     &IoFileObjectType,
     &PsProcessType,
     &PsThreadType,
-    &SeTokenObjectType
+    &SeTokenObjectType,
+    &directory_type
 };
 
 static NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret )
@@ -1440,6 +1442,14 @@ void WINAPI IoDeleteDevice( DEVICE_OBJECT *device )
 }
 
 
+static const WCHAR directory_type_name[] = {'D','i','r','e','c','t','o','r','y',0};
+
+static struct _OBJECT_TYPE _directory_type = {
+    directory_type_name
+};
+
+POBJECT_TYPE directory_type = &_directory_type;
+
 /***********************************************************************
  *           IoCreateSymbolicLink   (NTOSKRNL.EXE.@)
  */
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index da16bc2e2a..a43badae4e 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -1345,7 +1345,7 @@
 @ stdcall -private ZwMakeTemporaryObject(long) NtMakeTemporaryObject
 @ stdcall -private ZwMapViewOfSection(long long ptr long long ptr ptr long long long) NtMapViewOfSection
 @ 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 64abca4c25..27755f83af 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -664,7 +664,7 @@ static void test_ob_reference(const WCHAR *test_path)
 {
     POBJECT_TYPE (WINAPI *pObGetObjectType)(void*);
     OBJECT_ATTRIBUTES attr = { sizeof(attr) };
-    HANDLE event_handle, file_handle, file_handle2, thread_handle;
+    HANDLE event_handle, file_handle, file_handle2, thread_handle, directory_handle;
     FILE_OBJECT *file;
     void *obj1, *obj2;
     POBJECT_TYPE obj1_type;
@@ -675,6 +675,7 @@ static void test_ob_reference(const WCHAR *test_path)
     NTSTATUS status;
 
     static const WCHAR tmpW[] = {'.','t','m','p',0};
+    static const WCHAR directoryW[] = {'\\','D','e','v','i','c','e',0};
 
     pObGetObjectType = get_proc_address("ObGetObjectType");
     if (!pObGetObjectType)
@@ -697,6 +698,12 @@ static void test_ob_reference(const WCHAR *test_path)
     ok(!status, "ZwCreateFile failed: %#x\n", status);
     ExFreePool(tmp_path);
 
+    RtlInitUnicodeString(&pathU, directoryW);
+    attr.ObjectName = &pathU;
+    attr.Attributes = OBJ_OPENIF;
+    status = ZwOpenDirectoryObject(&directory_handle, 0, &attr);
+    ok(!status, "ZwCreateDirectoryObject failed: %#x\n", status);
+
     status = ZwDuplicateObject(NtCurrentProcess(), file_handle, NtCurrentProcess(), &file_handle2,
                                0, OBJ_KERNEL_HANDLE, DUPLICATE_SAME_ACCESS);
     ok(!status, "ZwDuplicateObject failed: %#x\n", status);
@@ -769,6 +776,11 @@ static void test_ob_reference(const WCHAR *test_path)
     ObDereferenceObject(obj1);
     ObDereferenceObject(obj2);
 
+    status = ObReferenceObjectByHandle(directory_handle, SYNCHRONIZE, NULL, KernelMode, &obj1, NULL);
+    ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
+
+    ObDereferenceObject(obj1);
+
     status = ZwClose(thread_handle);
     ok(!status, "ZwClose failed: %#x\n", status);
 
@@ -780,6 +792,9 @@ static void test_ob_reference(const WCHAR *test_path)
 
     status = ZwClose(file_handle2);
     ok(!status, "ZwClose failed: %#x\n", status);
+
+    status = ZwClose(directory_handle);
+    ok(!status, "ZwClose failed: %#x\n", status);
 }
 
 static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
-- 
2.20.1




More information about the wine-devel mailing list