Author: fireball Date: Wed Jul 4 17:58:30 2007 New Revision: 27385
URL: http://svn.reactos.org/svn/reactos?rev=27385&view=rev Log: - Correctly set DN_DRIVER_LOADED flag. - This fixes "i8042prt/kbdclass.sys get installed one more time at each boot". See issue #2330 for more details.
Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/driver.c (original) +++ trunk/reactos/ntoskrnl/io/iomgr/driver.c Wed Jul 4 17:58:30 2007 @@ -1645,6 +1645,9 @@ goto ReleaseCapturedString; } } + + /* We have a driver for this DeviceNode */ + DeviceNode->Flags |= DN_DRIVER_LOADED; }
IopInitializeDevice(DeviceNode, DriverObject);
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c Wed Jul 4 17:58:30 2007 @@ -2380,29 +2380,30 @@ if (!NT_SUCCESS(Status)) { /* Driver is not initialized, try to load it */ - Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject); - - if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED) - { + Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject); + + if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED) + { /* STATUS_IMAGE_ALREADY_LOADED means this driver was loaded by the bootloader */ - if (Status != STATUS_IMAGE_ALREADY_LOADED) - { + if (Status != STATUS_IMAGE_ALREADY_LOADED) + { /* Initialize the driver */ - DeviceNode->Flags |= DN_DRIVER_LOADED; - Status = IopInitializeDriverModule(DeviceNode, ModuleObject, - &DeviceNode->ServiceName, FALSE, &DriverObject); - } - else - { + Status = IopInitializeDriverModule(DeviceNode, ModuleObject, + &DeviceNode->ServiceName, FALSE, &DriverObject); + } + else + { Status = STATUS_SUCCESS; - } + } } }
/* Driver is loaded and initialized at this point */ if (NT_SUCCESS(Status)) { + /* We have a driver for this DeviceNode */ + DeviceNode->Flags |= DN_DRIVER_LOADED; /* Attach lower level filter drivers. */ IopAttachFilterDrivers(DeviceNode, TRUE); /* Initialize the function driver for the device node */