- Set DRVO_INITAILIZED flag for intiailized driver objects.

- Loop the list of devices created by the driver's DriverEntry and remove the DO_DEVICE_INITIALIZING flag.

svn path=/trunk/; revision=23324
This commit is contained in:
Alex Ionescu 2006-07-27 19:56:38 +00:00
parent 6e6d9ed927
commit bef11ebb29

View file

@ -571,6 +571,8 @@ IopInitializeDriverModule(
const WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
UNICODE_STRING RegistryKey;
PDRIVER_INITIALIZE DriverEntry;
PDRIVER_OBJECT Driver;
PDEVICE_OBJECT DeviceObject;
NTSTATUS Status;
DriverEntry = ModuleObject->EntryPoint;
@ -593,13 +595,13 @@ IopInitializeDriverModule(
}
Status = IopCreateDriverObject(
DriverObject,
&Driver,
ServiceName,
0,
FileSystemDriver,
ModuleObject->DllBase,
ModuleObject->SizeOfImage);
*DriverObject = Driver;
if (!NT_SUCCESS(Status))
{
DPRINT("IopCreateDriverObject failed (Status %x)\n", Status);
@ -609,19 +611,29 @@ IopInitializeDriverModule(
DPRINT("RegistryKey: %wZ\n", &RegistryKey);
DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry);
Status = DriverEntry(*DriverObject, &RegistryKey);
Status = DriverEntry(Driver, &RegistryKey);
RtlFreeUnicodeString(&RegistryKey);
if (!NT_SUCCESS(Status))
{
ObMakeTemporaryObject(*DriverObject);
ObDereferenceObject(*DriverObject);
ObMakeTemporaryObject(Driver);
ObDereferenceObject(Driver);
return Status;
}
IopReinitializeDrivers();
/* Set the driver as initialized */
Driver->Flags |= DRVO_INITIALIZED;
DeviceObject = Driver->DeviceObject;
while (DeviceObject)
{
/* Set every device as initialized too */
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
DeviceObject = DeviceObject->NextDevice;
}
return STATUS_SUCCESS;
}