[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / buspdo.c
index 69d7632..17d4673 100644 (file)
@@ -66,40 +66,42 @@ Bus_PDO_PnP (
         }
 
         DeviceData->InterfaceName.Length = 0;
+        status = STATUS_SUCCESS;
 
         if (!device)
         {
-            IoRegisterDeviceInterface(DeviceData->Common.Self,
-                                      &GUID_DEVICE_SYS_BUTTON,
-                                      NULL,
-                                      &DeviceData->InterfaceName);
+            status = IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                               &GUID_DEVICE_SYS_BUTTON,
+                                               NULL,
+                                               &DeviceData->InterfaceName);
         }
         else if (device->flags.hardware_id &&
                  strstr(device->pnp.hardware_id, ACPI_THERMAL_HID))
         {
-            IoRegisterDeviceInterface(DeviceData->Common.Self,
-                                      &GUID_DEVICE_THERMAL_ZONE,
-                                      NULL,
-                                      &DeviceData->InterfaceName);
+            status = IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                               &GUID_DEVICE_THERMAL_ZONE,
+                                               NULL,
+                                               &DeviceData->InterfaceName);
         }
         else if (device->flags.hardware_id &&
                  strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID))
         {
-            IoRegisterDeviceInterface(DeviceData->Common.Self,
-                                      &GUID_DEVICE_LID,
-                                      NULL,
-                                      &DeviceData->InterfaceName);
+            status = IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                               &GUID_DEVICE_LID,
+                                               NULL,
+                                               &DeviceData->InterfaceName);
         }
         else if (device->flags.hardware_id &&
                  strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))
         {
-            IoRegisterDeviceInterface(DeviceData->Common.Self,
-                                      &GUID_DEVICE_PROCESSOR,
-                                      NULL,
-                                      &DeviceData->InterfaceName);
+            status = IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                               &GUID_DEVICE_PROCESSOR,
+                                               NULL,
+                                               &DeviceData->InterfaceName);
         }
 
-        if (DeviceData->InterfaceName.Length != 0)
+        /* Failure to register an interface is not a fatal failure so don't return a failure status */
+        if (NT_SUCCESS(status) && DeviceData->InterfaceName.Length != 0)
             IoSetDeviceInterfaceState(&DeviceData->InterfaceName, TRUE);
 
         state.DeviceState = PowerDeviceD0;
