Zebediah Figura : ntoskrnl.exe: Avoid loading a driver multiple times in ZwLoadDriver().
Module: wine Branch: master Commit: e3ad1cff73851f0b16df310934f835988a8287fe URL: https://source.winehq.org/git/wine.git/?a=commit;h=e3ad1cff73851f0b16df31093... Author: Zebediah Figura <z.figura12(a)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(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)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); }
participants (1)
-
Alexandre Julliard