Zebediah Figura : ntoskrnl.exe: Make the driver object accessible by name while in its entry point.

Alexandre Julliard julliard at winehq.org
Mon Aug 19 15:35:11 CDT 2019


Module: wine
Branch: master
Commit: 92d8ec7954c7157eee9c112480889f181c3b622f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=92d8ec7954c7157eee9c112480889f181c3b622f

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Sun Aug 18 20:02:39 2019 -0500

ntoskrnl.exe: Make the driver object accessible by name while in its entry point.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c     | 11 ++++++-----
 dlls/ntoskrnl.exe/tests/driver.c | 19 ++++++++++++++++++-
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index f2ed76b..fe66b3d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -1413,10 +1413,15 @@ NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init )
     for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
         driver->driver_obj.MajorFunction[i] = unhandled_irp;
 
+    EnterCriticalSection( &drivers_cs );
+    if (wine_rb_put( &wine_drivers, &driver->driver_obj.DriverName, &driver->entry ))
+        ERR( "failed to insert driver %s in tree\n", debugstr_us(name) );
+    LeaveCriticalSection( &drivers_cs );
+
     status = driver->driver_obj.DriverInit( &driver->driver_obj, &driver->driver_extension.ServiceKeyName );
     if (status)
     {
-        ObDereferenceObject( driver );
+        IoDeleteDriver( &driver->driver_obj );
         return status;
     }
 
@@ -1426,10 +1431,6 @@ NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init )
         driver->driver_obj.MajorFunction[i] = unhandled_irp;
     }
 
-    EnterCriticalSection( &drivers_cs );
-    if (wine_rb_put( &wine_drivers, &driver->driver_obj.DriverName, &driver->entry ))
-        ERR( "failed to insert driver %s in tree\n", debugstr_us(name) );
-    LeaveCriticalSection( &drivers_cs );
     return STATUS_SUCCESS;
 }
 
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 9f55111..c275e67 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -56,7 +56,7 @@ static int running_under_wine;
 static int winetest_debug;
 static int winetest_report_success;
 
-static POBJECT_TYPE *pExEventObjectType, *pIoFileObjectType, *pPsThreadType;
+static POBJECT_TYPE *pExEventObjectType, *pIoFileObjectType, *pPsThreadType, *pIoDriverObjectType;
 static PEPROCESS *pPsInitialSystemProcess;
 static void *create_caller_thread;
 
@@ -1887,8 +1887,12 @@ static VOID WINAPI driver_Unload(DRIVER_OBJECT *driver)
 
 NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
 {
+    static const WCHAR IoDriverObjectTypeW[] = {'I','o','D','r','i','v','e','r','O','b','j','e','c','t','T','y','p','e',0};
+    static const WCHAR driver_nameW[] = {'\\','D','r','i','v','e','r',
+            '\\','W','i','n','e','T','e','s','t','D','r','i','v','e','r',0};
     UNICODE_STRING nameW, linkW;
     NTSTATUS status;
+    void *obj;
 
     DbgPrint("loading driver\n");
 
@@ -1903,6 +1907,19 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
     driver->MajorFunction[IRP_MJ_FLUSH_BUFFERS]     = driver_FlushBuffers;
     driver->MajorFunction[IRP_MJ_CLOSE]             = driver_Close;
 
+    RtlInitUnicodeString(&nameW, IoDriverObjectTypeW);
+    pIoDriverObjectType = MmGetSystemRoutineAddress(&nameW);
+
+    RtlInitUnicodeString(&nameW, driver_nameW);
+    if ((status = ObReferenceObjectByName(&nameW, 0, NULL, 0, *pIoDriverObjectType, KernelMode, NULL, &obj)))
+        return status;
+    if (obj != driver)
+    {
+        ObDereferenceObject(obj);
+        return STATUS_UNSUCCESSFUL;
+    }
+    ObDereferenceObject(obj);
+
     RtlInitUnicodeString(&nameW, device_name);
     RtlInitUnicodeString(&linkW, driver_link);
 




More information about the wine-cvs mailing list