@@ -370,8 +372,9 @@ Bus_PDO_QueryDeviceCaps(
 
     if (device)
     {
+       deviceCapabilities->LockSupported = device->flags.lockable;
        deviceCapabilities->EjectSupported = device->flags.ejectable;
-       deviceCapabilities->HardwareDisabled = !device->status.enabled;
+       deviceCapabilities->HardwareDisabled = !device->status.enabled && !device->status.functional;
        deviceCapabilities->Removable = device->flags.removable;
        deviceCapabilities->SurpriseRemovalOK = device->flags.suprise_removal_ok;
        deviceCapabilities->UniqueID = device->flags.unique_id;
@@ -537,9 +540,9 @@ Bus_PDO_QueryDeviceText(
      PPDO_DEVICE_DATA     DeviceData,
       PIRP   Irp )
 {
-    PWCHAR  Buffer;
+    PWCHAR  Buffer, Temp;
     PIO_STACK_LOCATION   stack;
-    NTSTATUS    status;
+    NTSTATUS    status = Irp->IoStatus.Status;
     PAGED_CODE ();
 
     stack = IoGetCurrentIrpStackLocation (Irp);
@@ -549,81 +552,89 @@ Bus_PDO_QueryDeviceText(
     case DeviceTextDescription:
 
         if (!Irp->IoStatus.Information) {
-                 if (wcsstr (DeviceData->HardwareIDs, L"PNP000") != 0)
-                       Buffer = L"Programmable interrupt controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP010") != 0)
-                       Buffer = L"System timer";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP020") != 0)
-                       Buffer = L"DMA controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP03") != 0)
-                       Buffer = L"Keyboard";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP040") != 0)
-                       Buffer = L"Parallel port";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP05") != 0)
-                       Buffer = L"Serial port";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP06") != 0)
-                       Buffer = L"Disk controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP07") != 0)
-                       Buffer = L"Disk controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP09") != 0)
-                       Buffer = L"Display adapter";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0A0") != 0)
-                       Buffer = L"Bus controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0E0") != 0)
-                       Buffer = L"PCMCIA controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0F") != 0)
-                       Buffer = L"Mouse device";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP8") != 0)
-                       Buffer = L"Network adapter";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNPA0") != 0)
-                       Buffer = L"SCSI controller";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNPB0") != 0)
-                       Buffer = L"Multimedia device";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNPC00") != 0)
-                       Buffer = L"Modem";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0C") != 0)
-                       Buffer = L"Power Button";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0E") != 0)
-                       Buffer = L"Sleep Button";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0D") != 0)
-                       Buffer = L"Lid Switch";
-                 else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C09") != 0)
-                       Buffer = L"ACPI Embedded Controller";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0B") != 0)
-                       Buffer = L"ACPI Fan";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"PNP0A03") != 0)
-                       Buffer = L"PCI Root Bridge";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0A") != 0)
-                       Buffer = L"ACPI Battery";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0F") != 0)
-                       Buffer = L"PCI Interrupt Link";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"ACPI_PWR") != 0)
-                       Buffer = L"ACPI Power Resource";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"Processor") != 0)
-                       Buffer = L"Processor";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"ThermalZone") != 0)
-                       Buffer = L"ACPI Thermal Zone";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0002") != 0)
-                       Buffer = L"Smart Battery";
-                  else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0003") != 0)
-                       Buffer = L"AC Adapter";
-                  /* Simply checking if AcpiHandle is NULL eliminates the need to check
-                   * for the 4 different names that ACPI knows the fixed feature button as internally
-                   */
-                  else if (!DeviceData->AcpiHandle)
-                       Buffer = L"ACPI Fixed Feature Button";
-                 else
-                       Buffer = L"Other ACPI device";
+          if (wcsstr (DeviceData->HardwareIDs, L"PNP000") != 0)
+            Temp = L"Programmable interrupt controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP010") != 0)
+            Temp = L"System timer";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP020") != 0)
+            Temp = L"DMA controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP03") != 0)
+            Temp = L"Keyboard";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP040") != 0)
+            Temp = L"Parallel port";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP05") != 0)
+            Temp = L"Serial port";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP06") != 0)
+            Temp = L"Disk controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP07") != 0)
+            Temp = L"Disk controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP09") != 0)
+            Temp = L"Display adapter";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0A0") != 0)
+            Temp = L"Bus controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0E0") != 0)
+            Temp = L"PCMCIA controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0F") != 0)
+            Temp = L"Mouse device";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP8") != 0)
+            Temp = L"Network adapter";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNPA0") != 0)
+            Temp = L"SCSI controller";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNPB0") != 0)
+            Temp = L"Multimedia device";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNPC00") != 0)
+            Temp = L"Modem";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0C") != 0)
+            Temp = L"Power Button";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0E") != 0)
+            Temp = L"Sleep Button";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0D") != 0)
+            Temp = L"Lid Switch";
+          else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C09") != 0)
+            Temp = L"ACPI Embedded Controller";
+           else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0B") != 0)
+            Temp = L"ACPI Fan";
+           else if (wcsstr(DeviceData->HardwareIDs, L"PNP0A03") != 0)
+            Temp = L"PCI Root Bridge";
+           else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0A") != 0)
+            Temp = L"ACPI Battery";
+           else if (wcsstr(DeviceData->HardwareIDs, L"PNP0C0F") != 0)
+            Temp = L"PCI Interrupt Link";
+           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";
+           else if (wcsstr(DeviceData->HardwareIDs, L"ThermalZone") != 0)
+            Temp = L"ACPI Thermal Zone";
+           else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0002") != 0)
+            Temp = L"Smart Battery";
+           else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0003") != 0)
+            Temp = L"AC Adapter";
+           /* Simply checking if AcpiHandle is NULL eliminates the need to check
+            * for the 4 different names that ACPI knows the fixed feature button as internally
+            */
+           else if (!DeviceData->AcpiHandle)
+            Temp = L"ACPI Fixed Feature Button";
+          else
+            Temp = L"Other ACPI device";
+
+            Buffer = ExAllocatePoolWithTag (PagedPool, (wcslen(Temp) + 1) * sizeof(WCHAR), 'IPCA');
+
+            if (!Buffer) {
+                status = STATUS_INSUFFICIENT_RESOURCES;
+                break;
+            }
+
+            RtlCopyMemory (Buffer, Temp, (wcslen(Temp) + 1) * sizeof(WCHAR));
 
             DPRINT("\tDeviceTextDescription :%ws\n", Buffer);
 
             Irp->IoStatus.Information = (ULONG_PTR) Buffer;
