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/…
==============================================================================
--- 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);
}
/*