From: Aric Stewart Subject: [PATCH (resend)] programs/winedevice.exe: Use IoCreateDriver and IoDeleteDriver Message-Id: <5703C12C.8010700@codeweavers.com> Date: Tue, 5 Apr 2016 08:44:12 -0500 Signed-off-by: Aric Stewart --- programs/winedevice/device.c | 55 ++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/programs/winedevice/device.c b/programs/winedevice/device.c index 94132ed..f6dd678 100644 --- a/programs/winedevice/device.c +++ b/programs/winedevice/device.c @@ -43,8 +43,8 @@ extern NTSTATUS CDECL wine_ntoskrnl_main_loop( HANDLE stop_event ); static WCHAR *driver_name; static SERVICE_STATUS_HANDLE service_handle; static HANDLE stop_event; -static DRIVER_OBJECT driver_obj; -static DRIVER_EXTENSION driver_extension; +static DRIVER_OBJECT *driver_obj; +static HMODULE driver_module; /* find the LDR_MODULE corresponding to the driver module */ static LDR_MODULE *find_ldr_module( HMODULE module ) @@ -133,38 +133,35 @@ error: } /* call the driver init entry point */ -static NTSTATUS init_driver( HMODULE module, UNICODE_STRING *keyname ) +static NTSTATUS WINAPI init_driver( DRIVER_OBJECT *driver_object, UNICODE_STRING *keyname ) { unsigned int i; NTSTATUS status; - const IMAGE_NT_HEADERS *nt = RtlImageNtHeader( module ); + const IMAGE_NT_HEADERS *nt = RtlImageNtHeader( driver_module ); if (!nt->OptionalHeader.AddressOfEntryPoint) return STATUS_SUCCESS; - driver_obj.Size = sizeof(driver_obj); - driver_obj.DriverSection = find_ldr_module( module ); - driver_obj.DriverInit = (PDRIVER_INITIALIZE)((char *)module + nt->OptionalHeader.AddressOfEntryPoint); - driver_obj.DriverExtension = &driver_extension; + driver_obj = driver_object; - driver_extension.DriverObject = &driver_obj; - driver_extension.ServiceKeyName = *keyname; + driver_object->DriverSection = find_ldr_module( driver_module ); + driver_object->DriverInit = (PDRIVER_INITIALIZE)((char *)driver_module + nt->OptionalHeader.AddressOfEntryPoint); if (WINE_TRACE_ON(relay)) WINE_DPRINTF( "%04x:Call driver init %p (obj=%p,str=%s)\n", GetCurrentThreadId(), - driver_obj.DriverInit, &driver_obj, wine_dbgstr_w(keyname->Buffer) ); + driver_object->DriverInit, driver_object, wine_dbgstr_w(keyname->Buffer) ); - status = driver_obj.DriverInit( &driver_obj, keyname ); + status = driver_object->DriverInit( driver_object, keyname ); if (WINE_TRACE_ON(relay)) WINE_DPRINTF( "%04x:Ret driver init %p (obj=%p,str=%s) retval=%08x\n", GetCurrentThreadId(), - driver_obj.DriverInit, &driver_obj, wine_dbgstr_w(keyname->Buffer), status ); + driver_object->DriverInit, driver_object, wine_dbgstr_w(keyname->Buffer), status ); - WINE_TRACE( "init done for %s obj %p\n", wine_dbgstr_w(driver_name), &driver_obj ); - WINE_TRACE( "- DriverInit = %p\n", driver_obj.DriverInit ); - WINE_TRACE( "- DriverStartIo = %p\n", driver_obj.DriverStartIo ); - WINE_TRACE( "- DriverUnload = %p\n", driver_obj.DriverUnload ); + WINE_TRACE( "init done for %s obj %p\n", wine_dbgstr_w(driver_name), driver_object ); + WINE_TRACE( "- DriverInit = %p\n", driver_object->DriverInit ); + WINE_TRACE( "- DriverStartIo = %p\n", driver_object->DriverStartIo ); + WINE_TRACE( "- DriverUnload = %p\n", driver_object->DriverUnload ); for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) - WINE_TRACE( "- MajorFunction[%d] = %p\n", i, driver_obj.MajorFunction[i] ); + WINE_TRACE( "- MajorFunction[%d] = %p\n", i, driver_object->MajorFunction[i] ); return status; } @@ -185,10 +182,11 @@ static void unload_driver( HMODULE module, DRIVER_OBJECT *driver_obj ) driver_obj->DriverUnload, driver_obj ); } FreeLibrary( module ); + IoDeleteDriver( driver_obj ); } /* load the .sys module for a device driver */ -static HMODULE load_driver(void) +static VOID load_driver(void) { static const WCHAR driversW[] = {'\\','d','r','i','v','e','r','s','\\',0}; static const WCHAR systemrootW[] = {'\\','S','y','s','t','e','m','R','o','o','t','\\',0}; @@ -203,7 +201,6 @@ static HMODULE load_driver(void) UNICODE_STRING keypath; HKEY driver_hkey; - HMODULE module; LPWSTR path = NULL, str; DWORD type, size; @@ -215,7 +212,7 @@ static HMODULE load_driver(void) { WINE_ERR( "cannot open key %s, err=%u\n", wine_dbgstr_w(str), GetLastError() ); HeapFree( GetProcessHeap(), 0, str); - return NULL; + return; } RtlInitUnicodeString( &keypath, str ); @@ -235,7 +232,7 @@ static HMODULE load_driver(void) { RtlFreeUnicodeString( &keypath ); RegCloseKey( driver_hkey ); - return NULL; + return; } if (!strncmpiW( path, systemrootW, 12 )) @@ -274,16 +271,15 @@ static HMODULE load_driver(void) WINE_TRACE( "loading driver %s\n", wine_dbgstr_w(str) ); - module = load_driver_module( str ); + driver_module = load_driver_module( str ); HeapFree( GetProcessHeap(), 0, path ); - if (!module) + if (!driver_module) { RtlFreeUnicodeString( &keypath ); - return NULL; + return; } - init_driver( module, &keypath ); - return module; + IoCreateDriver( &keypath, init_driver ); } static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context ) @@ -318,7 +314,6 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv ) { SERVICE_STATUS status; - HMODULE driver_module; WINE_TRACE( "starting service %s\n", wine_dbgstr_w(driver_name) ); @@ -337,7 +332,7 @@ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv ) status.dwWaitHint = 10000; SetServiceStatus( service_handle, &status ); - driver_module = load_driver(); + load_driver(); if (driver_module) { status.dwCurrentState = SERVICE_RUNNING; @@ -345,7 +340,7 @@ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv ) SetServiceStatus( service_handle, &status ); wine_ntoskrnl_main_loop( stop_event ); - unload_driver( driver_module, &driver_obj ); + unload_driver( driver_module, driver_obj ); } else WINE_ERR( "driver %s failed to load\n", wine_dbgstr_w(driver_name) );