[ACPICA]
[reactos.git] / reactos / drivers / bus / acpi / buspdo.c
index c689313..87e7e3f 100644 (file)
@@ -1,12 +1,4 @@
-#include <ntddk.h>
-
-#include <acpi.h>
-#include <acpisys.h>
-#include <wdmguid.h>
-#include <stdio.h>
-
-#include <acpi_bus.h>
-#include <acpi_drivers.h>
+#include "precomp.h"
 
 #include <initguid.h>
 #include <poclass.h>
@@ -173,6 +165,42 @@ Bus_PDO_PnP (
         }
         status = STATUS_SUCCESS;// We must not fail this IRP.
         break;
+
+    case IRP_MN_REMOVE_DEVICE:
+        //
+        // We handle REMOVE_DEVICE just like STOP_DEVICE. This is because
+        // the device is still physically present (or at least we don't know any better)
+        // so we have to retain the PDO after stopping and removing power from it.
+        //
+        if (DeviceData->InterfaceName.Length != 0)
+            IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE);
+
+        if (DeviceData->AcpiHandle && acpi_bus_power_manageable(DeviceData->AcpiHandle) &&
+            !ACPI_SUCCESS(acpi_bus_set_power(DeviceData->AcpiHandle, ACPI_STATE_D3)))
+        {
+            DPRINT1("Device %x failed to enter D3!\n", DeviceData->AcpiHandle);
+            state.DeviceState = PowerDeviceD3;
+            PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state);
+            DeviceData->Common.DevicePowerState = PowerDeviceD3;
+        }
+        
+        SET_NEW_PNP_STATE(DeviceData->Common, Stopped);
+        status = STATUS_SUCCESS;
+        break;
+
+    case IRP_MN_QUERY_REMOVE_DEVICE:
+        SET_NEW_PNP_STATE(DeviceData->Common, RemovalPending);
+        status = STATUS_SUCCESS;
+        break;
+
+    case IRP_MN_CANCEL_REMOVE_DEVICE:
+        if (RemovalPending == DeviceData->Common.DevicePnPState)
+        {
+            RESTORE_PREVIOUS_PNP_STATE(DeviceData->Common);
+        }
+        status = STATUS_SUCCESS;
+        break;
+
     case IRP_MN_QUERY_CAPABILITIES:
 
         //
