|
|
|
@ -636,10 +636,10 @@ static GuestPCIAddress *get_pci_info(int number, Error **errp) |
|
|
|
if (SetupDiEnumDeviceInterfaces(dev_info, &dev_info_data, |
|
|
|
&GUID_DEVINTERFACE_DISK, 0, |
|
|
|
&dev_iface_data)) { |
|
|
|
while (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_iface_data, |
|
|
|
pdev_iface_detail_data, |
|
|
|
size, &size, |
|
|
|
&dev_info_data)) { |
|
|
|
if (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_iface_data, |
|
|
|
pdev_iface_detail_data, |
|
|
|
size, &size, |
|
|
|
&dev_info_data)) { |
|
|
|
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { |
|
|
|
pdev_iface_detail_data = g_malloc(size); |
|
|
|
pdev_iface_detail_data->cbSize = |
|
|
|
@ -651,6 +651,16 @@ static GuestPCIAddress *get_pci_info(int number, Error **errp) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_iface_data, |
|
|
|
pdev_iface_detail_data, |
|
|
|
size, &size, |
|
|
|
&dev_info_data)) { |
|
|
|
// pdev_iface_detail_data already is allocated
|
|
|
|
error_setg_win32(errp, GetLastError(), |
|
|
|
"failed to get device interfaces"); |
|
|
|
goto end; |
|
|
|
} |
|
|
|
|
|
|
|
dev_file = CreateFile(pdev_iface_detail_data->DevicePath, 0, |
|
|
|
FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, |
|
|
|
NULL); |
|
|
|
@ -680,8 +690,8 @@ static GuestPCIAddress *get_pci_info(int number, Error **errp) |
|
|
|
ULONG dev_id_size = 0; |
|
|
|
|
|
|
|
size = 0; |
|
|
|
while (!SetupDiGetDeviceInstanceId(dev_info, &dev_info_data, |
|
|
|
parent_dev_id, size, &size)) { |
|
|
|
if (!SetupDiGetDeviceInstanceId(dev_info, &dev_info_data, |
|
|
|
parent_dev_id, size, &size)) { |
|
|
|
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { |
|
|
|
parent_dev_id = g_malloc(size); |
|
|
|
} else { |
|
|
|
@ -691,6 +701,14 @@ static GuestPCIAddress *get_pci_info(int number, Error **errp) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!SetupDiGetDeviceInstanceId(dev_info, &dev_info_data, |
|
|
|
parent_dev_id, size, &size)) { |
|
|
|
// parent_dev_id already is allocated
|
|
|
|
error_setg_win32(errp, GetLastError(), |
|
|
|
"failed to get device instance ID"); |
|
|
|
goto end; |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
* CM API used here as opposed to |
|
|
|
* SetupDiGetDeviceProperty(..., DEVPKEY_Device_Parent, ...) |
|
|
|
|