[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / busmgr / bus.c
index 2130f3c..b0b6a4d 100644 (file)
@@ -1138,7 +1138,7 @@ acpi_bus_add (
        struct acpi_device      *device = NULL;
        char                    bus_id[5] = {'?',0};
        ACPI_BUFFER     buffer;
-       ACPI_DEVICE_INFO        *info;
+       ACPI_DEVICE_INFO        *info = NULL;
        char                    *hid = NULL;
        char                    *uid = NULL;
        ACPI_PNP_DEVICE_ID_LIST *cid_list = NULL;
@@ -1192,14 +1192,6 @@ acpi_bus_add (
                snprintf(device->pnp.bus_id, sizeof(device->pnp.bus_id), "%s", bus_id);
                buffer.Pointer = NULL;
 
-               /* HACK: Skip HPET */
-               if (strstr(device->pnp.bus_id, "HPET"))
-               {
-                       DPRINT("Using HPET hack\n");
-                       result = -1;
-                       goto end;
-               }
-
                break;
        }
 
@@ -1256,6 +1248,7 @@ acpi_bus_add (
                        ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                                "Error reading device info\n"));
                        result = AE_NOT_FOUND;
+                       info = NULL;
                        goto end;
                }
                if (info->Valid & ACPI_VALID_HID)
@@ -1265,8 +1258,19 @@ acpi_bus_add (
                if (info->Valid & ACPI_VALID_CID) {
                        cid_list = &info->CompatibleIdList;
                        device->pnp.cid_list = ExAllocatePoolWithTag(NonPagedPool,cid_list->ListSize, 'DpcA');
-                       if (device->pnp.cid_list)
-                               memcpy(device->pnp.cid_list, cid_list, cid_list->ListSize);
+                       if (device->pnp.cid_list) {
+                               char *p = (char *)&device->pnp.cid_list->Ids[cid_list->Count];
+                               device->pnp.cid_list->Count = cid_list->Count;
+                               device->pnp.cid_list->ListSize = cid_list->ListSize;
+                               for (i = 0; i < cid_list->Count; i++) {
+                                       device->pnp.cid_list->Ids[i].Length = cid_list->Ids[i].Length;
+                                       device->pnp.cid_list->Ids[i].String = p;
+                                       ASSERT(p + cid_list->Ids[i].Length <= (char *)device->pnp.cid_list + cid_list->ListSize);
+                                       memcpy(device->pnp.cid_list->Ids[i].String,
+                                               cid_list->Ids[i].String, cid_list->Ids[i].Length);
+                                       p += cid_list->Ids[i].Length;
+                               }
+                       }
                        else
                                DPRINT("Memory allocation error\n");
                }
@@ -1274,7 +1278,6 @@ acpi_bus_add (
                        device->pnp.bus_address = info->Address;
                        device->flags.bus_address = 1;
                }
-               ACPI_FREE(info);
                break;
        case ACPI_BUS_TYPE_POWER:
                hid = ACPI_POWER_HID;
@@ -1435,6 +1438,8 @@ acpi_bus_add (
                acpi_bus_find_driver(device);
 
 end:
+       if (info != NULL)
+               ACPI_FREE(info);
        if (result) {
                if (device->pnp.cid_list) {
                        ExFreePoolWithTag(device->pnp.cid_list, 'DpcA');