@@ -406,9 +434,9 @@ Bus_PDO_QueryDeviceId(
       PIRP   Irp )
 {
     PIO_STACK_LOCATION      stack;
-    PWCHAR                  buffer;
+    PWCHAR                  buffer, src;
     WCHAR                   temp[256];
-    ULONG                   length;
+    ULONG                   length, i;
     NTSTATUS                status = STATUS_SUCCESS;
     struct acpi_device *Device;
 
@@ -419,6 +447,9 @@ Bus_PDO_QueryDeviceId(
     switch (stack->Parameters.QueryId.IdType) {
 
     case BusQueryDeviceID:
+
+        /* This is a REG_SZ value */
+
         if (DeviceData->AcpiHandle)
         {
             acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
@@ -437,9 +468,11 @@ Bus_PDO_QueryDeviceId(
                               L"ACPI\\FixedButton");
         }
 
-        temp[++length] = UNICODE_NULL;
+        temp[length++] = UNICODE_NULL;
 
-         buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
+        NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
+
+        buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
 
         if (!buffer) {
            status = STATUS_INSUFFICIENT_RESOURCES;
@@ -452,6 +485,9 @@ Bus_PDO_QueryDeviceId(
         break;
 
     case BusQueryInstanceID:
+
+        /* This is a REG_SZ value */
+
         /* See comment in BusQueryDeviceID case */
         if(DeviceData->AcpiHandle)
         {
@@ -466,12 +502,16 @@ Bus_PDO_QueryDeviceId(
               length = swprintf(temp, L"%ls", L"0000");
         }
         else
+        {
            /* FIXME: Generate unique id! */
            length = swprintf(temp, L"%ls", L"0000");
+        }
+
+        temp[length++] = UNICODE_NULL;
 
-        temp[++length] = UNICODE_NULL;
+        NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
 
-        buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof (WCHAR), 'IPCA');
+        buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
         if (!buffer) {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
@@ -483,50 +523,143 @@ Bus_PDO_QueryDeviceId(
         break;
 
     case BusQueryHardwareIDs:
+
+        /* This is a REG_MULTI_SZ value */
         length = 0;
+        status = STATUS_NOT_SUPPORTED;
 
         /* See comment in BusQueryDeviceID case */
         if (DeviceData->AcpiHandle)
         {
             acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+            
+            if (!Device->flags.hardware_id)
+            {
+                /* We don't have the ID to satisfy this request */
+                break;
+            }
 
-            length += swprintf(&temp[length],
-                               L"ACPI\\%hs",
-                               Device->pnp.hardware_id);
-            length++;
+            DPRINT("Device name: %s\n", Device->pnp.device_name);
+            DPRINT("Hardware ID: %s\n", Device->pnp.hardware_id);
 
-            length += swprintf(&temp[length],
-                               L"*%hs",
-                               Device->pnp.hardware_id);
-            length++;
-         }
-         else
-         {
+            if (strcmp(Device->pnp.hardware_id, "Processor") == 0)
+            {
+                length = ProcessorHardwareIds.Length / sizeof(WCHAR);
+                src = ProcessorHardwareIds.Buffer;
+            }
+            else
+            {
+                length += swprintf(&temp[length],
+                                   L"ACPI\\%hs",
+                                   Device->pnp.hardware_id);
+                temp[length++] = UNICODE_NULL;
+
+                length += swprintf(&temp[length],
+                                   L"*%hs",
+                                   Device->pnp.hardware_id);
+                temp[length++] = UNICODE_NULL;
+                temp[length++] = UNICODE_NULL;
+                src = temp;
+            }
+        }
+        else
+        {
             length += swprintf(&temp[length],
                                L"ACPI\\FixedButton");
-            length++;
+            temp[length++] = UNICODE_NULL;
 
             length += swprintf(&temp[length],
                                L"*FixedButton");
-            length++;
-         }
-
-         temp[length] = UNICODE_NULL;
-
-         length++;
+            temp[length++] = UNICODE_NULL;
+            temp[length++] = UNICODE_NULL;
+            src = temp;
+        }
 
-         temp[length] = UNICODE_NULL;
+        NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
 
-        buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
+        buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
 
         if (!buffer) {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
         }
 
-        RtlCopyMemory (buffer, temp, length * sizeof(WCHAR));
+        RtlCopyMemory (buffer, src, length * sizeof(WCHAR));
         Irp->IoStatus.Information = (ULONG_PTR) buffer;
         DPRINT("BusQueryHardwareIDs: %ls\n",buffer);
+        status = STATUS_SUCCESS;
+        break;
+
+    case BusQueryCompatibleIDs:
+
+        /* This is a REG_MULTI_SZ value */
+        length = 0;
+        status = STATUS_NOT_SUPPORTED;
+
+        /* See comment in BusQueryDeviceID case */
+        if (DeviceData->AcpiHandle)
+        {
+            acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+            if (!Device->flags.hardware_id)
+            {
+                /* We don't have the ID to satisfy this request */
+                break;
+            }
+            
+            DPRINT("Device name: %s\n", Device->pnp.device_name);
+            DPRINT("Hardware ID: %s\n", Device->pnp.hardware_id);
+            
+            if (strcmp(Device->pnp.hardware_id, "Processor") == 0)
+            {
+                length += swprintf(&temp[length],
+                                   L"ACPI\\%hs",
+                                   Device->pnp.hardware_id);
+                temp[length++] = UNICODE_NULL;
+
+                length += swprintf(&temp[length],
+                                   L"*%hs",
+                                   Device->pnp.hardware_id);
+                temp[length++] = UNICODE_NULL;
+                temp[length++] = UNICODE_NULL;
+            }
+            else if (Device->flags.compatible_ids)
+            {
+                for (i = 0; i < Device->pnp.cid_list->Count; i++)
+                {
+                    length += swprintf(&temp[length],
+                                   L"ACPI\\%hs",
+                                   Device->pnp.cid_list->Ids[i].String);
+                    temp[length++] = UNICODE_NULL;
+                    
+                    length += swprintf(&temp[length],
+                                   L"*%hs",
+                                   Device->pnp.cid_list->Ids[i].String);
+                    temp[length++] = UNICODE_NULL;
+                }
+                
+                temp[length++] = UNICODE_NULL;
+            }
+            else
+            {
+                /* No compatible IDs */
+                break;
+            }
+            
+            NT_ASSERT(length * sizeof(WCHAR) <= sizeof(temp));
+
+            buffer = ExAllocatePoolWithTag(PagedPool, length * sizeof(WCHAR), 'IpcA');
+            if (!buffer)
+            {
+                status = STATUS_INSUFFICIENT_RESOURCES;
+                break;
+            }
+
+            RtlCopyMemory (buffer, temp, length * sizeof(WCHAR));
+            Irp->IoStatus.Information = (ULONG_PTR) buffer;
+            DPRINT("BusQueryCompatibleIDs: %ls\n",buffer);
+            status = STATUS_SUCCESS;
+        }
         break;
 
     default:
@@ -604,7 +737,12 @@ Bus_PDO_QueryDeviceText(
            else if (wcsstr(DeviceData->HardwareIDs, L"ACPI_PWR") != 0)
             Temp = L"ACPI Power Resource";
            else if (wcsstr(DeviceData->HardwareIDs, L"Processor") != 0)
-            Temp = L"Processor";
+           {
+               if (ProcessorNameString != NULL)
+                   Temp = ProcessorNameString;
+               else
+                   Temp = L"Processor";
+           }
            else if (wcsstr(DeviceData->HardwareIDs, L"ThermalZone") != 0)
             Temp = L"ACPI Thermal Zone";
            else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0002") != 0)
@@ -619,7 +757,7 @@ Bus_PDO_QueryDeviceText(
           else
             Temp = L"Other ACPI device";
 
-            Buffer = ExAllocatePoolWithTag (PagedPool, (wcslen(Temp) + 1) * sizeof(WCHAR), 'IPCA');
+            Buffer = ExAllocatePoolWithTag(PagedPool, (wcslen(Temp) + 1) * sizeof(WCHAR), 'IpcA');
 
             if (!Buffer) {
                 status = STATUS_INSUFFICIENT_RESOURCES;
@@ -689,13 +827,13 @@ Bus_PDO_QueryResources(
         }
         else
         {
-            DPRINT1("Using _BBN for bus number\n");
+            DPRINT("Using _BBN for bus number\n");
         }
 
-        DPRINT1("Found PCI root hub: %d\n", BusNumber);
+        DPRINT("Found PCI root hub: %d\n", BusNumber);
 
         ResourceListSize = sizeof(CM_RESOURCE_LIST);
-        ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'IPCA');
+        ResourceList = ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'RpcA');
         if (!ResourceList)
             return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -725,7 +863,7 @@ Bus_PDO_QueryResources(
       return Irp->IoStatus.Status;
     }
 
-    Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'IPCA');
+    Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'BpcA');
     if (!Buffer.Pointer)
       return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -794,11 +932,11 @@ Bus_PDO_QueryResources(
 
     /* Allocate memory */
     ResourceListSize = sizeof(CM_RESOURCE_LIST) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-    ResourceList = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'IPCA');
+    ResourceList = ExAllocatePoolWithTag(PagedPool, ResourceListSize, 'RpcA');
 
     if (!ResourceList)
     {
-        ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+        ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
         return STATUS_INSUFFICIENT_RESOURCES;
     }
     ResourceList->Count = 1;
@@ -906,7 +1044,7 @@ Bus_PDO_QueryResources(
                 ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
                 ResourceDescriptor->u.Port.Start.QuadPart = io_data->Address;
                 ResourceDescriptor->u.Port.Length = io_data->AddressLength;
-                
+
                 ResourceDescriptor++;
                 break;
             }
@@ -920,8 +1058,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Type = CmResourceTypeBusNumber;
                     ResourceDescriptor->ShareDisposition = CmResourceShareShared;
                     ResourceDescriptor->Flags = 0;
-                    ResourceDescriptor->u.BusNumber.Start = addr16_data->Minimum;
-                    ResourceDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+                    ResourceDescriptor->u.BusNumber.Start = addr16_data->Address.Minimum;
+                    ResourceDescriptor->u.BusNumber.Length = addr16_data->Address.AddressLength;
                 }
                 else if (addr16_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -930,8 +1068,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr16_data->Decode == ACPI_POS_DECODE)
                         ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    ResourceDescriptor->u.Port.Start.QuadPart = addr16_data->Minimum;
-                    ResourceDescriptor->u.Port.Length = addr16_data->AddressLength;
+                    ResourceDescriptor->u.Port.Start.QuadPart = addr16_data->Address.Minimum;
+                    ResourceDescriptor->u.Port.Length = addr16_data->Address.AddressLength;
                 }
                 else
                 {
@@ -948,8 +1086,8 @@ Bus_PDO_QueryResources(
                         case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
                     }
-                    ResourceDescriptor->u.Memory.Start.QuadPart = addr16_data->Minimum;
-                    ResourceDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                    ResourceDescriptor->u.Memory.Start.QuadPart = addr16_data->Address.Minimum;
+                    ResourceDescriptor->u.Memory.Length = addr16_data->Address.AddressLength;
                 }
                 ResourceDescriptor++;
                 break;
@@ -964,8 +1102,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Type = CmResourceTypeBusNumber;
                     ResourceDescriptor->ShareDisposition = CmResourceShareShared;
                     ResourceDescriptor->Flags = 0;
-                    ResourceDescriptor->u.BusNumber.Start = addr32_data->Minimum;
-                    ResourceDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+                    ResourceDescriptor->u.BusNumber.Start = addr32_data->Address.Minimum;
+                    ResourceDescriptor->u.BusNumber.Length = addr32_data->Address.AddressLength;
                 }
                 else if (addr32_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -974,8 +1112,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr32_data->Decode == ACPI_POS_DECODE)
                         ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    ResourceDescriptor->u.Port.Start.QuadPart = addr32_data->Minimum;
-                    ResourceDescriptor->u.Port.Length = addr32_data->AddressLength;
+                    ResourceDescriptor->u.Port.Start.QuadPart = addr32_data->Address.Minimum;
+                    ResourceDescriptor->u.Port.Length = addr32_data->Address.AddressLength;
                 }
                 else
                 {
@@ -992,8 +1130,8 @@ Bus_PDO_QueryResources(
                         case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
                     }
-                    ResourceDescriptor->u.Memory.Start.QuadPart = addr32_data->Minimum;
-                    ResourceDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                    ResourceDescriptor->u.Memory.Start.QuadPart = addr32_data->Address.Minimum;
+                    ResourceDescriptor->u.Memory.Length = addr32_data->Address.AddressLength;
                 }
                 ResourceDescriptor++;
                 break;
@@ -1009,8 +1147,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Type = CmResourceTypeBusNumber;
                     ResourceDescriptor->ShareDisposition = CmResourceShareShared;
                     ResourceDescriptor->Flags = 0;
-                    ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
-                    ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                    ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Address.Minimum;
+                    ResourceDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
                 }
                 else if (addr64_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -1019,8 +1157,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr64_data->Decode == ACPI_POS_DECODE)
                         ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Minimum;
