[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / buspdo.c
index 92bc18b..ed6439d 100644 (file)
@@ -8,7 +8,7 @@
 #include <acpi_bus.h>
 #include <acpi_drivers.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <debug.h>
 
 #ifdef ALLOC_PRAGMA
@@ -176,6 +176,12 @@ Bus_PDO_PnP (
 
         break;
 
+    case IRP_MN_QUERY_INTERFACE:
+
+        status = Bus_PDO_QueryInterface(DeviceData, Irp);
+
+        break;
+
 
     case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
 
@@ -325,6 +331,7 @@ Bus_PDO_QueryDeviceCaps(
        deviceCapabilities->UniqueID = device->flags.unique_id;
        deviceCapabilities->NoDisplayInUI = !device->status.show_in_ui;
        deviceCapabilities->Address = device->pnp.bus_address;
+       deviceCapabilities->RawDeviceOK = FALSE;
     }
     else
     {
@@ -335,6 +342,9 @@ Bus_PDO_QueryDeviceCaps(
        deviceCapabilities->UniqueID = FALSE;
        deviceCapabilities->NoDisplayInUI = FALSE;
        deviceCapabilities->Address = 0;
+
+       /* The ACPI driver will run fixed buttons */
+       deviceCapabilities->RawDeviceOK = TRUE;
     }
 
     deviceCapabilities->SilentInstall = FALSE;
@@ -548,8 +558,6 @@ Bus_PDO_QueryDeviceText(
                        Buffer = L"ACPI Power Resource";
                   else if (wcsstr(DeviceData->HardwareIDs, L"Processor") != 0)
                        Buffer = L"Processor";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"ACPI_SYS") != 0)
-                       Buffer = L"ACPI System";
                   else if (wcsstr(DeviceData->HardwareIDs, L"ThermalZone") != 0)
                        Buffer = L"ACPI Thermal Zone";
                   else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0002") != 0)
@@ -585,7 +593,6 @@ Bus_PDO_QueryResources(
      PPDO_DEVICE_DATA     DeviceData,
       PIRP   Irp )
 {
-       BOOLEAN Done;
        ULONG NumberOfResources = 0;
        PCM_RESOURCE_LIST ResourceList;
        PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor;
@@ -595,39 +602,39 @@ Bus_PDO_QueryResources(
        ULONG ResourceListSize;
        ULONG i;
 
-       ULONG RequirementsListSize;
-       PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
-       PIO_RESOURCE_DESCRIPTOR RequirementDescriptor;
-
-
     /* Get current resources */
     Buffer.Length = 0;
     AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
-    if (!ACPI_SUCCESS(AcpiStatus))
+    if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
+        Buffer.Length == 0)
     {
-      return STATUS_SUCCESS;
+      return Irp->IoStatus.Status;
     }
-    if (Buffer.Length > 0)
+
+    Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
+    if (!Buffer.Pointer)
+      return STATUS_INSUFFICIENT_RESOURCES;
+
+    AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+    if (!ACPI_SUCCESS(AcpiStatus))
     {
-      Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
-      if (!Buffer.Pointer)
-      {
-        ASSERT(FALSE);
-      }
-      AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
-      if (!ACPI_SUCCESS(AcpiStatus))
-      {
-        ASSERT(FALSE);
-      }
-       }
+      DPRINT1("AcpiGetCurrentResources #2 failed (0x%x)\n", AcpiStatus);
+      ASSERT(FALSE);
+      return STATUS_UNSUCCESSFUL;
+    }
 
        resource= Buffer.Pointer;
        /* Count number of resources */
-       Done = FALSE;
-       while (!Done)
+       while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG)
        {
                switch (resource->Type)
                {
+                       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+                       {
+                               ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+                               NumberOfResources += irq_data->InterruptCount;
+                               break;
+                       }
                        case ACPI_RESOURCE_TYPE_IRQ:
                        {
                                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
@@ -640,18 +647,20 @@ Bus_PDO_QueryResources(
                                NumberOfResources += dma_data->ChannelCount;
                                break;
                        }
+                       case ACPI_RESOURCE_TYPE_ADDRESS16:
+                       case ACPI_RESOURCE_TYPE_ADDRESS32:
+                       case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+                       case ACPI_RESOURCE_TYPE_MEMORY24:
+                       case ACPI_RESOURCE_TYPE_MEMORY32:
                        case ACPI_RESOURCE_TYPE_IO:
                        {
                                NumberOfResources++;
                                break;
                        }
-                       case ACPI_RESOURCE_TYPE_END_TAG:
-                       {
-                               Done = TRUE;
-                               break;
-                       }
                        default:
                        {
+                               DPRINT1("Unknown resource type: %d\n", resource->Type);
                                break;
                        }
                }
@@ -663,7 +672,10 @@ Bus_PDO_QueryResources(
        ResourceList = (PCM_RESOURCE_LIST)ExAllocatePool(PagedPool, ResourceListSize);
 
        if (!ResourceList)
-               return FALSE;
+       {
+               ExFreePool(Buffer.Pointer);
+               return STATUS_INSUFFICIENT_RESOURCES;
+       }
        ResourceList->Count = 1;
        ResourceList->List[0].InterfaceType = Internal; /* FIXME */
        ResourceList->List[0].BusNumber = 0; /* We're the only ACPI bus device in the system */
@@ -672,30 +684,31 @@ Bus_PDO_QueryResources(
        ResourceList->List[0].PartialResourceList.Count = NumberOfResources;
        ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
 
-       RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-       RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePool(PagedPool, RequirementsListSize);
-
-       if (!RequirementsList)
-       {
-               ExFreePool(ResourceList);
-               return STATUS_SUCCESS;
-       }
-       RequirementsList->ListSize = RequirementsListSize;
-       RequirementsList->InterfaceType = Internal;
-       RequirementsList->BusNumber = 0;
-       RequirementsList->SlotNumber = 0; /* Not used by WDM drivers */
-       RequirementsList->AlternativeLists = 1;
-       RequirementsList->List[0].Version = 1;
-       RequirementsList->List[0].Revision = 1;
-       RequirementsList->List[0].Count = NumberOfResources;
-       RequirementDescriptor = RequirementsList->List[0].Descriptors;
-
        /* Fill resources list structure */
-       Done = FALSE;
-       while (!Done)
+        resource = Buffer.Pointer;
+       while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG)
        {
                switch (resource->Type)
                {
+                       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+                       {
+                               ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+                               for (i = 0; i < irq_data->InterruptCount; i++)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeInterrupt;
+
+                                       ResourceDescriptor->ShareDisposition =
+                                       (irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
+                                       ResourceDescriptor->Flags =
+                                       (irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
+                                       ResourceDescriptor->u.Interrupt.Level = irq_data->Interrupts[i];
+                                       ResourceDescriptor->u.Interrupt.Vector = 0;
+                                       ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
+
+                                       ResourceDescriptor++;
+                               }
+                               break;
+                       }
                        case ACPI_RESOURCE_TYPE_IRQ:
                        {
                                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
@@ -711,15 +724,7 @@ Bus_PDO_QueryResources(
                                        ResourceDescriptor->u.Interrupt.Vector = 0;
                                        ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
 
-                                       RequirementDescriptor->Option = 0; /* Required */
-                                       RequirementDescriptor->Type = ResourceDescriptor->Type;
-                                       RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition;
-                                       RequirementDescriptor->Flags = ResourceDescriptor->Flags;
-                                       RequirementDescriptor->u.Interrupt.MinimumVector = RequirementDescriptor->u.Interrupt.MaximumVector
-                                       = irq_data->Interrupts[i];
-
                                        ResourceDescriptor++;
-                                       RequirementDescriptor++;
                                }
                                break;
                        }
@@ -730,33 +735,25 @@ Bus_PDO_QueryResources(
                                {
                                        ResourceDescriptor->Type = CmResourceTypeDma;
                                        ResourceDescriptor->Flags = 0;
-                               switch (dma_data->Type)
-                               {
-                                       case ACPI_TYPE_A: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
-                                       case ACPI_TYPE_B: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
-                                       case ACPI_TYPE_F: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
-                               }
-                               if (dma_data->BusMaster == ACPI_BUS_MASTER)
-                                       ResourceDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
-                               switch (dma_data->Transfer)
-                               {
-                                       case ACPI_TRANSFER_8: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
-                                       case ACPI_TRANSFER_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
-                                       case ACPI_TRANSFER_8_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
-                               }
-                               ResourceDescriptor->u.Dma.Channel = dma_data->Channels[i];
+                                       switch (dma_data->Type)
+                                       {
+                                               case ACPI_TYPE_A: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
+                                               case ACPI_TYPE_B: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
+                                               case ACPI_TYPE_F: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
+                                       }
+                                       if (dma_data->BusMaster == ACPI_BUS_MASTER)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
+                                       switch (dma_data->Transfer)
+                                       {
+                                               case ACPI_TRANSFER_8: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
+                                               case ACPI_TRANSFER_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
+                                               case ACPI_TRANSFER_8_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
+                                       }
+                                       ResourceDescriptor->u.Dma.Channel = dma_data->Channels[i];
 
-                               RequirementDescriptor->Option = 0; /* Required */
-                               RequirementDescriptor->Type = ResourceDescriptor->Type;
-                               RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition;
-                               RequirementDescriptor->Flags = ResourceDescriptor->Flags;
-                               RequirementDescriptor->u.Dma.MinimumChannel = RequirementDescriptor->u.Dma.MaximumChannel
-                               = ResourceDescriptor->u.Dma.Channel;
-
-                               ResourceDescriptor++;
-                               RequirementDescriptor++;
-                       }
-                       break;
+                                       ResourceDescriptor++;
+                               }
+                               break;
                        }
                        case ACPI_RESOURCE_TYPE_IO:
                        {
@@ -768,31 +765,216 @@ Bus_PDO_QueryResources(
                                        ResourceDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
                                else
                                        ResourceDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-                               ResourceDescriptor->u.Port.Start.u.HighPart = 0;
-                               ResourceDescriptor->u.Port.Start.u.LowPart = io_data->Minimum;
+                               ResourceDescriptor->u.Port.Start.QuadPart = io_data->Minimum;
                                ResourceDescriptor->u.Port.Length = io_data->AddressLength;
 
-                               RequirementDescriptor->Option = 0; /* Required */
-                               RequirementDescriptor->Type = ResourceDescriptor->Type;
-                               RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition;
-                               RequirementDescriptor->Flags = ResourceDescriptor->Flags;
-                               RequirementDescriptor->u.Port.Length = ResourceDescriptor->u.Port.Length;
-                               RequirementDescriptor->u.Port.Alignment = 1; /* Start address is specified, so it doesn't matter */
-                               RequirementDescriptor->u.Port.MinimumAddress = RequirementDescriptor->u.Port.MaximumAddress
-                               = ResourceDescriptor->u.Port.Start;
+                               ResourceDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS16:
+                       {
+                               ACPI_RESOURCE_ADDRESS16 *addr16_data = (ACPI_RESOURCE_ADDRESS16*) &resource->Data;
+                               if (addr16_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeBusNumber;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+                                       ResourceDescriptor->Flags = 0;
+                                       ResourceDescriptor->u.BusNumber.Start = addr16_data->Minimum;
+                                       ResourceDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+                               }
+                               else if (addr16_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypePort;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                               }
+                               else
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeMemory;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = 0;
+                                       if (addr16_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr16_data->Info.Mem.Caching)
+                                       {
+                                               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 = addr16_data->Minimum;
+                                       ResourceDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                               }
+                               ResourceDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS32:
+                       {
+                               ACPI_RESOURCE_ADDRESS32 *addr32_data = (ACPI_RESOURCE_ADDRESS32*) &resource->Data;
+                               if (addr32_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeBusNumber;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+                                       ResourceDescriptor->Flags = 0;
+                                       ResourceDescriptor->u.BusNumber.Start = addr32_data->Minimum;
+                                       ResourceDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+                               }
+                               else if (addr32_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypePort;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                               }
+                               else
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeMemory;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = 0;
+                                       if (addr32_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr32_data->Info.Mem.Caching)
+                                       {
+                                               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 = addr32_data->Minimum;
+                                       ResourceDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                               }
+                               ResourceDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       {
+                               ACPI_RESOURCE_ADDRESS64 *addr64_data = (ACPI_RESOURCE_ADDRESS64*) &resource->Data;
+                               if (addr64_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       DPRINT1("64-bit bus address is not supported!\n");
+                                       ResourceDescriptor->Type = CmResourceTypeBusNumber;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+                                       ResourceDescriptor->Flags = 0;
+                                       ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
+                                       ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                               }
+                               else if (addr64_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypePort;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                               }
+                               else
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeMemory;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = 0;
+                                       if (addr64_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr64_data->Info.Mem.Caching)
+                                       {
+                                               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++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+                       {
+                               ACPI_RESOURCE_EXTENDED_ADDRESS64 *addr64_data = (ACPI_RESOURCE_EXTENDED_ADDRESS64*) &resource->Data;
+                               if (addr64_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       DPRINT1("64-bit bus address is not supported!\n");
+                                       ResourceDescriptor->Type = CmResourceTypeBusNumber;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareShared;
+                                       ResourceDescriptor->Flags = 0;
+                                       ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
+                                       ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                               }
+                               else if (addr64_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypePort;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                               }
+                               else
+                               {
+                                       ResourceDescriptor->Type = CmResourceTypeMemory;
+                                       ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       ResourceDescriptor->Flags = 0;
+                                       if (addr64_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr64_data->Info.Mem.Caching)
+                                       {
+                                               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++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_MEMORY24:
+                       {
+                               ACPI_RESOURCE_MEMORY24 *mem24_data = (ACPI_RESOURCE_MEMORY24*) &resource->Data;
+                               ResourceDescriptor->Type = CmResourceTypeMemory;
+                               ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               ResourceDescriptor->Flags = CM_RESOURCE_MEMORY_24;
+                               if (mem24_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               ResourceDescriptor->u.Memory.Start.QuadPart = mem24_data->Minimum;
+                               ResourceDescriptor->u.Memory.Length = mem24_data->AddressLength;
 
                                ResourceDescriptor++;
-                               RequirementDescriptor++;
                                break;
                        }
-                       case ACPI_RESOURCE_TYPE_END_TAG:
+                       case ACPI_RESOURCE_TYPE_MEMORY32:
                        {
-                               Done = TRUE;
+                               ACPI_RESOURCE_MEMORY32 *mem32_data = (ACPI_RESOURCE_MEMORY32*) &resource->Data;
+                               ResourceDescriptor->Type = CmResourceTypeMemory;
+                               ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               ResourceDescriptor->Flags = 0;
+                               if (mem32_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               ResourceDescriptor->u.Memory.Start.QuadPart = mem32_data->Minimum;
+                               ResourceDescriptor->u.Memory.Length = mem32_data->AddressLength;
+
+                               ResourceDescriptor++;
                                break;
                        }
                        default:
                        {
-                               DPRINT1("Unhandled resource type\n");
                                break;
                        }
                }
@@ -809,7 +991,6 @@ Bus_PDO_QueryResourceRequirements(
      PPDO_DEVICE_DATA     DeviceData,
       PIRP   Irp )
 {
-       BOOLEAN Done;
        ULONG NumberOfResources = 0;
        ACPI_STATUS AcpiStatus;
        ACPI_BUFFER Buffer;
@@ -817,38 +998,58 @@ Bus_PDO_QueryResourceRequirements(
        ULONG i, RequirementsListSize;
        PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
        PIO_RESOURCE_DESCRIPTOR RequirementDescriptor;
+       BOOLEAN CurrentRes = FALSE;
 
     PAGED_CODE ();
 
 
     /* Get current resources */
-    Buffer.Length = 0;
-    AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
-    if (!ACPI_SUCCESS(AcpiStatus))
+    while (TRUE)
     {
-      return STATUS_SUCCESS;
+        Buffer.Length = 0;
+        if (CurrentRes)
+           AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+        else
+            AcpiStatus = AcpiGetPossibleResources(DeviceData->AcpiHandle, &Buffer);
+        if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
+            Buffer.Length == 0)
+        {
+            if (!CurrentRes)
+                CurrentRes = TRUE;
+            else
+                return Irp->IoStatus.Status;
+        }
+        else
+            break;
     }
-    if (Buffer.Length > 0)
+
+    Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
+    if (!Buffer.Pointer)
+      return STATUS_INSUFFICIENT_RESOURCES;
+
+    if (CurrentRes)
+        AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+    else
+        AcpiStatus = AcpiGetPossibleResources(DeviceData->AcpiHandle, &Buffer);
+    if (!ACPI_SUCCESS(AcpiStatus))
     {
-      Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
-      if (!Buffer.Pointer)
-      {
-        ASSERT(FALSE);
-      }
-      AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
-      if (!ACPI_SUCCESS(AcpiStatus))
-      {
-        ASSERT(FALSE);
-      }
-       }
+      DPRINT1("AcpiGetCurrentResources #2 failed (0x%x)\n", AcpiStatus);
+      ASSERT(FALSE);
+      return STATUS_UNSUCCESSFUL;
+    }
 
        resource= Buffer.Pointer;
        /* Count number of resources */
-       Done = FALSE;
-       while (!Done)
+       while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG)
        {
                switch (resource->Type)
                {
+                       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+                       {
+                               ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+                               NumberOfResources += irq_data->InterruptCount;
+                               break;
+                       }
                        case ACPI_RESOURCE_TYPE_IRQ:
                        {
                                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
@@ -861,16 +1062,17 @@ Bus_PDO_QueryResourceRequirements(
                                NumberOfResources += dma_data->ChannelCount;
                                break;
                        }
+                       case ACPI_RESOURCE_TYPE_ADDRESS16:
+                       case ACPI_RESOURCE_TYPE_ADDRESS32:
+                       case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+                       case ACPI_RESOURCE_TYPE_MEMORY24:
+                       case ACPI_RESOURCE_TYPE_MEMORY32:
                        case ACPI_RESOURCE_TYPE_IO:
                        {
                                NumberOfResources++;
                                break;
                        }
-                       case ACPI_RESOURCE_TYPE_END_TAG:
-                       {
-                               Done = TRUE;
-                               break;
-                       }
                        default:
                        {
                                break;
@@ -885,7 +1087,7 @@ Bus_PDO_QueryResourceRequirements(
        if (!RequirementsList)
        {
                ExFreePool(Buffer.Pointer);
-               return STATUS_SUCCESS;
+               return STATUS_INSUFFICIENT_RESOURCES;
        }
        RequirementsList->ListSize = RequirementsListSize;
        RequirementsList->InterfaceType = Internal;
@@ -898,21 +1100,38 @@ Bus_PDO_QueryResourceRequirements(
        RequirementDescriptor = RequirementsList->List[0].Descriptors;
 
        /* Fill resources list structure */
-       Done = FALSE;
-       while (!Done)
+        resource = Buffer.Pointer;
+       while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG)
        {
                switch (resource->Type)
                {
+                       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+                       {
+                               ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+                               for (i = 0; i < irq_data->InterruptCount; i++)
+                               {
+                                       RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                                       RequirementDescriptor->Type = CmResourceTypeInterrupt;
+                                       RequirementDescriptor->ShareDisposition = (irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
+                                       RequirementDescriptor->Flags =(irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
+                                       RequirementDescriptor->u.Interrupt.MinimumVector =
+                                       RequirementDescriptor->u.Interrupt.MaximumVector = irq_data->Interrupts[i];
+
+                                       RequirementDescriptor++;
+                               }
+                               break;
+                       }
                        case ACPI_RESOURCE_TYPE_IRQ:
                        {
                                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
                                for (i = 0; i < irq_data->InterruptCount; i++)
                                {
-                                       RequirementDescriptor->Option = 0; /* Required */
+                                       RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
                                        RequirementDescriptor->Type = CmResourceTypeInterrupt;
                                        RequirementDescriptor->ShareDisposition = (irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
                                        RequirementDescriptor->Flags =(irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
-                                       RequirementDescriptor->u.Interrupt.MinimumVector =  irq_data->Interrupts[i];
+                                       RequirementDescriptor->u.Interrupt.MinimumVector =
+                                       RequirementDescriptor->u.Interrupt.MaximumVector = irq_data->Interrupts[i];
 
                                        RequirementDescriptor++;
                                }
@@ -925,27 +1144,28 @@ Bus_PDO_QueryResourceRequirements(
                                {
                                        RequirementDescriptor->Type = CmResourceTypeDma;
                                        RequirementDescriptor->Flags = 0;
-                               switch (dma_data->Type)
-                               {
-                                       case ACPI_TYPE_A: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
-                                       case ACPI_TYPE_B: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
-                                       case ACPI_TYPE_F: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
-                               }
-                               if (dma_data->BusMaster == ACPI_BUS_MASTER)
-                                       RequirementDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
-                               switch (dma_data->Transfer)
-                               {
-                                       case ACPI_TRANSFER_8: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
-                                       case ACPI_TRANSFER_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
-                                       case ACPI_TRANSFER_8_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
+                                       switch (dma_data->Type)
+                                       {
+                                               case ACPI_TYPE_A: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
+                                               case ACPI_TYPE_B: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
+                                               case ACPI_TYPE_F: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
+                                       }
+                                       if (dma_data->BusMaster == ACPI_BUS_MASTER)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
+                                       switch (dma_data->Transfer)
+                                       {
+                                               case ACPI_TRANSFER_8: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
+                                               case ACPI_TRANSFER_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
+                                               case ACPI_TRANSFER_8_16: RequirementDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
+                                       }
+
+                                       RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
+                                       RequirementDescriptor->u.Dma.MinimumChannel =
+                                       RequirementDescriptor->u.Dma.MaximumChannel = dma_data->Channels[i];
+                                       RequirementDescriptor++;
                                }
-
-                               RequirementDescriptor->Option = 0; /* Required */
-                               RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
-                               RequirementDescriptor->u.Dma.MinimumChannel = dma_data->Channels[i];
-                               RequirementDescriptor++;
-                       }
-                       break;
+                               break;
                        }
                        case ACPI_RESOURCE_TYPE_IO:
                        {
@@ -955,27 +1175,241 @@ Bus_PDO_QueryResourceRequirements(
                                        RequirementDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
                                else
                                        RequirementDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-
                                RequirementDescriptor->u.Port.Length = io_data->AddressLength;
-
-                               RequirementDescriptor->Option = 0; /* Required */
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
                                RequirementDescriptor->Type = CmResourceTypePort;
                                RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
-                               RequirementDescriptor->u.Port.Alignment = 1; /* Start address is specified, so it doesn't matter */
+                               RequirementDescriptor->u.Port.Alignment = io_data->Alignment;
                                RequirementDescriptor->u.Port.MinimumAddress.QuadPart = io_data->Minimum;
                                RequirementDescriptor->u.Port.MaximumAddress.QuadPart = io_data->Maximum;
 
                                RequirementDescriptor++;
                                break;
                        }
-                       case ACPI_RESOURCE_TYPE_END_TAG:
+                       case ACPI_RESOURCE_TYPE_ADDRESS16:
+                       {
+                               ACPI_RESOURCE_ADDRESS16 *addr16_data = (ACPI_RESOURCE_ADDRESS16*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               if (addr16_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeBusNumber;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareShared;
+                                       RequirementDescriptor->Flags = 0;
+                                       RequirementDescriptor->u.BusNumber.MinBusNumber = addr16_data->Minimum;
+                                       RequirementDescriptor->u.BusNumber.MaxBusNumber = addr16_data->Maximum;
+                                       RequirementDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+                               }
+                               else if (addr16_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypePort;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                                       RequirementDescriptor->u.Port.Length = addr16_data->AddressLength;
+                               }
+                               else
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeMemory;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = 0;
+                                       if (addr16_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr16_data->Info.Mem.Caching)
+                                       {
+                                               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 = addr16_data->Minimum;
+                                       RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr16_data->Maximum;
+                                       RequirementDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                               }
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS32:
+                       {
+                               ACPI_RESOURCE_ADDRESS32 *addr32_data = (ACPI_RESOURCE_ADDRESS32*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               if (addr32_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeBusNumber;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareShared;
+                                       RequirementDescriptor->Flags = 0;
+                                       RequirementDescriptor->u.BusNumber.MinBusNumber = addr32_data->Minimum;
+                                       RequirementDescriptor->u.BusNumber.MaxBusNumber = addr32_data->Maximum;
+                                       RequirementDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+                               }
+                               else if (addr32_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypePort;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                                       RequirementDescriptor->u.Port.Length = addr32_data->AddressLength;
+                               }
+                               else
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeMemory;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = 0;
+                                       if (addr32_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr32_data->Info.Mem.Caching)
+                                       {
+                                               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 = addr32_data->Minimum;
+                                       RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr32_data->Maximum;
+                                       RequirementDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                               }
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       {
+                               ACPI_RESOURCE_ADDRESS64 *addr64_data = (ACPI_RESOURCE_ADDRESS64*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               if (addr64_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       DPRINT1("64-bit bus address is not supported!\n");
+                                       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;
+                                       RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                               }
+                               else if (addr64_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypePort;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                                       RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+                               }
+                               else
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeMemory;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = 0;
+                                       if (addr64_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr64_data->Info.Mem.Caching)
+                                       {
+                                               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;
+                                       RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+                               }
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+                       {
+                               ACPI_RESOURCE_EXTENDED_ADDRESS64 *addr64_data = (ACPI_RESOURCE_EXTENDED_ADDRESS64*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               if (addr64_data->ResourceType == ACPI_BUS_NUMBER_RANGE)
+                               {
+                                       DPRINT1("64-bit bus address is not supported!\n");
+                                       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;
+                                       RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                               }
+                               else if (addr64_data->ResourceType == ACPI_IO_RANGE)
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypePort;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       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;
+                                       RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+                               }
+                               else
+                               {
+                                       RequirementDescriptor->Type = CmResourceTypeMemory;
+                                       RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                                       RequirementDescriptor->Flags = 0;
+                                       if (addr64_data->Info.Mem.WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                                       else
+                                               RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                                       switch (addr64_data->Info.Mem.Caching)
+                                       {
+                                               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;
+                                       RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+                               }
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_MEMORY24:
+                       {
+                               ACPI_RESOURCE_MEMORY24 *mem24_data = (ACPI_RESOURCE_MEMORY24*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               RequirementDescriptor->Type = CmResourceTypeMemory;
+                               RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               RequirementDescriptor->Flags = CM_RESOURCE_MEMORY_24;
+                               if (mem24_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = mem24_data->Minimum;
+                               RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = mem24_data->Maximum;
+                               RequirementDescriptor->u.Memory.Length = mem24_data->AddressLength;
+
+                               RequirementDescriptor++;
+                               break;
+                       }
+                       case ACPI_RESOURCE_TYPE_MEMORY32:
                        {
-                               Done = TRUE;
+                               ACPI_RESOURCE_MEMORY32 *mem32_data = (ACPI_RESOURCE_MEMORY32*) &resource->Data;
+                               RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                               RequirementDescriptor->Type = CmResourceTypeMemory;
+                               RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                               RequirementDescriptor->Flags = 0;
+                               if (mem32_data->WriteProtect == ACPI_READ_ONLY_MEMORY)
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_ONLY;
+                               else
+                                       RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+                               RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = mem32_data->Minimum;
+                               RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = mem32_data->Maximum;
+                               RequirementDescriptor->u.Memory.Length = mem32_data->AddressLength;
+
+                               RequirementDescriptor++;
                                break;
                        }
                        default:
                        {
-                               DPRINT1("Unhandled resource type\n");
                                break;
                        }
                }
@@ -983,6 +1417,8 @@ Bus_PDO_QueryResourceRequirements(
        }
        ExFreePool(Buffer.Pointer);
 
+    Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
+
     return STATUS_SUCCESS;
 }