Don't create a new DriverObject if one is already existing Modified: trunk/reactos/ntoskrnl/include/internal/io.h Modified: trunk/reactos/ntoskrnl/io/driver.c Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c _____
Modified: trunk/reactos/ntoskrnl/include/internal/io.h --- trunk/reactos/ntoskrnl/include/internal/io.h 2005-05-19 19:53:01 UTC (rev 15413) +++ trunk/reactos/ntoskrnl/include/internal/io.h 2005-05-19 22:02:34 UTC (rev 15414) @@ -518,6 +518,12 @@
ULONG DriverImageSize);
NTSTATUS FASTCALL +IopGetDriverObject( + PDRIVER_OBJECT *DriverObject, + PUNICODE_STRING ServiceName, + BOOLEAN FileSystem); + +NTSTATUS FASTCALL IopLoadServiceModule( IN PUNICODE_STRING ServiceName, OUT PMODULE_OBJECT *ModuleObject); _____
Modified: trunk/reactos/ntoskrnl/io/driver.c --- trunk/reactos/ntoskrnl/io/driver.c 2005-05-19 19:53:01 UTC (rev 15413) +++ trunk/reactos/ntoskrnl/io/driver.c 2005-05-19 22:02:34 UTC (rev 15414) @@ -152,6 +152,64 @@
}
NTSTATUS FASTCALL +IopGetDriverObject( + PDRIVER_OBJECT *DriverObject, + PUNICODE_STRING ServiceName, + BOOLEAN FileSystem) +{ + PDRIVER_OBJECT Object; + WCHAR NameBuffer[MAX_PATH]; + UNICODE_STRING DriverName; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + + DPRINT("IopOpenDriverObject(%p '%wZ' %x)\n", + DriverObject, ServiceName, FileSystem); + + *DriverObject = NULL; + + /* Create ModuleName string */ + if (ServiceName == NULL || ServiceName->Buffer == NULL) + /* We don't know which DriverObject we have to open */ + return STATUS_INVALID_PARAMETER_2; + + if (FileSystem == TRUE) + wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME); + else + wcscpy(NameBuffer, DRIVER_ROOT_NAME); + wcscat(NameBuffer, ServiceName->Buffer); + + RtlInitUnicodeString(&DriverName, NameBuffer); + DPRINT("Driver name: '%wZ'\n", &DriverName); + + /* Initialize ObjectAttributes for driver object */ + InitializeObjectAttributes( + &ObjectAttributes, + &DriverName, + OBJ_OPENIF | OBJ_KERNEL_HANDLE, + NULL, + NULL); + + /* Open driver object */ + Status = ObReferenceObjectByName( + &DriverName, + 0, /* Attributes */ + NULL, /* PassedAccessState */ + 0, /* DesiredAccess */ + IoDriverObjectType, + KernelMode, + NULL, /* ParseContext */ + (PVOID*)&Object); + + if (!NT_SUCCESS(Status)) + return Status; + + *DriverObject = Object; + + return STATUS_SUCCESS; +} + +NTSTATUS FASTCALL IopCreateDriverObject( PDRIVER_OBJECT *DriverObject, PUNICODE_STRING ServiceName, @@ -229,18 +287,8 @@ { return Status; } - - /* This function shouldn't be called twice for the same driver anyways..why is it? */ -#if 0 - if (Status == STATUS_OBJECT_EXISTS) - { - /* The driver object already exists, so it is already - * initialized. Don't initialize it once more. */ - *DriverObject = Object; - return STATUS_SUCCESS; - } -#endif - /* Create driver extension */ + + /* Create driver extension */ Object->DriverExtension = (PDRIVER_EXTENSION) ExAllocatePoolWithTag( NonPagedPool, @@ -652,13 +700,10 @@ else { /* get existing DriverObject pointer */ - Status = IopCreateDriverObject( + Status = IopGetDriverObject( &DriverObject, &ServiceName, - OBJ_OPENIF, - FALSE, - ModuleObject->Base, - ModuleObject->Length); + FALSE); if (!NT_SUCCESS(Status)) continue; } _____
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c --- trunk/reactos/ntoskrnl/io/pnpmgr.c 2005-05-19 19:53:01 UTC (rev 15413) +++ trunk/reactos/ntoskrnl/io/pnpmgr.c 2005-05-19 22:02:34 UTC (rev 15414) @@ -1668,13 +1668,10 @@
else { /* get existing DriverObject pointer */ - Status = IopCreateDriverObject( - &DriverObject, - &DeviceNode->ServiceName, - OBJ_OPENIF, - FALSE, - ModuleObject->Base, - ModuleObject->Length); + Status = IopGetDriverObject( + &DriverObject, + &DeviceNode->ServiceName, + FALSE); } if (NT_SUCCESS(Status)) {