Send the right LocaleId to device stack when querying the device description.
authorHervé Poussineau <hpoussin@reactos.org>
Tue, 11 Oct 2005 13:35:07 +0000 (13:35 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Tue, 11 Oct 2005 13:35:07 +0000 (13:35 +0000)
Don't erase device description stored by setupapi during next reboot

svn path=/trunk/; revision=18407

reactos/ntoskrnl/io/pnpmgr.c

index 89946f7..e4fdd12 100644 (file)
@@ -1475,6 +1475,8 @@ IopActionInterrogateDeviceStack(
    PWSTR Ptr;
    USHORT Length;
    USHORT TotalLength;
+   ULONG RequiredLength;
+   LCID LocaleId;
    HANDLE InstanceKey = NULL;
    UNICODE_STRING ValueName;
    UNICODE_STRING ParentIdPrefix = { 0 };
@@ -1508,6 +1510,14 @@ IopActionInterrogateDeviceStack(
       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 @@ IopActionInterrogateDeviceStack(
    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 @@ IopActionInterrogateDeviceStack(
       &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 @@ IopActionInterrogateDeviceStack(
    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,