From cf9a86c858a7a9d392097c5b935c489c46c120f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Tue, 11 Oct 2005 13:35:07 +0000 Subject: [PATCH] Send the right LocaleId to device stack when querying the device description. Don't erase device description stored by setupapi during next reboot svn path=/trunk/; revision=18407 --- reactos/ntoskrnl/io/pnpmgr.c | 40 ++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index 89946f70070..e4fdd12b4f5 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -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,