Author: tfaber
Date: Thu Apr 14 15:18:53 2016
New Revision: 71157

URL: http://svn.reactos.org/svn/reactos?rev=71157&view=rev
Log:
[NTOS:IO]
- Avoid excessive stack usage in IopInitializeDriverModule.

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/driver.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?rev=71157&r1=71156&r2=71157&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/driver.c    [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/driver.c    [iso-8859-1] Thu Apr 14 
15:18:53 2016
@@ -463,8 +463,7 @@
     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 @@
     {
         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 @@
     }
     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 @@
                              ModuleObject,
                              &Driver);
     RtlFreeUnicodeString(&RegistryKey);
+    RtlFreeUnicodeString(&DriverName);
 
     *DriverObject = Driver;
     if (!NT_SUCCESS(Status))


Reply via email to