[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 7/9] gqa-win: get_pci_info: Replace 'while' with 2 calls of the fu
From: |
Konstantin Kostiuk |
Subject: |
[PULL 7/9] gqa-win: get_pci_info: Replace 'while' with 2 calls of the function |
Date: |
Mon, 10 Jan 2022 15:46:42 +0200 |
From: Kostiantyn Kostiuk <konstantin@daynix.com>
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>
---
qga/commands-win32.c | 30 ++++++++++++++++++++++++------
1 file changed, 24 insertions(+), 6 deletions(-)
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 3092566313..892082504f 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -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, ...)
--
2.25.1
- [PULL 0/9] qemu-ga-win patches, Konstantin Kostiuk, 2022/01/10
- [PULL 1/9] MAINTAINERS: Add entry for QEMU Guest Agent Windows components, Konstantin Kostiuk, 2022/01/10
- [PULL 2/9] gqa-win: get_pci_info: Clean dev_info if handle is valid, Konstantin Kostiuk, 2022/01/10
- [PULL 3/9] gqa-win: get_pci_info: Use common 'end' label, Konstantin Kostiuk, 2022/01/10
- [PULL 5/9] gqa-win: get_pci_info: Split logic to separate functions, Konstantin Kostiuk, 2022/01/10
- [PULL 6/9] gqa-win: get_pci_info: Add g_autofree for few variables, Konstantin Kostiuk, 2022/01/10
- [PULL 7/9] gqa-win: get_pci_info: Replace 'while' with 2 calls of the function,
Konstantin Kostiuk <=
- [PULL 8/9] qga-win: Detect OS based on Windows 10 by first build number, Konstantin Kostiuk, 2022/01/10
- [PULL 4/9] gqa-win: get_pci_info: Free parent_dev_info properly, Konstantin Kostiuk, 2022/01/10
- [PULL 9/9] qga-win: Detect Windows 11 by build number, Konstantin Kostiuk, 2022/01/10
- Re: [PULL 0/9] qemu-ga-win patches, Philippe Mathieu-Daudé, 2022/01/10
- Re: [PULL 0/9] qemu-ga-win patches, Peter Maydell, 2022/01/15