-                    ResourceDescriptor->u.Port.Length = addr64_data->AddressLength;
+                    ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Address.Minimum;
+                    ResourceDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
                 }
                 else
                 {
@@ -1036,9 +1174,9 @@ Bus_PDO_QueryResources(
                         case ACPI_CACHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
                         case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
-                    }    
-                    ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Minimum;
-                    ResourceDescriptor->u.Memory.Length = addr64_data->AddressLength;
+                    }
+                    ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Address.Minimum;
+                    ResourceDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
                 }
                 ResourceDescriptor++;
                 break;
@@ -1054,8 +1192,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Type = CmResourceTypeBusNumber;
                     ResourceDescriptor->ShareDisposition = CmResourceShareShared;
                     ResourceDescriptor->Flags = 0;
-                    ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Minimum;
-                    ResourceDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                    ResourceDescriptor->u.BusNumber.Start = (ULONG)addr64_data->Address.Minimum;
+                    ResourceDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
                 }
                 else if (addr64_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -1064,8 +1202,8 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr64_data->Decode == ACPI_POS_DECODE)
                         ResourceDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Minimum;
-                    ResourceDescriptor->u.Port.Length = addr64_data->AddressLength;
+                    ResourceDescriptor->u.Port.Start.QuadPart = addr64_data->Address.Minimum;
+                    ResourceDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
                 }
                 else
                 {
@@ -1081,9 +1219,9 @@ Bus_PDO_QueryResources(
                         case ACPI_CACHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
                         case ACPI_WRITE_COMBINING_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
-                    }    
-                    ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Minimum;
-                    ResourceDescriptor->u.Memory.Length = addr64_data->AddressLength;
+                    }
+                    ResourceDescriptor->u.Memory.Start.QuadPart = addr64_data->Address.Minimum;
+                    ResourceDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
                 }
                 ResourceDescriptor++;
                 break;