-        }
             status = STATUS_SUCCESS;
+        }
         break;
 
     default:
-        status = Irp->IoStatus.Status;
         break;
     }
 
@@ -636,14 +647,72 @@ Bus_PDO_QueryResources(
      PPDO_DEVICE_DATA     DeviceData,
       PIRP   Irp )
 {
-       ULONG NumberOfResources = 0;
-       PCM_RESOURCE_LIST ResourceList;
-       PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor;
-       ACPI_STATUS AcpiStatus;
-       ACPI_BUFFER Buffer;
-       ACPI_RESOURCE* resource;
-       ULONG ResourceListSize;
-       ULONG i;
+    ULONG NumberOfResources = 0;
+    PCM_RESOURCE_LIST ResourceList;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor;
+    ACPI_STATUS AcpiStatus;
+    ACPI_BUFFER Buffer;
+    ACPI_RESOURCE* resource;
+    ULONG ResourceListSize;
+    ULONG i;
+    ULONGLONG BusNumber;
+    struct acpi_device *device;
+
+    if (!DeviceData->AcpiHandle)
+    {
+        return Irp->IoStatus.Status;
+    }
+
+    /* A bus number resource is not included in the list of current resources
+     * for the root PCI bus so we manually query one here and if we find it
+     * we create a resource list and add a bus number descriptor to it */
+    if (wcsstr(DeviceData->HardwareIDs, L"PNP0A03") != 0)
+    {
+        acpi_bus_get_device(DeviceData->AcpiHandle, &device);
+
+        AcpiStatus = acpi_evaluate_integer(DeviceData->AcpiHandle, "_BBN", NULL, &BusNumber);
+        if (AcpiStatus != AE_OK)
+        {
+#if 0
+            if (device->flags.unique_id)
+            {
+                /* FIXME: Try the unique ID */
+            }
+            else
+#endif
+            {
+                BusNumber = 0;
+                DPRINT1("Failed to find a bus number\n");
+            }
+        }
+        else
+        {
+            DPRINT1("Using _BBN for bus number\n");
+        }
+
+        DPRINT1("Found PCI root hub: %d\n", BusNumber);
+
+        ResourceListSize = sizeof(CM_RESOURCE_LIST);
+        ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'IPCA');
+        if (!ResourceList)
+            return STATUS_INSUFFICIENT_RESOURCES;
+
+        ResourceList->Count = 1;
+        ResourceList->List[0].InterfaceType = Internal;
+        ResourceList->List[0].BusNumber = 0;
+        ResourceList->List[0].PartialResourceList.Version = 1;
+        ResourceList->List[0].PartialResourceList.Revision = 1;
+        ResourceList->List[0].PartialResourceList.Count = 1;
+        ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
+
+        ResourceDescriptor->Type = CmResourceTypeBusNumber;
+        ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+        ResourceDescriptor->u.BusNumber.Start = BusNumber;
+        ResourceDescriptor->u.BusNumber.Length = 1;
+
+        Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+        return STATUS_SUCCESS;
+    }
 
     /* Get current resources */
     Buffer.Length = 0;
