From 519abb5b4aba50f540fec1f5ce3988d9c5e46f91 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Apr 2016 15:18:53 +0000 Subject: [PATCH] [NTOS:IO] - Avoid excessive stack usage in IopInitializeDriverModule. svn path=/trunk/; revision=71157 --- reactos/ntoskrnl/io/iomgr/driver.c | 33 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index d84eddc6784..22f5a4078ea 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -463,8 +463,7 @@ IopInitializeDriverModule( IN BOOLEAN FileSystemDriver, OUT PDRIVER_OBJECT *DriverObject) { - const WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"; - WCHAR NameBuffer[MAX_PATH]; + static const WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"; UNICODE_STRING DriverName; UNICODE_STRING RegistryKey; PDRIVER_INITIALIZE DriverEntry; @@ -477,7 +476,9 @@ IopInitializeDriverModule( { RegistryKey.Length = 0; RegistryKey.MaximumLength = sizeof(ServicesKeyName) + ServiceName->Length; - RegistryKey.Buffer = ExAllocatePool(PagedPool, RegistryKey.MaximumLength); + RegistryKey.Buffer = ExAllocatePoolWithTag(PagedPool, + RegistryKey.MaximumLength, + TAG_IO); if (RegistryKey.Buffer == NULL) { return STATUS_INSUFFICIENT_RESOURCES; @@ -487,26 +488,35 @@ IopInitializeDriverModule( } else { - RtlInitUnicodeString(&RegistryKey, NULL); + RtlInitEmptyUnicodeString(&RegistryKey, NULL, 0); } /* Create ModuleName string */ if (ServiceName && ServiceName->Length > 0) { + DriverName.Length = 0; + DriverName.MaximumLength = sizeof(FILESYSTEM_ROOT_NAME) + ServiceName->Length; + DriverName.Buffer = ExAllocatePoolWithTag(PagedPool, + DriverName.MaximumLength, + TAG_IO); + if (DriverName.Buffer == NULL) + { + RtlFreeUnicodeString(&RegistryKey); + return STATUS_INSUFFICIENT_RESOURCES; + } + if (FileSystemDriver != FALSE) - wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME); + RtlAppendUnicodeToString(&DriverName, FILESYSTEM_ROOT_NAME); else - wcscpy(NameBuffer, DRIVER_ROOT_NAME); - - RtlInitUnicodeString(&DriverName, NameBuffer); - DriverName.MaximumLength = sizeof(NameBuffer); - + RtlAppendUnicodeToString(&DriverName, DRIVER_ROOT_NAME); RtlAppendUnicodeStringToString(&DriverName, ServiceName); DPRINT("Driver name: '%wZ'\n", &DriverName); } else - DriverName.Length = 0; + { + RtlInitEmptyUnicodeString(&DriverName, NULL, 0); + } Status = IopCreateDriver(DriverName.Length > 0 ? &DriverName : NULL, DriverEntry, @@ -515,6 +525,7 @@ IopInitializeDriverModule( ModuleObject, &Driver); RtlFreeUnicodeString(&RegistryKey); + RtlFreeUnicodeString(&DriverName); *DriverObject = Driver; if (!NT_SUCCESS(Status))