don't leak the registry path string after initializing a driver
Modified: trunk/reactos/drivers/video/videoprt/videoprt.c
Modified: trunk/reactos/ntoskrnl/io/driver.c

Modified: trunk/reactos/drivers/video/videoprt/videoprt.c
--- trunk/reactos/drivers/video/videoprt/videoprt.c	2005-05-05 22:40:05 UTC (rev 15027)
+++ trunk/reactos/drivers/video/videoprt/videoprt.c	2005-05-06 00:07:05 UTC (rev 15028)
@@ -587,8 +587,27 @@
    }
    DriverExtension->HwContext = HwContext;
 
-   RtlCopyMemory(&DriverExtension->RegistryPath, RegistryPath, sizeof(UNICODE_STRING));
+   /* we can't use RtlDuplicateUnicodeString because only ntdll exposes it... */
+   if (RegistryPath->Length != 0)
+   {
+      DriverExtension->RegistryPath.Length = 0;
+      DriverExtension->RegistryPath.MaximumLength = RegistryPath->Length + sizeof(UNICODE_NULL);
+      DriverExtension->RegistryPath.Buffer = ExAllocatePoolWithTag(PagedPool,
+                                                                   DriverExtension->RegistryPath.MaximumLength,
+                                                                   TAG('U', 'S', 'T', 'R'));
+      if (DriverExtension->RegistryPath.Buffer == NULL)
+      {
+         RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
+         return STATUS_INSUFFICIENT_RESOURCES;
+      }
 
+      RtlCopyUnicodeString(&DriverExtension->RegistryPath, RegistryPath);
+   }
+   else
+   {
+      RtlInitUnicodeString(&DriverExtension->RegistryPath, NULL);
+   }
+
    switch (HwInitializationData->HwInitDataSize)
    {
       /*

Modified: trunk/reactos/ntoskrnl/io/driver.c
--- trunk/reactos/ntoskrnl/io/driver.c	2005-05-05 22:40:05 UTC (rev 15027)
+++ trunk/reactos/ntoskrnl/io/driver.c	2005-05-06 00:07:05 UTC (rev 15028)
@@ -544,10 +544,29 @@
    IN BOOLEAN FileSystemDriver,
    OUT PDRIVER_OBJECT *DriverObject)
 {
+   const WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
    UNICODE_STRING RegistryKey;
-   PDRIVER_INITIALIZE DriverEntry = ModuleObject->EntryPoint;
+   PDRIVER_INITIALIZE DriverEntry;
    NTSTATUS Status;
-   WCHAR ServicesKeyName[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
+   
+   DriverEntry = ModuleObject->EntryPoint;
+   
+   if (ServiceName != NULL && ServiceName->Length != 0)
+   {
+      RegistryKey.Length = 0;
+      RegistryKey.MaximumLength = sizeof(ServicesKeyName) + ServiceName->Length;
+      RegistryKey.Buffer = ExAllocatePool(PagedPool, RegistryKey.MaximumLength);
+      if (RegistryKey.Buffer == NULL)
+      {
+         return STATUS_INSUFFICIENT_RESOURCES;
+      }
+      RtlAppendUnicodeToString(&RegistryKey, ServicesKeyName);
+      RtlAppendUnicodeStringToString(&RegistryKey, ServiceName);
+   }
+   else
+   {
+      RtlInitUnicodeString(&RegistryKey, NULL);
+   }
 
    Status = IopCreateDriverObject(
       DriverObject,
@@ -563,26 +582,15 @@
       return Status;
    }
 
-   if (ServiceName->Buffer)
-   {
-      RegistryKey.Length = ServiceName->Length +
-         sizeof(ServicesKeyName) - sizeof(UNICODE_NULL);
-      RegistryKey.MaximumLength = RegistryKey.Length + sizeof(UNICODE_NULL);
-      RegistryKey.Buffer = ExAllocatePool(PagedPool, RegistryKey.MaximumLength);
-      wcscpy(RegistryKey.Buffer, ServicesKeyName);
-      wcscat(RegistryKey.Buffer, ServiceName->Buffer);
-   }
-   else
-   {
-      RtlInitUnicodeString(&RegistryKey, NULL);
-   }
-
    DPRINT("RegistryKey: %wZ\n", &RegistryKey);
    DPRINT("Calling driver entrypoint at %08lx\n", DriverEntry);
 
    IopMarkLastReinitializeDriver();
 
    Status = DriverEntry(*DriverObject, &RegistryKey);
+   
+   RtlFreeUnicodeString(&RegistryKey);
+   
    if (!NT_SUCCESS(Status))
    {
       ObMakeTemporaryObject(*DriverObject);