@@ -1132,7 +1270,7 @@ Bus_PDO_QueryResources(
                     ResourceDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
                 ResourceDescriptor->u.Memory.Start.QuadPart = memfixed32_data->Address;
                 ResourceDescriptor->u.Memory.Length = memfixed32_data->AddressLength;
-                
+
                 ResourceDescriptor++;
                 break;
             }
@@ -1144,7 +1282,7 @@ Bus_PDO_QueryResources(
         resource = ACPI_NEXT_RESOURCE(resource);
     }
 
-    ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+    ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
     Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
     return STATUS_SUCCESS;
 }
@@ -1197,7 +1335,7 @@ Bus_PDO_QueryResourceRequirements(
             break;
     }
 
-    Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'IPCA');
+    Buffer.Pointer = ExAllocatePoolWithTag(PagedPool, Buffer.Length, 'BpcA');
     if (!Buffer.Pointer)
       return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -1267,11 +1405,11 @@ Bus_PDO_QueryResourceRequirements(
     }
 
     RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-    RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag(PagedPool, RequirementsListSize, 'IPCA');
+    RequirementsList = ExAllocatePoolWithTag(PagedPool, RequirementsListSize, 'RpcA');
 
     if (!RequirementsList)
     {
-        ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+        ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
         return STATUS_INSUFFICIENT_RESOURCES;
     }
     RequirementsList->ListSize = RequirementsListSize;
