Module: wine Branch: master Commit: e3ad1cff73851f0b16df310934f835988a8287fe URL: https://source.winehq.org/git/wine.git/?a=commit;h=e3ad1cff73851f0b16df31093...
Author: Zebediah Figura z.figura12@gmail.com Date: Fri Dec 21 17:28:46 2018 -0600
ntoskrnl.exe: Avoid loading a driver multiple times in ZwLoadDriver().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45805 Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 7 +++++++ dlls/ntoskrnl.exe/tests/driver.c | 3 +++ 2 files changed, 10 insertions(+)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index aea7d44..88ec372 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -3519,6 +3519,13 @@ NTSTATUS WINAPI ZwLoadDriver( const UNICODE_STRING *service_name ) return STATUS_NO_MEMORY; }
+ if (wine_rb_get( &wine_drivers, &drv_name )) + { + TRACE( "driver %s already loaded\n", debugstr_us(&drv_name) ); + RtlFreeUnicodeString( &drv_name ); + return STATUS_IMAGE_ALREADY_LOADED; + } + set_service_status( service_handle, SERVICE_START_PENDING, 0 );
status = IoCreateDriver( &drv_name, init_driver ); diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 17e54cd..6ab5c3e 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -206,6 +206,9 @@ static void test_load_driver(void) ret = ZwLoadDriver(&name); ok(!ret, "got %#x\n", ret);
+ ret = ZwLoadDriver(&name); + ok(ret == STATUS_IMAGE_ALREADY_LOADED, "got %#x\n", ret); + ret = ZwUnloadDriver(&name); ok(!ret, "got %#x\n", ret); }