From 2e828da9a292d48a891a534a5180ee355205979b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Thu, 19 May 2005 22:02:34 +0000 Subject: [PATCH] Don't create a new DriverObject if one is already existing svn path=/trunk/; revision=15414 --- reactos/ntoskrnl/include/internal/io.h | 6 ++ reactos/ntoskrnl/io/driver.c | 79 ++++++++++++++++++++------ reactos/ntoskrnl/io/pnpmgr.c | 11 ++-- 3 files changed, 72 insertions(+), 24 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index c5bde62b364..0b40de614dc 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -517,6 +517,12 @@ IopCreateDriverObject( PVOID DriverImageStart, ULONG DriverImageSize); +NTSTATUS FASTCALL +IopGetDriverObject( + PDRIVER_OBJECT *DriverObject, + PUNICODE_STRING ServiceName, + BOOLEAN FileSystem); + NTSTATUS FASTCALL IopLoadServiceModule( IN PUNICODE_STRING ServiceName, diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index 1fed5a0cdfc..8164b4e4c6e 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -151,6 +151,64 @@ IopDeleteDriver(PVOID ObjectBody) KfLowerIrql(OldIrql); } +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, @@ -229,18 +287,8 @@ IopCreateDriverObject( { 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 @@ IopAttachFilterDriversCallback( else { /* get existing DriverObject pointer */ - Status = IopCreateDriverObject( + Status = IopGetDriverObject( &DriverObject, &ServiceName, - OBJ_OPENIF, - FALSE, - ModuleObject->Base, - ModuleObject->Length); + FALSE); if (!NT_SUCCESS(Status)) continue; } diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 60e5b137677..b89b4f5bcff 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1668,13 +1668,10 @@ IopActionInitChildServices( 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)) {