@@ -654,7 +723,7 @@ Bus_PDO_QueryResources(
       return Irp->IoStatus.Status;
     }
 
-    Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
+    Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'IPCA');
     if (!Buffer.Pointer)
       return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -666,367 +735,403 @@ Bus_PDO_QueryResources(
       return STATUS_UNSUCCESSFUL;
     }
 
-       resource= Buffer.Pointer;
-       /* Count number of resources */
-       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;
-                               NumberOfResources += irq_data->InterruptCount;
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_DMA:
-                       {
-                               ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
-                               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;
-                       }
-                       default:
-                       {
-                               DPRINT1("Unknown resource type: %d\n", resource->Type);
-                               break;
-                       }
-               }
-               resource = ACPI_NEXT_RESOURCE(resource);
-       }
-
-       /* Allocate memory */
-       ResourceListSize = sizeof(CM_RESOURCE_LIST) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-       ResourceList = (PCM_RESOURCE_LIST)ExAllocatePool(PagedPool, ResourceListSize);
-
-       if (!ResourceList)
-       {
-               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 */
-       ResourceList->List[0].PartialResourceList.Version = 1;
-       ResourceList->List[0].PartialResourceList.Revision = 1;
-       ResourceList->List[0].PartialResourceList.Count = NumberOfResources;
-       ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
-
-       /* Fill resources list structure */
+    resource= Buffer.Pointer;
+    /* Count number of resources */
+    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;
+                if (irq_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                NumberOfResources += irq_data->InterruptCount;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_IRQ:
+            {
+                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
+                NumberOfResources += irq_data->InterruptCount;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_DMA:
+            {
+                ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
+                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:
+            {
+                ACPI_RESOURCE_ADDRESS *addr_res = (ACPI_RESOURCE_ADDRESS*) &resource->Data;
+                if (addr_res->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                NumberOfResources++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_MEMORY24:
+            case ACPI_RESOURCE_TYPE_MEMORY32:
+            case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+            case ACPI_RESOURCE_TYPE_IO:
+            {
+                NumberOfResources++;
+                break;
+            }
+            default:
+            {
+                DPRINT1("Unknown resource type: %d\n", resource->Type);
+                break;
+            }
+        }
+        resource = ACPI_NEXT_RESOURCE(resource);
+    }
+
+    /* Allocate memory */
+    ResourceListSize = sizeof(CM_RESOURCE_LIST) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
+    ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'IPCA');
+
+    if (!ResourceList)
+    {
+        ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+        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 */
+    ResourceList->List[0].PartialResourceList.Version = 1;
+    ResourceList->List[0].PartialResourceList.Revision = 1;
+    ResourceList->List[0].PartialResourceList.Count = NumberOfResources;
+    ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
+
+    /* Fill resources list structure */
         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 =
-                                       ResourceDescriptor->u.Interrupt.Vector = irq_data->Interrupts[i];
-                                       ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
-
-                                       ResourceDescriptor++;
-                               }
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_IRQ:
-                       {
-                               ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_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 =
-                                       ResourceDescriptor->u.Interrupt.Vector = irq_data->Interrupts[i];
-                                       ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
-
-                                       ResourceDescriptor++;
-                               }
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_DMA:
-                       {
-                               ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
-                               for (i = 0; i < dma_data->ChannelCount; i++)
-                               {
-                                       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];
-
-                                       ResourceDescriptor++;
-                               }
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_IO:
-                       {
-                               ACPI_RESOURCE_IO *io_data = (ACPI_RESOURCE_IO*) &resource->Data;
-                               ResourceDescriptor->Type = CmResourceTypePort;
-                               ResourceDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
-                               ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
-                               if (io_data->IoDecode == ACPI_DECODE_16)
-                                       ResourceDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
-                               else
-                                       ResourceDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-                               ResourceDescriptor->u.Port.Start.QuadPart = io_data->Minimum;
-                               ResourceDescriptor->u.Port.Length = io_data->AddressLength;
-
-                               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++;
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_MEMORY32:
-                       {
-                               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:
-                       {
-                               break;
-                       }
-               }
-               resource = ACPI_NEXT_RESOURCE(resource);
-       }
-
-    ExFreePool(Buffer.Pointer);
-       Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
-       return STATUS_SUCCESS;
+    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;
+                if (irq_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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 =
+                    ResourceDescriptor->u.Interrupt.Vector = irq_data->Interrupts[i];
+                    ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
+
+                    ResourceDescriptor++;
+                }
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_IRQ:
+            {
+                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_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 =
+                    ResourceDescriptor->u.Interrupt.Vector = irq_data->Interrupts[i];
+                    ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
+
+                    ResourceDescriptor++;
+                }
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_DMA:
+            {
+                ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
+                for (i = 0; i < dma_data->ChannelCount; i++)
+                {
+                    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];
+
+                    ResourceDescriptor++;
+                }
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_IO:
+            {
+                ACPI_RESOURCE_IO *io_data = (ACPI_RESOURCE_IO*) &resource->Data;
+                ResourceDescriptor->Type = CmResourceTypePort;
+                ResourceDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
+                ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
+                if (io_data->IoDecode == ACPI_DECODE_16)
+                    ResourceDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
+                else
+                    ResourceDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
+                ResourceDescriptor->u.Port.Start.QuadPart = io_data->Minimum;
+                ResourceDescriptor->u.Port.Length = io_data->AddressLength;
+
+                ResourceDescriptor++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_ADDRESS16:
+            {
+                ACPI_RESOURCE_ADDRESS16 *addr16_data = (ACPI_RESOURCE_ADDRESS16*) &resource->Data;
+                if (addr16_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_MEMORY32:
+            {
+                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;
+            }
+            case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+            {
+                ACPI_RESOURCE_FIXED_MEMORY32 *memfixed32_data = (ACPI_RESOURCE_FIXED_MEMORY32*) &resource->Data;
+                ResourceDescriptor->Type = CmResourceTypeMemory;
+                ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                ResourceDescriptor->Flags = 0;
+                if (memfixed32_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 = memfixed32_data->Address;
+                ResourceDescriptor->u.Memory.Length = memfixed32_data->AddressLength;
+                
+                ResourceDescriptor++;
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+        resource = ACPI_NEXT_RESOURCE(resource);
+    }
+
+    ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+    Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -1034,24 +1139,34 @@ Bus_PDO_QueryResourceRequirements(
      PPDO_DEVICE_DATA     DeviceData,
       PIRP   Irp )
 {
-       ULONG NumberOfResources = 0;
-       ACPI_STATUS AcpiStatus;
-       ACPI_BUFFER Buffer;
-       ACPI_RESOURCE* resource;
-       ULONG i, RequirementsListSize;
-       PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
-       PIO_RESOURCE_DESCRIPTOR RequirementDescriptor;
-       BOOLEAN CurrentRes = FALSE;
+    ULONG NumberOfResources = 0;
+    ACPI_STATUS AcpiStatus;
+    ACPI_BUFFER Buffer;
+    ACPI_RESOURCE* resource;
+    ULONG i, RequirementsListSize;
+    PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
+    PIO_RESOURCE_DESCRIPTOR RequirementDescriptor;
+    BOOLEAN CurrentRes = FALSE;
 
     PAGED_CODE ();
 
+    if (!DeviceData->AcpiHandle)
+    {
+        return Irp->IoStatus.Status;
+    }
+
+    /* Handle the PCI root manually */
+    if (wcsstr(DeviceData->HardwareIDs, L"PNP0A03") != 0)
+    {
+        return Irp->IoStatus.Status;
+    }
 
     /* Get current resources */
     while (TRUE)
     {
         Buffer.Length = 0;
         if (CurrentRes)
-           AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+        AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
         else
             AcpiStatus = AcpiGetPossibleResources(DeviceData->AcpiHandle, &Buffer);
         if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
@@ -1066,7 +1181,7 @@ Bus_PDO_QueryResourceRequirements(
             break;
     }
 
-    Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
+    Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'IPCA');
     if (!Buffer.Pointer)
       return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -1081,384 +1196,422 @@ Bus_PDO_QueryResourceRequirements(
       return STATUS_UNSUCCESSFUL;
     }
 
-       resource= Buffer.Pointer;
-       /* Count number of resources */
-       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;
-                               NumberOfResources += irq_data->InterruptCount;
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_DMA:
-                       {
-                               ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
-                               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;
-                       }
-                       default:
-                       {
-                               break;
-                       }
-               }
-               resource = ACPI_NEXT_RESOURCE(resource);
-       }
-
-       RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-       RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePool(PagedPool, RequirementsListSize);
-
-       if (!RequirementsList)
-       {
-               ExFreePool(Buffer.Pointer);
-               return STATUS_INSUFFICIENT_RESOURCES;
-       }
-       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 */
+    resource= Buffer.Pointer;
+    /* Count number of resources */
+    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;
+                if (irq_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                NumberOfResources += irq_data->InterruptCount;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_IRQ:
+            {
+                ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*) &resource->Data;
+                NumberOfResources += irq_data->InterruptCount;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_DMA:
+            {
+                ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
+                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:
+            {
+                ACPI_RESOURCE_ADDRESS *res_addr = (ACPI_RESOURCE_ADDRESS*) &resource->Data;
+                if (res_addr->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                NumberOfResources++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_MEMORY24:
+            case ACPI_RESOURCE_TYPE_MEMORY32:
+            case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+            case ACPI_RESOURCE_TYPE_IO:
+            {
+                NumberOfResources++;
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+        resource = ACPI_NEXT_RESOURCE(resource);
+    }
+
+    RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
+    RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag(PagedPool, RequirementsListSize, 'IPCA');
+
+    if (!RequirementsList)
+    {
+        ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    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 */
         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 = 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_DMA:
-                       {
-                               ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
-                               for (i = 0; i < dma_data->ChannelCount; i++)
-                               {
-                                       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;
-                                       }
-
-                                       RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
-                                       RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
-                                       RequirementDescriptor->u.Dma.MinimumChannel =
-                                       RequirementDescriptor->u.Dma.MaximumChannel = dma_data->Channels[i];
-                                       RequirementDescriptor++;
-                               }
-                               break;
-                       }
-                       case ACPI_RESOURCE_TYPE_IO:
-                       {
-                               ACPI_RESOURCE_IO *io_data = (ACPI_RESOURCE_IO*) &resource->Data;
-                               RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
-                               if (io_data->IoDecode == ACPI_DECODE_16)
-                                       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 = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
-                               RequirementDescriptor->Type = CmResourceTypePort;
-                               RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
-                               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_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:
-                       {
-                               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:
-                       {
-                               break;
-                       }
-               }
-               resource = ACPI_NEXT_RESOURCE(resource);
-       }
-       ExFreePool(Buffer.Pointer);
+    while (resource->Type != ACPI_RESOURCE_TYPE_END_TAG && resource->Type != ACPI_RESOURCE_TYPE_END_DEPENDENT)
+    {
+        switch (resource->Type)
+        {
+            case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+            {
+                ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*) &resource->Data;
+                if (irq_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                for (i = 0; i < irq_data->InterruptCount; i++)
+                {
+                    RequirementDescriptor->Option = (i == 0) ? IO_RESOURCE_PREFERRED : IO_RESOURCE_ALTERNATIVE;
+                    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 = (i == 0) ? IO_RESOURCE_PREFERRED : IO_RESOURCE_ALTERNATIVE;
+                    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_DMA:
+            {
+                ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &resource->Data;
+                for (i = 0; i < dma_data->ChannelCount; i++)
+                {
+                    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;
+                    }
+
+                    RequirementDescriptor->Option = (i == 0) ? IO_RESOURCE_PREFERRED : IO_RESOURCE_ALTERNATIVE;
+                    RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
+                    RequirementDescriptor->u.Dma.MinimumChannel =
+                    RequirementDescriptor->u.Dma.MaximumChannel = dma_data->Channels[i];
+                    RequirementDescriptor++;
+                }
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_IO:
+            {
+                ACPI_RESOURCE_IO *io_data = (ACPI_RESOURCE_IO*) &resource->Data;
+                RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
+                if (io_data->IoDecode == ACPI_DECODE_16)
+                    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 = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                RequirementDescriptor->Type = CmResourceTypePort;
+                RequirementDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
+                RequirementDescriptor->u.Port.Alignment = io_data->Alignment;
+                RequirementDescriptor->u.Port.MinimumAddress.QuadPart = io_data->Minimum;
+                RequirementDescriptor->u.Port.MaximumAddress.QuadPart = io_data->Maximum + io_data->AddressLength - 1;
+
+                RequirementDescriptor++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_ADDRESS16:
+            {
+                ACPI_RESOURCE_ADDRESS16 *addr16_data = (ACPI_RESOURCE_ADDRESS16*) &resource->Data;
+                if (addr16_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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 + addr16_data->AddressLength - 1;
+                    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 + addr16_data->AddressLength - 1;
+                    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 + addr16_data->AddressLength - 1;
+                    RequirementDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                }
+                RequirementDescriptor++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_ADDRESS32:
+            {
+                ACPI_RESOURCE_ADDRESS32 *addr32_data = (ACPI_RESOURCE_ADDRESS32*) &resource->Data;
+                if (addr32_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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 + addr32_data->AddressLength - 1;
+                    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 + addr32_data->AddressLength - 1;
+                    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 + addr32_data->AddressLength - 1;
+                    RequirementDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                }
+                RequirementDescriptor++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_ADDRESS64:
+            {
+                ACPI_RESOURCE_ADDRESS64 *addr64_data = (ACPI_RESOURCE_ADDRESS64*) &resource->Data;
+                if (addr64_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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 + addr64_data->AddressLength - 1;
+                    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 + addr64_data->AddressLength - 1;
+                    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 + addr64_data->AddressLength - 1;
+                    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;
+                if (addr64_data->ProducerConsumer == ACPI_PRODUCER)
+                    break;
+                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 + addr64_data->AddressLength - 1;
+                    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 + addr64_data->AddressLength - 1;
+                    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 + addr64_data->AddressLength - 1;
+                    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 + mem24_data->AddressLength - 1;
+                RequirementDescriptor->u.Memory.Length = mem24_data->AddressLength;
+
+                RequirementDescriptor++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_MEMORY32:
+            {
+                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 + mem32_data->AddressLength - 1;
+                RequirementDescriptor->u.Memory.Length = mem32_data->AddressLength;
+
+                RequirementDescriptor++;
+                break;
+            }
+            case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+            {
+                ACPI_RESOURCE_FIXED_MEMORY32 *fixedmem32_data = (ACPI_RESOURCE_FIXED_MEMORY32*) &resource->Data;
+                RequirementDescriptor->Option = CurrentRes ? 0 : IO_RESOURCE_PREFERRED;
+                RequirementDescriptor->Type = CmResourceTypeMemory;
+                RequirementDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+                RequirementDescriptor->Flags = 0;
+                if (fixedmem32_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 = fixedmem32_data->Address;
+                RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = fixedmem32_data->Address + fixedmem32_data->AddressLength - 1;
+                RequirementDescriptor->u.Memory.Length = fixedmem32_data->AddressLength;
+                
+                RequirementDescriptor++;
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+        resource = ACPI_NEXT_RESOURCE(resource);
+    }
+    ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
 
     Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;