Sebastian Lackner : ntoskrnl.exe: Return STATUS_INVALID_DEVICE_REQUEST when calling unhandled driver function.

Alexandre Julliard julliard at winehq.org
Thu Oct 6 14:46:53 CDT 2016


Module: wine
Branch: master
Commit: 302d86f1a98b9414de731d0a451136121e820ebe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=302d86f1a98b9414de731d0a451136121e820ebe

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Wed Oct  5 23:30:10 2016 +0200

ntoskrnl.exe: Return STATUS_INVALID_DEVICE_REQUEST when calling unhandled driver function.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 522facf..cc6ea0b 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -884,6 +884,15 @@ static void build_driver_keypath( const WCHAR *name, UNICODE_STRING *keypath )
 }
 
 
+static NTSTATUS WINAPI unhandled_irp( DEVICE_OBJECT *device, IRP *irp )
+{
+    TRACE( "(%p, %p)\n", device, irp );
+    irp->IoStatus.u.Status = STATUS_INVALID_DEVICE_REQUEST;
+    IoCompleteRequest( irp, IO_NO_INCREMENT );
+    return STATUS_INVALID_DEVICE_REQUEST;
+}
+
+
 /***********************************************************************
  *           IoCreateDriver   (NTOSKRNL.EXE.@)
  */
@@ -891,6 +900,7 @@ NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init )
 {
     struct wine_driver *driver;
     NTSTATUS status;
+    unsigned int i;
 
     TRACE("(%s, %p)\n", debugstr_us(name), init);
 
@@ -909,24 +919,29 @@ NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init )
     driver->driver_obj.DriverExtension = &driver->driver_extension;
     driver->driver_extension.DriverObject   = &driver->driver_obj;
     build_driver_keypath( driver->driver_obj.DriverName.Buffer, &driver->driver_extension.ServiceKeyName );
+    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
+        driver->driver_obj.MajorFunction[i] = unhandled_irp;
 
     status = driver->driver_obj.DriverInit( &driver->driver_obj, &driver->driver_extension.ServiceKeyName );
-
     if (status)
     {
         RtlFreeUnicodeString( &driver->driver_obj.DriverName );
         RtlFreeUnicodeString( &driver->driver_extension.ServiceKeyName );
         RtlFreeHeap( GetProcessHeap(), 0, driver );
+        return status;
     }
-    else
+
+    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
     {
-        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 );
+        if (driver->driver_obj.MajorFunction[i]) continue;
+        driver->driver_obj.MajorFunction[i] = unhandled_irp;
     }
 
-    return status;
+    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;
 }
 
 




More information about the wine-cvs mailing list