- Simplify IopReinitializeBootDrivers and IopReinitializeDrivers.

- For some strange reason, boot drivers were re-initailized *after* system drivers.

svn path=/trunk/; revision=22967
This commit is contained in:
Alex Ionescu
2006-07-09 02:21:13 +00:00
parent 2eaab734d7
commit 9b422ef6c6
3 changed files with 57 additions and 99 deletions
+2 -8
View File
@@ -862,19 +862,13 @@ IopAttachFilterDrivers(
);
VOID
FASTCALL
IopMarkLastReinitializeDriver(
VOID
);
VOID
FASTCALL
NTAPI
IopReinitializeDrivers(
VOID
);
VOID
FASTCALL
NTAPI
IopReinitializeBootDrivers(
VOID
);
+50 -89
View File
@@ -661,8 +661,6 @@ IopInitializeDriverModule(
DPRINT("RegistryKey: %wZ\n", &RegistryKey);
DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry);
IopMarkLastReinitializeDriver();
Status = DriverEntry(*DriverObject, &RegistryKey);
RtlFreeUnicodeString(&RegistryKey);
@@ -1630,113 +1628,76 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers)
return STATUS_SUCCESS;
}
VOID FASTCALL
IopMarkLastReinitializeDriver(VOID)
{
KIRQL Irql;
KeAcquireSpinLock(&DriverReinitListLock,
&Irql);
if (IsListEmpty(&DriverReinitListHead))
{
DriverReinitTailEntry = NULL;
}
else
{
DriverReinitTailEntry = DriverReinitListHead.Blink;
}
KeReleaseSpinLock(&DriverReinitListLock,
Irql);
}
VOID FASTCALL
VOID
NTAPI
IopReinitializeDrivers(VOID)
{
PDRIVER_REINIT_ITEM ReinitItem;
PLIST_ENTRY Entry;
KIRQL Irql;
PDRIVER_REINIT_ITEM ReinitItem;
PLIST_ENTRY Entry;
KeAcquireSpinLock(&DriverReinitListLock,
&Irql);
Entry = DriverReinitTailEntry;
KeReleaseSpinLock(&DriverReinitListLock,
Irql);
if (Entry == NULL)
{
return;
}
for (;;)
{
/* Get the first entry and start looping */
Entry = ExInterlockedRemoveHeadList(&DriverReinitListHead,
&DriverReinitListLock);
if (Entry == NULL)
return;
&DriverReinitListLock);
while (Entry)
{
/* Get the item*/
ReinitItem = CONTAINING_RECORD(Entry, DRIVER_REINIT_ITEM, ItemEntry);
ReinitItem = (PDRIVER_REINIT_ITEM)CONTAINING_RECORD(Entry, DRIVER_REINIT_ITEM, ItemEntry);
/* Increment reinitialization counter */
ReinitItem->DriverObject->DriverExtension->Count++;
/* Increment reinitialization counter */
ReinitItem->DriverObject->DriverExtension->Count++;
/* Remove the device object flag */
ReinitItem->DriverObject->Flags &= ~DRVO_REINIT_REGISTERED;
ReinitItem->ReinitRoutine(ReinitItem->DriverObject,
ReinitItem->Context,
ReinitItem->DriverObject->DriverExtension->Count);
/* Call the routine */
ReinitItem->ReinitRoutine(ReinitItem->DriverObject,
ReinitItem->Context,
ReinitItem->DriverObject->
DriverExtension->Count);
ExFreePool(Entry);
/* Free the entry */
ExFreePool(Entry);
if (Entry == DriverReinitTailEntry)
return;
}
/* Move to the next one */
Entry = ExInterlockedRemoveHeadList(&DriverReinitListHead,
&DriverReinitListLock);
}
}
VOID FASTCALL
VOID
NTAPI
IopReinitializeBootDrivers(VOID)
{
PDRIVER_REINIT_ITEM ReinitItem;
PLIST_ENTRY Entry;
KIRQL Irql;
PDRIVER_REINIT_ITEM ReinitItem;
PLIST_ENTRY Entry;
KeAcquireSpinLock(&DriverBootReinitListLock,
&Irql);
DriverBootReinitTailEntry = IsListEmpty(&DriverBootReinitListHead) ? NULL : DriverBootReinitListHead.Blink;
Entry = DriverBootReinitTailEntry;
KeReleaseSpinLock(&DriverBootReinitListLock,
Irql);
if (Entry == NULL)
{
return;
}
for (;;)
{
/* Get the first entry and start looping */
Entry = ExInterlockedRemoveHeadList(&DriverBootReinitListHead,
&DriverBootReinitListLock);
if (Entry == NULL)
return;
&DriverBootReinitListLock);
while (Entry)
{
/* Get the item*/
ReinitItem = CONTAINING_RECORD(Entry, DRIVER_REINIT_ITEM, ItemEntry);
ReinitItem = (PDRIVER_REINIT_ITEM)CONTAINING_RECORD(Entry, DRIVER_REINIT_ITEM, ItemEntry);
/* Increment reinitialization counter */
ReinitItem->DriverObject->DriverExtension->Count++;
/* Increment reinitialization counter */
ReinitItem->DriverObject->DriverExtension->Count++;
/* Remove the device object flag */
ReinitItem->DriverObject->Flags &= ~DRVO_BOOTREINIT_REGISTERED;
ReinitItem->ReinitRoutine(ReinitItem->DriverObject,
ReinitItem->Context,
ReinitItem->DriverObject->DriverExtension->Count);
/* Call the routine */
ReinitItem->ReinitRoutine(ReinitItem->DriverObject,
ReinitItem->Context,
ReinitItem->DriverObject->
DriverExtension->Count);
ExFreePool(Entry);
/* Free the entry */
ExFreePool(Entry);
if (Entry == DriverBootReinitTailEntry)
return;
}
/* Move to the next one */
Entry = ExInterlockedRemoveHeadList(&DriverBootReinitListHead,
&DriverBootReinitListLock);
}
}
/* PUBLIC FUNCTIONS ***********************************************************/
+5 -2
View File
@@ -457,6 +457,9 @@ IoInit2(BOOLEAN BootLog)
/* Load boot start drivers */
IopInitializeBootDrivers();
/* Call back drivers that asked for */
IopReinitializeBootDrivers();
}
VOID
@@ -490,8 +493,8 @@ IoInit3(VOID)
IopInitializeSystemDrivers();
IoDestroyDriverList();
/* Call back drivers that asked for */
IopReinitializeBootDrivers();
/* Reinitialize drivers that requested it */
IopReinitializeDrivers();
/* Stop boot logging */
IopStopBootLog();