- 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\\"; const WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
UNICODE_STRING RegistryKey; UNICODE_STRING RegistryKey;
PDRIVER_INITIALIZE DriverEntry; PDRIVER_INITIALIZE DriverEntry;
PDRIVER_OBJECT Driver;
PDEVICE_OBJECT DeviceObject;
NTSTATUS Status; NTSTATUS Status;
DriverEntry = ModuleObject->EntryPoint; DriverEntry = ModuleObject->EntryPoint;
@ -593,13 +595,13 @@ IopInitializeDriverModule(
} }
Status = IopCreateDriverObject( Status = IopCreateDriverObject(
DriverObject, &Driver,
ServiceName, ServiceName,
0, 0,
FileSystemDriver, FileSystemDriver,
ModuleObject->DllBase, ModuleObject->DllBase,
ModuleObject->SizeOfImage); ModuleObject->SizeOfImage);
*DriverObject = Driver;
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("IopCreateDriverObject failed (Status %x)\n", Status); DPRINT("IopCreateDriverObject failed (Status %x)\n", Status);
@ -609,19 +611,29 @@ IopInitializeDriverModule(
DPRINT("RegistryKey: %wZ\n", &RegistryKey); DPRINT("RegistryKey: %wZ\n", &RegistryKey);
DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry); DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry);
Status = DriverEntry(*DriverObject, &RegistryKey); Status = DriverEntry(Driver, &RegistryKey);
RtlFreeUnicodeString(&RegistryKey); RtlFreeUnicodeString(&RegistryKey);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ObMakeTemporaryObject(*DriverObject); ObMakeTemporaryObject(Driver);
ObDereferenceObject(*DriverObject); ObDereferenceObject(Driver);
return Status; return Status;
} }
IopReinitializeDrivers(); 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; return STATUS_SUCCESS;
} }