Module: wine Branch: master Commit: 302d86f1a98b9414de731d0a451136121e820ebe URL: http://source.winehq.org/git/wine.git/?a=commit;h=302d86f1a98b9414de731d0a45...
Author: Sebastian Lackner sebastian@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@fds-team.de Signed-off-by: Alexandre Julliard julliard@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; }