Implement IRP_MJ_PNP / IRP_MN_QUERY_TEXT / DeviceTextDescription for
ACPI devices
Modified: trunk/reactos/drivers/bus/acpi/ospm/fdo.c
Modified: trunk/reactos/drivers/bus/acpi/ospm/include/acpisys.h
Modified: trunk/reactos/drivers/bus/acpi/ospm/pdo.c
_____
Modified: trunk/reactos/drivers/bus/acpi/ospm/fdo.c
--- trunk/reactos/drivers/bus/acpi/ospm/fdo.c 2005-10-03 12:39:50 UTC
(rev 18243)
+++ trunk/reactos/drivers/bus/acpi/ospm/fdo.c 2005-10-03 12:53:31 UTC
(rev 18244)
@@ -116,6 +116,52 @@
}
+BOOLEAN
+AcpiCreateDeviceDescriptionString(PUNICODE_STRING DeviceDescription,
+ BM_NODE *Node)
+{
+ PWSTR Buffer;
+
+ DPRINT1("'%s', '%s', %ld\n", Node->device.id.hid,
"PNP040",
RtlCompareMemory(Node->device.id.hid, "PNP040", 6));
+ if (RtlCompareMemory(Node->device.id.hid, "PNP000", 6) == 6)
+ Buffer = L"Programmable interrupt controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP010", 6) == 6)
+ Buffer = L"System timer";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP020", 6) == 6)
+ Buffer = L"DMA controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP03", 5) == 5)
+ Buffer = L"Keyboard";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP040", 6) == 6)
+ Buffer = L"Parallel port";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP05", 5) == 5)
+ Buffer = L"Serial port";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP06", 5) ==5)
+ Buffer = L"Disk controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP07", 5) == 5)
+ Buffer = L"Disk controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP09", 5) == 5)
+ Buffer = L"Display adapter";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP0A0", 6) == 6)
+ Buffer = L"Bus controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP0E0", 6) == 6)
+ Buffer = L"PCMCIA controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP0F", 5) == 5)
+ Buffer = L"Mouse device";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNP8", 4) == 4)
+ Buffer = L"Network adapter";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNPA0", 5) == 5)
+ Buffer = L"SCSI controller";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNPB0", 5) == 5)
+ Buffer = L"Multimedia device";
+ else if (RtlCompareMemory(Node->device.id.hid, "PNPC00", 6) == 6)
+ Buffer = L"Modem";
+ else
+ Buffer = L"Other ACPI device";
+
+ return AcpiCreateUnicodeString(DeviceDescription, Buffer, PagedPool);
+}
+
+
static BOOLEAN
AcpiCreateResourceList(PCM_RESOURCE_LIST* pResourceList,
PULONG ResourceListSize,
@@ -460,6 +506,15 @@
// ErrorOccurred = TRUE;
// break;
}
+
+ if
(!AcpiCreateDeviceDescriptionString(&PdoDeviceExtension->DeviceDescripti
on,
+ Node))
+ {
+ ASSERT(FALSE);
+// ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
+// ErrorOccurred = TRUE;
+// break;
+ }
}
}
_____
Modified: trunk/reactos/drivers/bus/acpi/ospm/include/acpisys.h
--- trunk/reactos/drivers/bus/acpi/ospm/include/acpisys.h
2005-10-03 12:39:50 UTC (rev 18243)
+++ trunk/reactos/drivers/bus/acpi/ospm/include/acpisys.h
2005-10-03 12:53:31 UTC (rev 18244)
@@ -47,6 +47,8 @@
UNICODE_STRING InstanceID;
// Hardware IDs
UNICODE_STRING HardwareIDs;
+ // Textual description of device
+ UNICODE_STRING DeviceDescription;
// Resource list
PCM_RESOURCE_LIST ResourceList;
ULONG ResourceListSize;
_____
Modified: trunk/reactos/drivers/bus/acpi/ospm/pdo.c
--- trunk/reactos/drivers/bus/acpi/ospm/pdo.c 2005-10-03 12:39:50 UTC
(rev 18243)
+++ trunk/reactos/drivers/bus/acpi/ospm/pdo.c 2005-10-03 12:53:31 UTC
(rev 18244)
@@ -43,6 +43,46 @@
static NTSTATUS
+PdoQueryDeviceText(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ PIO_STACK_LOCATION IrpSp)
+{
+ PPDO_DEVICE_EXTENSION DeviceExtension;
+ PWSTR Buffer;
+ NTSTATUS Status;
+
+ DPRINT("Called\n");
+
+ DeviceExtension =
(PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ Status = STATUS_SUCCESS;
+
+ switch (IrpSp->Parameters.QueryDeviceText.DeviceTextType)
+ {
+ case DeviceTextDescription:
+ DPRINT("DeviceTextDescription\n");
+ Buffer = (PWSTR)ExAllocatePool(PagedPool,
DeviceExtension->DeviceDescription.Length + sizeof(UNICODE_NULL));
+ if (Buffer == NULL)
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ else
+ {
+ RtlCopyMemory(Buffer,
DeviceExtension->DeviceDescription.Buffer,
DeviceExtension->DeviceDescription.Length);
+ Buffer[DeviceExtension->DeviceDescription.Length /
sizeof(WCHAR)] = UNICODE_NULL;
+ Irp->IoStatus.Information = (ULONG_PTR)Buffer;
+ }
+ break;
+
+ default:
+ Irp->IoStatus.Information = 0;
+ Status = STATUS_INVALID_PARAMETER;
+ }
+
+ return Status;
+}
+
+
+static NTSTATUS
PdoQueryId(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
@@ -241,6 +281,7 @@
break;
case IRP_MN_QUERY_DEVICE_TEXT:
+ Status = PdoQueryDeviceText(DeviceObject, Irp, IrpSp);
break;
case IRP_MN_QUERY_ID: