Author: tfaber Date: Sat Sep 27 14:58:40 2014 New Revision: 64343
URL: http://svn.reactos.org/svn/reactos?rev=64343&view=rev Log: [NTOS:IO] - Correctly set DRIVER_EXTENSION::ServiceKeyName CORE-8566 #resolve
Modified: trunk/reactos/ntoskrnl/include/internal/io.h trunk/reactos/ntoskrnl/io/iomgr/driver.c
Modified: trunk/reactos/ntoskrnl/include/internal/io.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/i... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/io.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/io.h [iso-8859-1] Sat Sep 27 14:58:40 2014 @@ -1058,6 +1058,7 @@ IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL, IN PDRIVER_INITIALIZE InitializationFunction, IN PUNICODE_STRING RegistryPath, + IN PCUNICODE_STRING ServiceName, PLDR_DATA_TABLE_ENTRY ModuleObject, OUT PDRIVER_OBJECT *pDriverObject);
Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/driver.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/driver.c [iso-8859-1] Sat Sep 27 14:58:40 2014 @@ -90,14 +90,12 @@ ExFreePool(DriverObject->DriverName.Buffer); }
-#if 0 /* See a bit of hack in IopCreateDriver */ /* Check if it has a service key name */ if (DriverObject->DriverExtension->ServiceKeyName.Buffer) { /* Free it */ ExFreePool(DriverObject->DriverExtension->ServiceKeyName.Buffer); } -#endif }
NTSTATUS FASTCALL @@ -516,6 +514,7 @@ DriverName.Length > 0 ? &DriverName : NULL, DriverEntry, &RegistryKey, + ServiceName, ModuleObject, &Driver); RtlFreeUnicodeString(&RegistryKey); @@ -558,7 +557,7 @@ PLDR_DATA_TABLE_ENTRY ModuleObject; PDRIVER_OBJECT DriverObject; NTSTATUS Status; - + /* No filter value present */ if (ValueType == REG_NONE) return STATUS_SUCCESS; @@ -594,7 +593,7 @@
/* Remove extra reference */ ObDereferenceObject(DriverObject); - + if (!NT_SUCCESS(Status)) return Status; } @@ -663,7 +662,7 @@ NULL); if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to load device %s filters: %08X\n", + DPRINT1("Failed to load device %s filters: %08X\n", Lower ? "lower" : "upper", Status); ZwClose(SubKey); ZwClose(EnumRootKey); @@ -737,10 +736,10 @@ /* Clean up */ ZwClose(SubKey); ZwClose(EnumRootKey); - + if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to load class %s filters: %08X\n", + DPRINT1("Failed to load class %s filters: %08X\n", Lower ? "lower" : "upper", Status); ZwClose(SubKey); ZwClose(EnumRootKey); @@ -1479,6 +1478,7 @@ IopCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL, IN PDRIVER_INITIALIZE InitializationFunction, IN PUNICODE_STRING RegistryPath, + IN PCUNICODE_STRING ServiceName, PLDR_DATA_TABLE_ENTRY ModuleObject, OUT PDRIVER_OBJECT *pDriverObject) { @@ -1550,9 +1550,9 @@ }
/* Set up the service key name buffer */ - ServiceKeyName.Buffer = ExAllocatePoolWithTag(PagedPool, - LocalDriverName.Length + - sizeof(WCHAR), + ServiceKeyName.MaximumLength = ServiceName->Length + sizeof(UNICODE_NULL); + ServiceKeyName.Buffer = ExAllocatePoolWithTag(NonPagedPool, + ServiceKeyName.MaximumLength, TAG_IO); if (!ServiceKeyName.Buffer) { @@ -1562,21 +1562,26 @@ return STATUS_INSUFFICIENT_RESOURCES; }
- /* Fill out the key data and copy the buffer */ - ServiceKeyName.Length = LocalDriverName.Length; - ServiceKeyName.MaximumLength = LocalDriverName.MaximumLength; - RtlCopyMemory(ServiceKeyName.Buffer, - LocalDriverName.Buffer, - LocalDriverName.Length); - - /* Null-terminate it and set it */ - ServiceKeyName.Buffer[ServiceKeyName.Length / sizeof(WCHAR)] = UNICODE_NULL; + /* Copy the name and set it in the driver extension */ + RtlCopyUnicodeString(&ServiceKeyName, + ServiceName); DriverObject->DriverExtension->ServiceKeyName = ServiceKeyName;
- /* Also store it in the Driver Object. This is a bit of a hack. */ - RtlCopyMemory(&DriverObject->DriverName, - &ServiceKeyName, - sizeof(UNICODE_STRING)); + /* Make a copy of the driver name to store in the driver object */ + DriverObject->DriverName.MaximumLength = LocalDriverName.Length; + DriverObject->DriverName.Buffer = ExAllocatePoolWithTag(PagedPool, + DriverObject->DriverName.MaximumLength, + TAG_IO); + if (!DriverObject->DriverName.Buffer) + { + /* Fail */ + ObMakeTemporaryObject(DriverObject); + ObDereferenceObject(DriverObject); + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlCopyUnicodeString(&DriverObject->DriverName, + &LocalDriverName);
/* Add the Object and get its handle */ Status = ObInsertObject(DriverObject, @@ -1678,7 +1683,7 @@ IN PDRIVER_INITIALIZE InitializationFunction) { PDRIVER_OBJECT DriverObject; - return IopCreateDriver(DriverName, InitializationFunction, NULL, NULL, &DriverObject); + return IopCreateDriver(DriverName, InitializationFunction, NULL, DriverName, NULL, &DriverObject); }
/*