@@ -1384,7 +1522,7 @@ Bus_PDO_QueryResourceRequirements(
                 RequirementDescriptor->u.Port.Alignment = 1;
                 RequirementDescriptor->u.Port.MinimumAddress.QuadPart = io_data->Address;
                 RequirementDescriptor->u.Port.MaximumAddress.QuadPart = io_data->Address + io_data->AddressLength - 1;
-                
+
                 RequirementDescriptor++;
                 break;
             }
@@ -1399,9 +1537,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Type = CmResourceTypeBusNumber;
                     RequirementDescriptor->ShareDisposition = CmResourceShareShared;
                     RequirementDescriptor->Flags = 0;
-                    RequirementDescriptor->u.BusNumber.MinBusNumber = addr16_data->Minimum;
-                    RequirementDescriptor->u.BusNumber.MaxBusNumber = addr16_data->Maximum + addr16_data->AddressLength - 1;
-                    RequirementDescriptor->u.BusNumber.Length = addr16_data->AddressLength;
+                    RequirementDescriptor->u.BusNumber.MinBusNumber = addr16_data->Address.Minimum;
+                    RequirementDescriptor->u.BusNumber.MaxBusNumber = addr16_data->Address.Maximum + addr16_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.BusNumber.Length = addr16_data->Address.AddressLength;
                 }
                 else if (addr16_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -1410,9 +1548,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr16_data->Decode == ACPI_POS_DECODE)
                         RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr16_data->Minimum;
