Skip to content

Commit

Permalink
gqa-win: get_pci_info: Replace 'while' with 2 calls of the function
Browse files Browse the repository at this point in the history
Microsoft suggests this solution in the documentation:
https://docs.microsoft.com/en-us/windows/win32/api/setupapi/nf-setupapi-setupdigetdeviceinterfacedetaila

Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Kostiantyn Kostiuk <kkostiuk@redhat.com>
  • Loading branch information
kostyanf14 committed Jan 10, 2022
1 parent 5f22473 commit d919cea
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions qga/commands-win32.c
Expand Up @@ -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 =
Expand All @@ -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);
Expand Down Expand Up @@ -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 {
Expand All @@ -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, ...)
Expand Down

0 comments on commit d919cea

Please sign in to comment.