[ACPI]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 29 Dec 2013 11:14:09 +0000 (11:14 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 29 Dec 2013 11:14:09 +0000 (11:14 +0000)
Take the processor information from HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0 and pass it to the device manager.
CORE-5960 #comment Still WIP.

svn path=/trunk/; revision=61461

reactos/drivers/bus/acpi/busmgr/bus.c
reactos/drivers/bus/acpi/buspdo.c
reactos/drivers/bus/acpi/include/acpisys.h
reactos/drivers/bus/acpi/main.c

index 51e51e8..7ca7ced 100644 (file)
@@ -1287,7 +1287,7 @@ acpi_bus_add (
        case ACPI_BUS_TYPE_PROCESSOR:
                hid = ACPI_PROCESSOR_HID;
                uid = static_uid_buffer;
-               sprintf(uid, "%d", (ProcessorCount++));
+               sprintf(uid, "_%d", (ProcessorCount++));
                break;
        case ACPI_BUS_TYPE_SYSTEM:
                hid = ACPI_SYSTEM_HID;
index c689313..b8ca6c9 100644 (file)
@@ -406,7 +406,7 @@ Bus_PDO_QueryDeviceId(
       PIRP   Irp )
 {
     PIO_STACK_LOCATION      stack;
-    PWCHAR                  buffer;
+    PWCHAR                  buffer, src;
     WCHAR                   temp[256];
     ULONG                   length;
     NTSTATUS                status = STATUS_SUCCESS;
@@ -490,15 +490,45 @@ Bus_PDO_QueryDeviceId(
         {
             acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
 
-            length += swprintf(&temp[length],
-                               L"ACPI\\%hs",
-                               Device->pnp.hardware_id);
-            length++;
+            DPRINT1("Device name: %s\n", Device->pnp.device_name);
+            DPRINT1("Hardware ID: %s\n", Device->pnp.hardware_id);
 
-            length += swprintf(&temp[length],
-                               L"*%hs",
-                               Device->pnp.hardware_id);
-            length++;
+            if (strcmp(Device->pnp.hardware_id, "Processor") == 0)
+            {
+/*
+                length += swprintf(&temp[length],
+                                   L"ACPI\\%s - %s",
+                                   ProcessorVendorIdentifier, ProcessorIdentifier);
+                length++;
+
+                length += swprintf(&temp[length],
+                                   L"*%s - %s",
+                                   ProcessorVendorIdentifier, ProcessorIdentifier);
+                length++;
+*/
+                length = ProcessorHardwareIds.Length / sizeof(WCHAR);
+                src = ProcessorHardwareIds.Buffer;
+            }
+            else
+            {
+                length += swprintf(&temp[length],
+                                   L"ACPI\\%hs",
+                                   Device->pnp.hardware_id);
+                length++;
+
+                length += swprintf(&temp[length],
+                                   L"*%hs",
+                                   Device->pnp.hardware_id);
+                length++;
+
+         temp[length] = UNICODE_NULL;
+
+         length++;
+
+         temp[length] = UNICODE_NULL;
+         src = temp;
+
+            }
          }
          else
          {
@@ -509,13 +539,15 @@ Bus_PDO_QueryDeviceId(
             length += swprintf(&temp[length],
                                L"*FixedButton");
             length++;
-         }
 
          temp[length] = UNICODE_NULL;
 
          length++;
 
          temp[length] = UNICODE_NULL;
+         src = temp;
+         }
+
 
         buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
 
@@ -524,11 +556,56 @@ Bus_PDO_QueryDeviceId(
            break;
         }
 
-        RtlCopyMemory (buffer, temp, length * sizeof(WCHAR));
+        RtlCopyMemory (buffer, src, length * sizeof(WCHAR));
         Irp->IoStatus.Information = (ULONG_PTR) buffer;
         DPRINT("BusQueryHardwareIDs: %ls\n",buffer);
         break;
 
+    case BusQueryCompatibleIDs:
+        length = 0;
+        status = STATUS_NOT_SUPPORTED;
+
+        /* See comment in BusQueryDeviceID case */
+        if (DeviceData->AcpiHandle)
+        {
+            acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+            if (strcmp(Device->pnp.hardware_id, "Processor") == 0)
+            {
+                DPRINT("Device name: %s\n", Device->pnp.device_name);
+                DPRINT("Hardware ID: %s\n", Device->pnp.hardware_id);
+
+                length += swprintf(&temp[length],
+                                   L"ACPI\\%hs",
+                                   Device->pnp.hardware_id);
+                length++;
+
+                length += swprintf(&temp[length],
+                                   L"*%hs",
+                                   Device->pnp.hardware_id);
+                length++;
+
+                temp[length] = UNICODE_NULL;
+
+                length++;
+
+                temp[length] = UNICODE_NULL;
+
+                buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
+                if (!buffer)
+                {
+                    status = STATUS_INSUFFICIENT_RESOURCES;
+                    break;
+                }
+
+                RtlCopyMemory (buffer, temp, length * sizeof(WCHAR));
+                Irp->IoStatus.Information = (ULONG_PTR) buffer;
+                DPRINT("BusQueryHardwareIDs: %ls\n",buffer);
+                status = STATUS_SUCCESS;
+            }
+        }
+        break;
+
     default:
         status = Irp->IoStatus.Status;
     }
@@ -604,7 +681,12 @@ Bus_PDO_QueryDeviceText(
            else if (wcsstr(DeviceData->HardwareIDs, L"ACPI_PWR") != 0)
             Temp = L"ACPI Power Resource";
            else if (wcsstr(DeviceData->HardwareIDs, L"Processor") != 0)
-            Temp = L"Processor";
+           {
+               if (ProcessorNameString != NULL)
+                   Temp = ProcessorNameString;
+               else
+                   Temp = L"Processor";
+           }
            else if (wcsstr(DeviceData->HardwareIDs, L"ThermalZone") != 0)
             Temp = L"ACPI Thermal Zone";
            else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0002") != 0)
index eb171f1..e1f8fa5 100644 (file)
@@ -3,6 +3,10 @@
  * FILE:    acpi/ospm/include/acpisys.h
  * PURPOSE: ACPI bus driver definitions
  */
+
+extern UNICODE_STRING ProcessorHardwareIds;
+extern LPWSTR ProcessorNameString;
+
 typedef enum _DEVICE_PNP_STATE {
 
     NotStarted = 0,         // Not started yet
index a208b4f..cafba70 100644 (file)
@@ -28,6 +28,10 @@ DriverEntry (
 extern struct acpi_device *sleep_button;
 extern struct acpi_device *power_button;
 
+UNICODE_STRING ProcessorHardwareIds = {0, 0, NULL};
+LPWSTR ProcessorNameString = NULL;
+
+
 NTSTATUS
 NTAPI
 Bus_AddDevice(
@@ -332,6 +336,285 @@ ACPIDispatchDeviceControl(
     return status;
 }
 
+static
+NTSTATUS
+AcpiRegOpenKey(IN HANDLE ParentKeyHandle,
+               IN LPCWSTR KeyName,
+               IN ACCESS_MASK DesiredAccess,
+               OUT HANDLE KeyHandle)
+{
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    UNICODE_STRING Name;
+
+    RtlInitUnicodeString(&Name, KeyName);
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &Name,
+                               OBJ_CASE_INSENSITIVE,
+                               ParentKeyHandle,
+                               NULL);
+
+    return ZwOpenKey(KeyHandle,
+                     DesiredAccess,
+                     &ObjectAttributes);
+}
+
+static
+NTSTATUS
+AcpiRegQueryValue(IN HANDLE KeyHandle,
+                  IN LPWSTR ValueName,
+                  OUT PULONG Type OPTIONAL,
+                  OUT PVOID Data OPTIONAL,
+                  IN OUT PULONG DataLength OPTIONAL)
+{
+    PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
+    UNICODE_STRING Name;
+    ULONG BufferLength = 0;
+    NTSTATUS Status;
+
+    RtlInitUnicodeString(&Name,
+                         ValueName);
+
+    if (DataLength != NULL)
+        BufferLength = *DataLength;
+
+    BufferLength += FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
+
+    /* Allocate memory for the value */
+    ValueInfo = ExAllocatePoolWithTag(PagedPool, BufferLength, 'IPCA');
+    if (ValueInfo == NULL)
+        return STATUS_NO_MEMORY;
+
+    /* Query the value */
+    Status = ZwQueryValueKey(KeyHandle,
+                             &Name,
+                             KeyValuePartialInformation,
+                             ValueInfo,
+                             BufferLength,
+                             &BufferLength);
+    if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
+    {
+        if (Type != NULL)
+            *Type = ValueInfo->Type;
+
+        if (DataLength != NULL)
+            *DataLength = ValueInfo->DataLength;
+    }
+
+    /* Check if the caller wanted data back, and we got it */
+    if ((NT_SUCCESS(Status)) && (Data != NULL))
+    {
+        /* Copy it */
+        RtlMoveMemory(Data,
+                      ValueInfo->Data,
+                      ValueInfo->DataLength);
+
+        /* if the type is REG_SZ and data is not 0-terminated
+         * and there is enough space in the buffer NT appends a \0 */
+        if (((ValueInfo->Type == REG_SZ) || (ValueInfo->Type == REG_EXPAND_SZ) || (ValueInfo->Type == REG_MULTI_SZ)) &&
+            (ValueInfo->DataLength <= *DataLength - sizeof(WCHAR)))
+        {
+            WCHAR *ptr = (WCHAR *)((ULONG_PTR)Data + ValueInfo->DataLength);
+            if ((ptr > (WCHAR *)Data) && ptr[-1])
+                *ptr = 0;
+        }
+    }
+
+    /* Free the memory and return status */
+    ExFreePoolWithTag(ValueInfo, 'IPCA');
+
+    if ((Data == NULL) && (Status == STATUS_BUFFER_OVERFLOW))
+        Status = STATUS_SUCCESS;
+
+    return Status;
+}
+
+static
+NTSTATUS
+GetProcessorInformation(VOID)
+{
+    LPWSTR ProcessorIdentifier = NULL;
+    LPWSTR ProcessorVendorIdentifier = NULL;
+    LPWSTR HardwareIdsBuffer = NULL;
+    HANDLE ProcessorHandle = NULL;
+    ULONG Length, Level1Length = 0, Level2Length = 0, Level3Length = 0;
+    ULONG HardwareIdsLength = 0;
+    ULONG i;
+    PWCHAR Ptr;
+    NTSTATUS Status;
+
+    DPRINT1("GetProcessorInformation()\n");
+
+    Status = AcpiRegOpenKey(NULL,
+                            L"\\Registry\\Machine\\Hardware\\Description\\System\\CentralProcessor\\0",
+                            KEY_READ,
+                            &ProcessorHandle);
+    if (!NT_SUCCESS(Status))
+        goto done;
+
+    AcpiRegQueryValue(ProcessorHandle,
+                      L"Identifier",
+                      NULL,
+                      NULL,
+                      &Length);
+
+    if (Length != 0)
+    {
+        ProcessorIdentifier = ExAllocatePoolWithTag(PagedPool, Length, 'IPCA');
+        if (ProcessorIdentifier == NULL)
+        {
+            Status = STATUS_INSUFFICIENT_RESOURCES;
+            goto done;
+        }
+
+        Status = AcpiRegQueryValue(ProcessorHandle,
+                                   L"Identifier",
+                                   NULL,
+                                   ProcessorIdentifier,
+                                   &Length);
+        if (!NT_SUCCESS(Status))
+            goto done;
+
+        Length = 0;
+    }
+
+    AcpiRegQueryValue(ProcessorHandle,
+                      L"ProcessorNameString",
+                      NULL,
+                      NULL,
+                      &Length);
+
+    if (Length != 0)
+    {
+        ProcessorNameString = ExAllocatePoolWithTag(PagedPool, Length, 'IPCA');
+        if (ProcessorNameString == NULL)
+        {
+            Status = STATUS_INSUFFICIENT_RESOURCES;
+            goto done;
+        }
+
+        Status = AcpiRegQueryValue(ProcessorHandle,
+                                   L"ProcessorNameString",
+                                   NULL,
+                                   ProcessorNameString,
+                                   &Length);
+        if (!NT_SUCCESS(Status))
+            goto done;
+
+        Length = 0;
+    }
+
+    AcpiRegQueryValue(ProcessorHandle,
+                      L"VendorIdentifier",
+                      NULL,
+                      NULL,
+                      &Length);
+
+    if (Length != 0)
+    {
+        ProcessorVendorIdentifier = ExAllocatePoolWithTag(PagedPool, Length, 'IPCA');
+        if (ProcessorVendorIdentifier == NULL)
+        {
+            Status = STATUS_INSUFFICIENT_RESOURCES;
+            goto done;
+        }
+
+        Status = AcpiRegQueryValue(ProcessorHandle,
+                                   L"VendorIdentifier",
+                                   NULL,
+                                   ProcessorVendorIdentifier,
+                                   &Length);
+        if (!NT_SUCCESS(Status))
+            goto done;
+
+        Length = 0;
+    }
+
+    for (i = 0; i < wcslen(ProcessorIdentifier); i++)
+    {
+        if (ProcessorIdentifier[i] == L' ')
+            ProcessorIdentifier[i] = L'_';
+    }
+
+    Ptr = wcsstr(ProcessorIdentifier, L"Stepping");
+    if (Ptr != NULL)
+    {
+        Ptr--;
+        Level1Length = (ULONG)(Ptr - ProcessorIdentifier);
+    }
+
+    Ptr = wcsstr(ProcessorIdentifier, L"Model");
+    if (Ptr != NULL)
+    {
+        Ptr--;
+        Level2Length = (ULONG)(Ptr - ProcessorIdentifier);
+    }
+
+    Ptr = wcsstr(ProcessorIdentifier, L"Family");
+    if (Ptr != NULL)
+    {
+        Ptr--;
+        Level3Length = (ULONG)(Ptr - ProcessorIdentifier);
+    }
+
+    HardwareIdsLength = 5 + wcslen(ProcessorVendorIdentifier) + 3 + Level1Length + 1 +
+                        1 + wcslen(ProcessorVendorIdentifier) + 3 + Level1Length + 1 +
+                        5 + wcslen(ProcessorVendorIdentifier) + 3 + Level2Length + 1 +
+                        1 + wcslen(ProcessorVendorIdentifier) + 3 + Level2Length + 1 +
+                        5 + wcslen(ProcessorVendorIdentifier) + 3 + Level3Length + 1 +
+                        1 + wcslen(ProcessorVendorIdentifier) + 3 + Level3Length + 1 +
+                        2;
+
+    HardwareIdsBuffer = ExAllocatePoolWithTag(PagedPool, HardwareIdsLength * sizeof(WCHAR), 'IPCA');
+    if (HardwareIdsBuffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    Length = 0;
+    Length += swprintf(&HardwareIdsBuffer[Length], L"ACPI\\%s_-_%.*s", ProcessorVendorIdentifier, Level1Length, ProcessorIdentifier);
+    Length++;
+
+    Length += swprintf(&HardwareIdsBuffer[Length], L"*%s_-_%.*s", ProcessorVendorIdentifier, Level1Length, ProcessorIdentifier);
+    Length++;
+
+    Length += swprintf(&HardwareIdsBuffer[Length], L"ACPI\\%s_-_%.*s", ProcessorVendorIdentifier, Level2Length, ProcessorIdentifier);
+    Length++;
+
+    Length += swprintf(&HardwareIdsBuffer[Length], L"*%s_-_%.*s", ProcessorVendorIdentifier, Level2Length, ProcessorIdentifier);
+    Length++;
+
+    Length += swprintf(&HardwareIdsBuffer[Length], L"ACPI\\%s_-_%.*s", ProcessorVendorIdentifier, Level3Length, ProcessorIdentifier);
+    Length++;
+
+    Length += swprintf(&HardwareIdsBuffer[Length], L"*%s_-_%.*s", ProcessorVendorIdentifier, Level3Length, ProcessorIdentifier);
+    Length++;
+    HardwareIdsBuffer[Length] = UNICODE_NULL;
+
+    ProcessorHardwareIds.Length = HardwareIdsLength * sizeof(WCHAR);
+    ProcessorHardwareIds.MaximumLength = ProcessorHardwareIds.Length;
+    ProcessorHardwareIds.Buffer = HardwareIdsBuffer;
+
+done:
+    if (ProcessorHandle != NULL)
+        ZwClose(ProcessorHandle);
+
+    if (ProcessorIdentifier != NULL)
+        ExFreePoolWithTag(ProcessorIdentifier, 'IPCA');
+
+    if (ProcessorVendorIdentifier != NULL)
+        ExFreePoolWithTag(ProcessorVendorIdentifier, 'IPCA');
+
+    if (!NT_SUCCESS(Status))
+    {
+        if (HardwareIdsBuffer != NULL)
+            ExFreePoolWithTag(HardwareIdsBuffer, 'IPCA');
+    }
+
+    return Status;
+}
+
 NTSTATUS
 NTAPI
 DriverEntry (
@@ -341,6 +624,8 @@ DriverEntry (
 {
     DPRINT("Driver Entry \n");
 
+    GetProcessorInformation();
+
     //
     // Set entry points into the driver
     //