-#include <ntddk.h>
-
-#include <acpi.h>
-#include <acpisys.h>
-#include <wdmguid.h>
-#include <stdio.h>
-
-#include <acpi_bus.h>
-#include <acpi_drivers.h>
+#include "precomp.h"
#include <initguid.h>
#include <poclass.h>
}
status = STATUS_SUCCESS;// We must not fail this IRP.
break;
+
+ case IRP_MN_REMOVE_DEVICE:
+ //
+ // We handle REMOVE_DEVICE just like STOP_DEVICE. This is because
+ // the device is still physically present (or at least we don't know any better)
+ // so we have to retain the PDO after stopping and removing power from it.
+ //
+ if (DeviceData->InterfaceName.Length != 0)
+ IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE);
+
+ if (DeviceData->AcpiHandle && acpi_bus_power_manageable(DeviceData->AcpiHandle) &&
+ !ACPI_SUCCESS(acpi_bus_set_power(DeviceData->AcpiHandle, ACPI_STATE_D3)))
+ {
+ DPRINT1("Device %x failed to enter D3!\n", DeviceData->AcpiHandle);
+ state.DeviceState = PowerDeviceD3;
+ PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state);
+ DeviceData->Common.DevicePowerState = PowerDeviceD3;
+ }
+
+ SET_NEW_PNP_STATE(DeviceData->Common, Stopped);
+ status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_QUERY_REMOVE_DEVICE:
+ SET_NEW_PNP_STATE(DeviceData->Common, RemovalPending);
+ status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_CANCEL_REMOVE_DEVICE:
+ if (RemovalPending == DeviceData->Common.DevicePnPState)
+ {
+ RESTORE_PREVIOUS_PNP_STATE(DeviceData->Common);
+ }
+ status = STATUS_SUCCESS;
+ break;
+
case IRP_MN_QUERY_CAPABILITIES:
//
PIRP Irp )
{
PIO_STACK_LOCATION stack;
- PWCHAR buffer;
+ PWCHAR buffer, src;
WCHAR temp[256];
- ULONG length;
+ ULONG length, i;
NTSTATUS status = STATUS_SUCCESS;
struct acpi_device *Device;
switch (stack->Parameters.QueryId.IdType) {
case BusQueryDeviceID:
+
+ /* This is a REG_SZ value */
+
if (DeviceData->AcpiHandle)
{
acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
L"ACPI\\FixedButton");
}
- temp[++length] = UNICODE_NULL;
+ temp[length++] = UNICODE_NULL;
- buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
+ NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
+
+ buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
if (!buffer) {
status = STATUS_INSUFFICIENT_RESOURCES;
break;
case BusQueryInstanceID:
+
+ /* This is a REG_SZ value */
+
/* See comment in BusQueryDeviceID case */
if(DeviceData->AcpiHandle)
{
length = swprintf(temp, L"%ls", L"0000");
}
else
+ {
/* FIXME: Generate unique id! */
length = swprintf(temp, L"%ls", L"0000");
+ }
+
+ temp[length++] = UNICODE_NULL;
- temp[++length] = UNICODE_NULL;
+ NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
- buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof (WCHAR), 'IPCA');
+ buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
if (!buffer) {
status = STATUS_INSUFFICIENT_RESOURCES;
break;
break;
case BusQueryHardwareIDs:
+
+ /* This is a REG_MULTI_SZ value */
length = 0;
+ status = STATUS_NOT_SUPPORTED;
/* See comment in BusQueryDeviceID case */
if (DeviceData->AcpiHandle)
{
acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+ if (!Device->flags.hardware_id)
+ {
+ /* We don't have the ID to satisfy this request */
+ break;
+ }
- length += swprintf(&temp[length],
- L"ACPI\\%hs",
- Device->pnp.hardware_id);
- length++;
+ DPRINT("Device name: %s\n", Device->pnp.device_name);
+ DPRINT("Hardware ID: %s\n", Device->pnp.hardware_id);
- length += swprintf(&temp[length],
- L"*%hs",
- Device->pnp.hardware_id);
- length++;
- }
- else
- {
+ if (strcmp(Device->pnp.hardware_id, "Processor") == 0)
+ {
+ length = ProcessorHardwareIds.Length / sizeof(WCHAR);
+ src = ProcessorHardwareIds.Buffer;
+ }
+ else
+ {
+ length += swprintf(&temp[length],
+ L"ACPI\\%hs",
+ Device->pnp.hardware_id);
+ temp[length++] = UNICODE_NULL;
+
+ length += swprintf(&temp[length],
+ L"*%hs",
+ Device->pnp.hardware_id);
+ temp[length++] = UNICODE_NULL;
+ temp[length++] = UNICODE_NULL;
+ src = temp;
+ }
+ }
+ else
+ {
length += swprintf(&temp[length],
L"ACPI\\FixedButton");
- length++;
+ temp[length++] = UNICODE_NULL;
length += swprintf(&temp[length],
L"*FixedButton");
- length++;
- }
-
- temp[length] = UNICODE_NULL;
-
- length++;
+ temp[length++] = UNICODE_NULL;
+ temp[length++] = UNICODE_NULL;
+ src = temp;
+ }
- temp[length] = UNICODE_NULL;
+ NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
- buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
+ buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
if (!buffer) {
status = STATUS_INSUFFICIENT_RESOURCES;
break;
}
- RtlCopyMemory (buffer, temp, length * sizeof(WCHAR));
+ RtlCopyMemory (buffer, src, length * sizeof(WCHAR));
Irp->IoStatus.Information = (ULONG_PTR) buffer;
DPRINT("BusQueryHardwareIDs: %ls\n",buffer);
+ status = STATUS_SUCCESS;
+ break;
+
+ case BusQueryCompatibleIDs:
+
+ /* This is a REG_MULTI_SZ value */
+ length = 0;
+ status = STATUS_NOT_SUPPORTED;
+
+ /* See comment in BusQueryDeviceID case */
+ if (DeviceData->AcpiHandle)
+ {
+ acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+ if (!Device->flags.hardware_id)
+ {
+ /* We don't have the ID to satisfy this request */
+ break;
+ }
+
+ DPRINT("Device name: %s\n", Device->pnp.device_name);
+ DPRINT("Hardware ID: %s\n", Device->pnp.hardware_id);
+
+ if (strcmp(Device->pnp.hardware_id, "Processor") == 0)
+ {
+ length += swprintf(&temp[length],
+ L"ACPI\\%hs",
+ Device->pnp.hardware_id);
+ temp[length++] = UNICODE_NULL;
+
+ length += swprintf(&temp[length],
+ L"*%hs",
+ Device->pnp.hardware_id);
+ temp[length++] = UNICODE_NULL;
+ temp[length++] = UNICODE_NULL;
+ }
+ else if (Device->flags.compatible_ids)
+ {
+ for (i = 0; i < Device->pnp.cid_list->Count; i++)
+ {
+ length += swprintf(&temp[length],
+ L"ACPI\\%hs",
+ Device->pnp.cid_list->Ids[i].String);
+ temp[length++] = UNICODE_NULL;
+
+ length += swprintf(&temp[length],
+ L"*%hs",
+ Device->pnp.cid_list->Ids[i].String);
+ temp[length++] = UNICODE_NULL;
+ }
+
+ temp[length++] = UNICODE_NULL;
+ }
+ else
+ {
+ /* No compatible IDs */
+ break;
+ }
+
+ NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
+
+ 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("BusQueryCompatibleIDs: %ls\n",buffer);
+ status = STATUS_SUCCESS;
+ }
break;
default:
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)
else
Temp = L"Other ACPI device";
- Buffer = ExAllocatePoolWithTag (PagedPool, (wcslen(Temp) + 1) * sizeof(WCHAR), 'IPCA');
+ Buffer = ExAllocatePoolWithTag(PagedPool, (wcslen(Temp) + 1) * sizeof(WCHAR), 'IpcA');
if (!Buffer) {
status = STATUS_INSUFFICIENT_RESOURCES;
}
else
{
- DPRINT1("Using _BBN for bus number\n");
+ DPRINT("Using _BBN for bus number\n");
}
- DPRINT1("Found PCI root hub: %d\n", BusNumber);
+ DPRINT("Found PCI root hub: %d\n", BusNumber);
ResourceListSize = sizeof(CM_RESOURCE_LIST);
- ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'IPCA');
+ ResourceList = ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'RpcA');
if (!ResourceList)
return STATUS_INSUFFICIENT_RESOURCES;
return Irp->IoStatus.Status;
}
- Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'IPCA');
+ Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'BpcA');
if (!Buffer.Pointer)
return STATUS_INSUFFICIENT_RESOURCES;
/* Allocate memory */
ResourceListSize = sizeof(CM_RESOURCE_LIST) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
- ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'IPCA');
+ ResourceList = ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'RpcA');
if (!ResourceList)
{
- ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+ ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
return STATUS_INSUFFICIENT_RESOURCES;
}
ResourceList->Count = 1;
ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
ResourceDescriptor->u.Port.Start.QuadPart = io_data->Address;
ResourceDescriptor->u.Port.Length = io_data->AddressLength;
-
+
ResourceDescriptor++;
break;
}
ResourceDescriptor->Type = CmResourceTypeBusNumber;
ResourceDescriptor->ShareDisposition = CmResourceShareShared;
ResourceDescriptor->Flags = 0;
- ResourceDescriptor->u.BusNumber.Start = addr16_data->Minimum;
- ResourceDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+ ResourceDescriptor->u.BusNumber.Start = addr16_data->Address.Minimum;
+ ResourceDescriptor->u.BusNumber.Length = addr16_data->Address.AddressLength;
}
else if (addr16_data->ResourceType == ACPI_IO_RANGE)
{
ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr16_data->Decode == ACPI_POS_DECODE)
ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- ResourceDescriptor->u.Port.Start.QuadPart = addr16_data->Minimum;
- ResourceDescriptor->u.Port.Length = addr16_data->AddressLength;
+ ResourceDescriptor->u.Port.Start.QuadPart = addr16_data->Address.Minimum;
+ ResourceDescriptor->u.Port.Length = addr16_data->Address.AddressLength;
}
else
{
case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
}
- ResourceDescriptor->u.Memory.Start.QuadPart = addr16_data->Minimum;
- ResourceDescriptor->u.Memory.Length = addr16_data->AddressLength;
+ ResourceDescriptor->u.Memory.Start.QuadPart = addr16_data->Address.Minimum;
+ ResourceDescriptor->u.Memory.Length = addr16_data->Address.AddressLength;
}
ResourceDescriptor++;
break;
ResourceDescriptor->Type = CmResourceTypeBusNumber;
ResourceDescriptor->ShareDisposition = CmResourceShareShared;
ResourceDescriptor->Flags = 0;
- ResourceDescriptor->u.BusNumber.Start = addr32_data->Minimum;
- ResourceDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+ ResourceDescriptor->u.BusNumber.Start = addr32_data->Address.Minimum;
+ ResourceDescriptor->u.BusNumber.Length = addr32_data->Address.AddressLength;
}
else if (addr32_data->ResourceType == ACPI_IO_RANGE)
{
ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr32_data->Decode == ACPI_POS_DECODE)
ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- ResourceDescriptor->u.Port.Start.QuadPart = addr32_data->Minimum;
- ResourceDescriptor->u.Port.Length = addr32_data->AddressLength;
+ ResourceDescriptor->u.Port.Start.QuadPart = addr32_data->Address.Minimum;
+ ResourceDescriptor->u.Port.Length = addr32_data->Address.AddressLength;
}
else
{
case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
}
- ResourceDescriptor->u.Memory.Start.QuadPart = addr32_data->Minimum;
- ResourceDescriptor->u.Memory.Length = addr32_data->AddressLength;
+ ResourceDescriptor->u.Memory.Start.QuadPart = addr32_data->Address.Minimum;
+ ResourceDescriptor->u.Memory.Length = addr32_data->Address.AddressLength;
}
ResourceDescriptor++;
break;
ResourceDescriptor->Type = CmResourceTypeBusNumber;
ResourceDescriptor->ShareDisposition = CmResourceShareShared;
ResourceDescriptor->Flags = 0;
- ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
- ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+ ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Address.Minimum;
+ ResourceDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
}
else if (addr64_data->ResourceType == ACPI_IO_RANGE)
{
ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr64_data->Decode == ACPI_POS_DECODE)
ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Minimum;
- ResourceDescriptor->u.Port.Length = addr64_data->AddressLength;
+ ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Address.Minimum;
+ ResourceDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
}
else
{
case ACPI_CACHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
- }
- ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Minimum;
- ResourceDescriptor->u.Memory.Length = addr64_data->AddressLength;
+ }
+ ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Address.Minimum;
+ ResourceDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
}
ResourceDescriptor++;
break;
ResourceDescriptor->Type = CmResourceTypeBusNumber;
ResourceDescriptor->ShareDisposition = CmResourceShareShared;
ResourceDescriptor->Flags = 0;
- ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
- ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+ ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Address.Minimum;
+ ResourceDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
}
else if (addr64_data->ResourceType == ACPI_IO_RANGE)
{
ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr64_data->Decode == ACPI_POS_DECODE)
ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Minimum;
- ResourceDescriptor->u.Port.Length = addr64_data->AddressLength;
+ ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Address.Minimum;
+ ResourceDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
}
else
{
case ACPI_CACHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
- }
- ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Minimum;
- ResourceDescriptor->u.Memory.Length = addr64_data->AddressLength;
+ }
+ ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Address.Minimum;
+ ResourceDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
}
ResourceDescriptor++;
break;
ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
ResourceDescriptor->u.Memory.Start.QuadPart = memfixed32_data->Address;
ResourceDescriptor->u.Memory.Length = memfixed32_data->AddressLength;
-
+
ResourceDescriptor++;
break;
}
resource = ACPI_NEXT_RESOURCE(resource);
}
- ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+ ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
return STATUS_SUCCESS;
}
break;
}
- Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'IPCA');
+ Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'BpcA');
if (!Buffer.Pointer)
return STATUS_INSUFFICIENT_RESOURCES;
}
RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
- RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag(PagedPool, RequirementsListSize, 'IPCA');
+ RequirementsList = ExAllocatePoolWithTag(PagedPool, RequirementsListSize, 'RpcA');
if (!RequirementsList)
{
- ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+ ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
return STATUS_INSUFFICIENT_RESOURCES;
}
RequirementsList->ListSize = RequirementsListSize;
RequirementDescriptor->u.Port.Alignment = 1;
RequirementDescriptor->u.Port.MinimumAddress.QuadPart = io_data->Address;
RequirementDescriptor->u.Port.MaximumAddress.QuadPart = io_data->Address + io_data->AddressLength - 1;
-
+
RequirementDescriptor++;
break;
}
RequirementDescriptor->Type = CmResourceTypeBusNumber;
RequirementDescriptor->ShareDisposition = CmResourceShareShared;
RequirementDescriptor->Flags = 0;
- RequirementDescriptor->u.BusNumber.MinBusNumber = addr16_data->Minimum;
- RequirementDescriptor->u.BusNumber.MaxBusNumber = addr16_data->Maximum + addr16_data->AddressLength - 1;
- RequirementDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+ RequirementDescriptor->u.BusNumber.MinBusNumber = addr16_data->Address.Minimum;
+ RequirementDescriptor->u.BusNumber.MaxBusNumber = addr16_data->Address.Maximum + addr16_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.BusNumber.Length = addr16_data->Address.AddressLength;
}
else if (addr16_data->ResourceType == ACPI_IO_RANGE)
{
RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr16_data->Decode == ACPI_POS_DECODE)
RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr16_data->Minimum;
- RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr16_data->Maximum + addr16_data->AddressLength - 1;
- RequirementDescriptor->u.Port.Length = addr16_data->AddressLength;
+ RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr16_data->Address.Minimum;
+ RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr16_data->Address.Maximum + addr16_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Port.Length = addr16_data->Address.AddressLength;
}
else
{
case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
}
- RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr16_data->Minimum;
- RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr16_data->Maximum + addr16_data->AddressLength - 1;
- RequirementDescriptor->u.Memory.Length = addr16_data->AddressLength;
+ RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr16_data->Address.Minimum;
+ RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr16_data->Address.Maximum + addr16_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Memory.Length = addr16_data->Address.AddressLength;
}
RequirementDescriptor++;
break;
RequirementDescriptor->Type = CmResourceTypeBusNumber;
RequirementDescriptor->ShareDisposition = CmResourceShareShared;
RequirementDescriptor->Flags = 0;
- RequirementDescriptor->u.BusNumber.MinBusNumber = addr32_data->Minimum;
- RequirementDescriptor->u.BusNumber.MaxBusNumber = addr32_data->Maximum + addr32_data->AddressLength - 1;
- RequirementDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+ RequirementDescriptor->u.BusNumber.MinBusNumber = addr32_data->Address.Minimum;
+ RequirementDescriptor->u.BusNumber.MaxBusNumber = addr32_data->Address.Maximum + addr32_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.BusNumber.Length = addr32_data->Address.AddressLength;
}
else if (addr32_data->ResourceType == ACPI_IO_RANGE)
{
RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr32_data->Decode == ACPI_POS_DECODE)
RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr32_data->Minimum;
- RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr32_data->Maximum + addr32_data->AddressLength - 1;
- RequirementDescriptor->u.Port.Length = addr32_data->AddressLength;
+ RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr32_data->Address.Minimum;
+ RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr32_data->Address.Maximum + addr32_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Port.Length = addr32_data->Address.AddressLength;
}
else
{
case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
}
- RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr32_data->Minimum;
- RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr32_data->Maximum + addr32_data->AddressLength - 1;
- RequirementDescriptor->u.Memory.Length = addr32_data->AddressLength;
+ RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr32_data->Address.Minimum;
+ RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr32_data->Address.Maximum + addr32_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Memory.Length = addr32_data->Address.AddressLength;
}
RequirementDescriptor++;
break;
RequirementDescriptor->Type = CmResourceTypeBusNumber;
RequirementDescriptor->ShareDisposition = CmResourceShareShared;
RequirementDescriptor->Flags = 0;
- RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Minimum;
- RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Maximum + addr64_data->AddressLength - 1;
- RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+ RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Address.Minimum;
+ RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
}
else if (addr64_data->ResourceType == ACPI_IO_RANGE)
{
RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr64_data->Decode == ACPI_POS_DECODE)
RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Minimum;
- RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
- RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+ RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+ RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
}
else
{
case ACPI_CACHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
- }
- RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Minimum;
- RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
- RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+ }
+ RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+ RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
}
RequirementDescriptor++;
break;
RequirementDescriptor->Type = CmResourceTypeBusNumber;
RequirementDescriptor->ShareDisposition = CmResourceShareShared;
RequirementDescriptor->Flags = 0;
- RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Minimum;
- RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Maximum + addr64_data->AddressLength - 1;
- RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+ RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Address.Minimum;
+ RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
}
else if (addr64_data->ResourceType == ACPI_IO_RANGE)
{
RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
if (addr64_data->Decode == ACPI_POS_DECODE)
RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
- RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Minimum;
- RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
- RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+ RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+ RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
}
else
{
case ACPI_CACHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
- }
- RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Minimum;
- RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
- RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+ }
+ RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+ RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+ RequirementDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
}
RequirementDescriptor++;
break;
RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = fixedmem32_data->Address;
RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = fixedmem32_data->Address + fixedmem32_data->AddressLength - 1;
RequirementDescriptor->u.Memory.Length = fixedmem32_data->AddressLength;
-
+
RequirementDescriptor++;
break;
}
}
resource = ACPI_NEXT_RESOURCE(resource);
}
- ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+ ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
ASSERTMSG("Someone above is handling TargetDeviceRelation", !deviceRelations);
}
- deviceRelations = (PDEVICE_RELATIONS)
- ExAllocatePoolWithTag (PagedPool,
- sizeof(DEVICE_RELATIONS),
- 'IPCA');
+ deviceRelations = ExAllocatePoolWithTag(PagedPool,
+ sizeof(DEVICE_RELATIONS),
+ 'IpcA');
if (!deviceRelations) {
status = STATUS_INSUFFICIENT_RESOURCES;
break;
PAGED_CODE ();
- busInfo = ExAllocatePoolWithTag (PagedPool, sizeof(PNP_BUS_INFORMATION),
- 'IPCA');
+ busInfo = ExAllocatePoolWithTag(PagedPool,
+ sizeof(PNP_BUS_INFORMATION),
+ 'IpcA');
if (busInfo == NULL) {
return STATUS_INSUFFICIENT_RESOURCES;