Send the right LocaleId to device stack when querying the device description.
Don't erase device description stored by setupapi during next reboot
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c

Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c
--- trunk/reactos/ntoskrnl/io/pnpmgr.c	2005-10-11 03:23:01 UTC (rev 18406)
+++ trunk/reactos/ntoskrnl/io/pnpmgr.c	2005-10-11 13:35:07 UTC (rev 18407)
@@ -1475,6 +1475,8 @@
    PWSTR Ptr;
    USHORT Length;
    USHORT TotalLength;
+   ULONG RequiredLength;
+   LCID LocaleId;
    HANDLE InstanceKey = NULL;
    UNICODE_STRING ValueName;
    UNICODE_STRING ParentIdPrefix = { 0 };
@@ -1508,6 +1510,14 @@
       return STATUS_UNSUCCESSFUL;
    }
 
+   /* Get Locale ID */
+   Status = ZwQueryDefaultLocale(FALSE, &LocaleId);
+   if (!NT_SUCCESS(Status))
+   {
+      DPRINT("ZwQueryDefaultLocale() failed with status 0x%lx\n", Status);
+      return Status;
+   }
+
    /*
     * FIXME: For critical errors, cleanup and disable device, but always
     * return STATUS_SUCCESS.
@@ -1735,7 +1745,7 @@
    DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextDescription to device stack\n");
 
    Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextDescription;
-   Stack.Parameters.QueryDeviceText.LocaleId = 0; /* FIXME */
+   Stack.Parameters.QueryDeviceText.LocaleId = LocaleId;
    Status = IopInitiatePnpIrp(
       DeviceNode->PhysicalDeviceObject,
       &IoStatusBlock,
@@ -1743,18 +1753,22 @@
       &Stack);
    if (NT_SUCCESS(Status))
    {
-      RtlInitUnicodeString(&ValueName,
-			   L"DeviceDesc");
-      Status = ZwSetValueKey(InstanceKey,
-			     &ValueName,
-			     0,
-			     REG_SZ,
-			     (PVOID)IoStatusBlock.Information,
-			     (wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR));
+      RtlInitUnicodeString(&ValueName, L"DeviceDesc");
+      if (ZwQueryValueKey(InstanceKey, &ValueName, KeyValueBasicInformation, NULL, 0, &RequiredLength) == STATUS_OBJECT_NAME_NOT_FOUND)
+      {
+         /* This key is overriden when a driver is installed. Don't write the
+          * new description if another one already exists */
+         Status = ZwSetValueKey(InstanceKey,
+                                &ValueName,
+                                0,
+                                REG_SZ,
+                                (PVOID)IoStatusBlock.Information,
+                                (wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR));
+      }
       if (!NT_SUCCESS(Status))
-	{
-	   DPRINT1("ZwSetValueKey() failed (Status %lx)\n", Status);
-	}
+      {
+         DPRINT1("ZwSetValueKey() failed (Status 0x%lx)\n", Status);
+     }
    }
    else
    {
@@ -1764,7 +1778,7 @@
    DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextLocation to device stack\n");
 
    Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextLocationInformation;
-   Stack.Parameters.QueryDeviceText.LocaleId = 0; // FIXME
+   Stack.Parameters.QueryDeviceText.LocaleId = LocaleId;
    Status = IopInitiatePnpIrp(
       DeviceNode->PhysicalDeviceObject,
       &IoStatusBlock,