[ros-diffs] [cgutman] 56226: [ACPI] - Ignore resource producers when reporting resources

cgutman at svn.reactos.org cgutman at svn.reactos.org
Sun Mar 25 16:42:27 UTC 2012


Author: cgutman
Date: Sun Mar 25 16:42:26 2012
New Revision: 56226

URL: http://svn.reactos.org/svn/reactos?rev=56226&view=rev
Log:
[ACPI]
- Ignore resource producers when reporting resources

Modified:
    trunk/reactos/drivers/bus/acpi/buspdo.c

Modified: trunk/reactos/drivers/bus/acpi/buspdo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/buspdo.c?rev=56226&r1=56225&r2=56226&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] Sun Mar 25 16:42:26 2012
@@ -552,71 +552,71 @@
     case DeviceTextDescription:
 
         if (!Irp->IoStatus.Information) {
-		  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";
+          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');
 
@@ -647,15 +647,15 @@
      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;
-	ULONGLONG BusNumber;
+    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)
@@ -735,384 +735,403 @@
       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:
+    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 */
+            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;
-			}
+    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->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);
-	}
+                ResourceDescriptor++;
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+        resource = ACPI_NEXT_RESOURCE(resource);
+    }
 
     ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
-	Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
-	return STATUS_SUCCESS;
+    Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -1120,14 +1139,14 @@
      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 ();
 
@@ -1147,7 +1166,7 @@
     {
         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) ||
@@ -1177,403 +1196,422 @@
       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:
+    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 */
+            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 + io_data->AddressLength - 1;
-
-				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 + 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;
-				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;
-				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;
-				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;
-			}
+    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++)
+                {
+                    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 + 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;
+            {
+                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');
+                RequirementDescriptor++;
+                break;
+            }
+            default:
+            {
+                break;
+            }
+        }
+        resource = ACPI_NEXT_RESOURCE(resource);
+    }
+    ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
 
     Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
 




More information about the Ros-diffs mailing list