mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[ACPI]
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
This commit is contained in:
parent
f0b87d5d81
commit
d58a6b4456
4 changed files with 384 additions and 13 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue