- 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.

svn path=/trunk/; revision=27385
This commit is contained in:
Aleksey Bragin 2007-07-04 13:58:30 +00:00
parent 4d91599bd6
commit 122331f605
2 changed files with 16 additions and 12 deletions

View file

@ -1645,6 +1645,9 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName)
goto ReleaseCapturedString; goto ReleaseCapturedString;
} }
} }
/* We have a driver for this DeviceNode */
DeviceNode->Flags |= DN_DRIVER_LOADED;
} }
IopInitializeDevice(DeviceNode, DriverObject); IopInitializeDevice(DeviceNode, DriverObject);

View file

@ -2380,29 +2380,30 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* Driver is not initialized, try to load it */ /* Driver is not initialized, try to load it */
Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject); Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED) if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED)
{ {
/* STATUS_IMAGE_ALREADY_LOADED means this driver /* STATUS_IMAGE_ALREADY_LOADED means this driver
was loaded by the bootloader */ was loaded by the bootloader */
if (Status != STATUS_IMAGE_ALREADY_LOADED) if (Status != STATUS_IMAGE_ALREADY_LOADED)
{ {
/* Initialize the driver */ /* Initialize the driver */
DeviceNode->Flags |= DN_DRIVER_LOADED; Status = IopInitializeDriverModule(DeviceNode, ModuleObject,
Status = IopInitializeDriverModule(DeviceNode, ModuleObject, &DeviceNode->ServiceName, FALSE, &DriverObject);
&DeviceNode->ServiceName, FALSE, &DriverObject); }
} else
else {
{
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} }
} }
} }
/* Driver is loaded and initialized at this point */ /* Driver is loaded and initialized at this point */
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
/* We have a driver for this DeviceNode */
DeviceNode->Flags |= DN_DRIVER_LOADED;
/* Attach lower level filter drivers. */ /* Attach lower level filter drivers. */
IopAttachFilterDrivers(DeviceNode, TRUE); IopAttachFilterDrivers(DeviceNode, TRUE);
/* Initialize the function driver for the device node */ /* Initialize the function driver for the device node */