-                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr16_data->Maximum + addr16_data->AddressLength - 1;
-                    RequirementDescriptor->u.Port.Length = addr16_data->AddressLength;
+                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr16_data->Address.Minimum;
+                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr16_data->Address.Maximum + addr16_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Port.Length = addr16_data->Address.AddressLength;
                 }
                 else
                 {
@@ -1429,9 +1567,9 @@ Bus_PDO_QueryResourceRequirements(
                         case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
                     }
-                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr16_data->Minimum;
-                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr16_data->Maximum + addr16_data->AddressLength - 1;
-                    RequirementDescriptor->u.Memory.Length = addr16_data->AddressLength;
+                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr16_data->Address.Minimum;
+                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr16_data->Address.Maximum + addr16_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Memory.Length = addr16_data->Address.AddressLength;
                 }
                 RequirementDescriptor++;
                 break;
@@ -1447,9 +1585,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Type = CmResourceTypeBusNumber;
                     RequirementDescriptor->ShareDisposition = CmResourceShareShared;
                     RequirementDescriptor->Flags = 0;
-                    RequirementDescriptor->u.BusNumber.MinBusNumber = addr32_data->Minimum;
-                    RequirementDescriptor->u.BusNumber.MaxBusNumber = addr32_data->Maximum + addr32_data->AddressLength - 1;
-                    RequirementDescriptor->u.BusNumber.Length = addr32_data->AddressLength;
+                    RequirementDescriptor->u.BusNumber.MinBusNumber = addr32_data->Address.Minimum;
+                    RequirementDescriptor->u.BusNumber.MaxBusNumber = addr32_data->Address.Maximum + addr32_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.BusNumber.Length = addr32_data->Address.AddressLength;
                 }
                 else if (addr32_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -1458,9 +1596,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr32_data->Decode == ACPI_POS_DECODE)
                         RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr32_data->Minimum;
-                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr32_data->Maximum + addr32_data->AddressLength - 1;
-                    RequirementDescriptor->u.Port.Length = addr32_data->AddressLength;
+                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr32_data->Address.Minimum;
+                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr32_data->Address.Maximum + addr32_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Port.Length = addr32_data->Address.AddressLength;
                 }
                 else
                 {
@@ -1477,9 +1615,9 @@ Bus_PDO_QueryResourceRequirements(
                         case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
                     }
-                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr32_data->Minimum;
-                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr32_data->Maximum + addr32_data->AddressLength - 1;
-                    RequirementDescriptor->u.Memory.Length = addr32_data->AddressLength;
+                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr32_data->Address.Minimum;
+                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr32_data->Address.Maximum + addr32_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Memory.Length = addr32_data->Address.AddressLength;
                 }
                 RequirementDescriptor++;
                 break;
@@ -1496,9 +1634,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Type = CmResourceTypeBusNumber;
                     RequirementDescriptor->ShareDisposition = CmResourceShareShared;
                     RequirementDescriptor->Flags = 0;
-                    RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Minimum;
-                    RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Maximum + addr64_data->AddressLength - 1;
-                    RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                    RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Address.Minimum;
+                    RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
                 }
                 else if (addr64_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -1507,9 +1645,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr64_data->Decode == ACPI_POS_DECODE)
                         RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Minimum;
-                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
-                    RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
                 }
                 else
                 {
@@ -1525,10 +1663,10 @@ Bus_PDO_QueryResourceRequirements(
                         case ACPI_CACHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
                         case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
-                    }    
-                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Minimum;
-                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
-                    RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+                    }
+                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
                 }
                 RequirementDescriptor++;
                 break;
@@ -1545,9 +1683,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Type = CmResourceTypeBusNumber;
                     RequirementDescriptor->ShareDisposition = CmResourceShareShared;
                     RequirementDescriptor->Flags = 0;
