[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / busmgr / bus.c
index 3e50a48..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;
@@ -1248,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)
@@ -1257,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");
                }
@@ -1426,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');