-                    RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Minimum;
-                    RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Maximum + addr64_data->AddressLength - 1;
-                    RequirementDescriptor->u.BusNumber.Length = addr64_data->AddressLength;
+                    RequirementDescriptor->u.BusNumber.MinBusNumber = (ULONG)addr64_data->Address.Minimum;
+                    RequirementDescriptor->u.BusNumber.MaxBusNumber = (ULONG)addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.BusNumber.Length = addr64_data->Address.AddressLength;
                 }
                 else if (addr64_data->ResourceType == ACPI_IO_RANGE)
                 {
@@ -1556,9 +1694,9 @@ Bus_PDO_QueryResourceRequirements(
                     RequirementDescriptor->Flags = CM_RESOURCE_PORT_IO;
                     if (addr64_data->Decode == ACPI_POS_DECODE)
                         RequirementDescriptor->Flags |= CM_RESOURCE_PORT_POSITIVE_DECODE;
-                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Minimum;
-                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
-                    RequirementDescriptor->u.Port.Length = addr64_data->AddressLength;
+                    RequirementDescriptor->u.Port.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+                    RequirementDescriptor->u.Port.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Port.Length = addr64_data->Address.AddressLength;
                 }
                 else
                 {
@@ -1574,10 +1712,10 @@ Bus_PDO_QueryResourceRequirements(
                         case ACPI_CACHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_CACHEABLE; break;
                         case ACPI_WRITE_COMBINING_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_COMBINEDWRITE; break;
                         case ACPI_PREFETCHABLE_MEMORY: RequirementDescriptor->Flags |= CM_RESOURCE_MEMORY_PREFETCHABLE; break;
-                    }    
-                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Minimum;
-                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Maximum + addr64_data->AddressLength - 1;
-                    RequirementDescriptor->u.Memory.Length = addr64_data->AddressLength;
+                    }
+                    RequirementDescriptor->u.Memory.MinimumAddress.QuadPart = addr64_data->Address.Minimum;
+                    RequirementDescriptor->u.Memory.MaximumAddress.QuadPart = addr64_data->Address.Maximum + addr64_data->Address.AddressLength - 1;
+                    RequirementDescriptor->u.Memory.Length = addr64_data->Address.AddressLength;
                 }
                 RequirementDescriptor++;
                 break;
@@ -1632,7 +1770,7 @@ Bus_PDO_QueryResourceRequirements(
                 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;
             }
@@ -1643,7 +1781,7 @@ Bus_PDO_QueryResourceRequirements(
         }
         resource = ACPI_NEXT_RESOURCE(resource);
     }
-    ExFreePoolWithTag(Buffer.Pointer, 'IPCA');
+    ExFreePoolWithTag(Buffer.Pointer, 'BpcA');
 
     Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
 
@@ -1708,10 +1846,9 @@ Return Value:
             ASSERTMSG("Someone above is handling TargetDeviceRelation", !deviceRelations);
         }
 
-        deviceRelations = (PDEVICE_RELATIONS)
-                ExAllocatePoolWithTag (PagedPool,
-                                        sizeof(DEVICE_RELATIONS),
-                                        'IPCA');
+        deviceRelations = ExAllocatePoolWithTag(PagedPool,
+                                                sizeof(DEVICE_RELATIONS),
+                                                'IpcA');
         if (!deviceRelations) {
                 status = STATUS_INSUFFICIENT_RESOURCES;
                 break;
@@ -1770,8 +1907,9 @@ Return Value:
 
     PAGED_CODE ();
 
-    busInfo = ExAllocatePoolWithTag (PagedPool, sizeof(PNP_BUS_INFORMATION),
-                                        'IPCA');
+    busInfo = ExAllocatePoolWithTag(PagedPool,
+                                    sizeof(PNP_BUS_INFORMATION),
+                                    'IpcA');
 
     if (busInfo == NULL) {
       return STATUS_INSUFFICIENT_RESOURCES;