From nobody Fri Dec 19 20:17:28 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1599470161; cv=none; d=zohomail.com; s=zohoarc; b=JZ2EG9VsXxuUr5JQY/FWsIsHlzbv73sDfcbj5SQ4glw4t+c+HSbc3R5MB1V1fWpAfZSZkmKPdMwO9wYy3GTWZCNRP9ZN2CdCFLnT8yDbjBim7G4L0TN5tGyu29cofWrrYAU2GGj31QGMSoB1QjLb5QN5lxpHAMwhwFSzkAQpUO0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1599470161; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=+osGm5VoqFfp8g5HnBUBNDMbAdQdsswlF1C+9TeRIP0=; b=Oze52OgY/H0u5qappWGsZc2TYynmxpEJWe8uAbX77l7tAKzPuDkaMuS7WiHmeozikqyHKN/Rc4t2pn16VIwzD8i03pyX6U982KYxR5LEWpivBzjXzaSy4sBLyA0pCA3ccLP953zcUgjVCluqyU9R8w50KU23Rh9C5C/ONbYB5XE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1599470161149794.6045897635297; Mon, 7 Sep 2020 02:16:01 -0700 (PDT) Received: from localhost ([::1]:49506 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kFDFn-00035t-Gl for importer@patchew.org; Mon, 07 Sep 2020 05:15:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33490) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kFDEj-0002CO-2g for qemu-devel@nongnu.org; Mon, 07 Sep 2020 05:14:53 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:38837) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kFDEh-00029U-5j for qemu-devel@nongnu.org; Mon, 07 Sep 2020 05:14:52 -0400 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-36-vJ9pxOaSNdCVUhqkMVwP7w-1; Mon, 07 Sep 2020 05:14:48 -0400 Received: by mail-ej1-f71.google.com with SMTP id md9so5046252ejb.8 for ; Mon, 07 Sep 2020 02:14:47 -0700 (PDT) Received: from auriga.localdomain (ip-89-176-41-222.net.upcbroadband.cz. [89.176.41.222]) by smtp.gmail.com with ESMTPSA id d6sm14394910edm.31.2020.09.07.02.14.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2020 02:14:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1599470090; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+osGm5VoqFfp8g5HnBUBNDMbAdQdsswlF1C+9TeRIP0=; b=PQxAp6byvys4F4sOG+Gx6N7PeSg0h4hUby8aQ3bjPrFcfatl/gONngevklECLPxdtN6kk7 xCedlAUo3fya5jNWMIJLqRmGa/B4YYsbXFJll7HoCVLPHc9d9XRkg86EORQEymqRq1phTM MVxJ9EHDKvQIKt/15asS4gScPyV4gm8= X-MC-Unique: vJ9pxOaSNdCVUhqkMVwP7w-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+osGm5VoqFfp8g5HnBUBNDMbAdQdsswlF1C+9TeRIP0=; b=qjOz3PlDgqebPcAdGtBdYajMw2cmvizU4hdiuYljyLzgp+tgbQVvLv8lkwkxgMpiyI ZHE0forJN9wixJpnrfEhpHp9kNdqqyJeit/gD2fTZBG1v8V7C5BPgEhvpIexG2yop8fN oCl/lmrebyncWubSbUdrAPsQvoySYn2Xex5bCYHdqXHyb39pX3XgquDDZxf9ZbCd6/St Ms5xBgEMwRqAf5DbFBXuB2/IRNpm7uJ2SKgVu4ZK0oi+XRZG8juybVOqga6L+b9h+iL8 PwAl7kw0k/JGsFpoi5RzRhNtElRlceGvfV0Tc9VXlTvar/1JF1PfEoAAnbwo1aah1irx wy+g== X-Gm-Message-State: AOAM532lIcMyZyXwmAsD727uj3QnmjxoKc4SemKJVH0pdPexPem6KKwh K32Q5rh9JaShdQDkm8Ja/Yv8uHOjG5LZPAcKLG1KzmwlxGiMwYBLSek7rCqhQB41R7rgJbcEZDn JBDk+Dj93DVG67Is= X-Received: by 2002:a17:906:4cc6:: with SMTP id q6mr12809327ejt.201.1599470086881; Mon, 07 Sep 2020 02:14:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJysKo3MUs17TWXGHG1hDfFh0K7NB9Ee4T9nbDSWlw3emoDJcn33PsOChEtn026O5kNrUw3ULw== X-Received: by 2002:a17:906:4cc6:: with SMTP id q6mr12809311ejt.201.1599470086693; Mon, 07 Sep 2020 02:14:46 -0700 (PDT) From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= To: Michael Roth , Thomas Huth , qemu-devel@nongnu.org Subject: [PATCH v2 3/3] qga: add implementation of guest-get-disks for Windows Date: Mon, 7 Sep 2020 11:14:42 +0200 Message-Id: <2cd59ce454e0da02eeb75ab7461ef420b30864f5.1599470071.git.tgolembi@redhat.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: References: MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=tgolembi@redhat.com X-Mimecast-Spam-Score: 0.002 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=tgolembi@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/07 03:52:11 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.099, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) The command lists all the physical disk drives. Unlike for Linux partitions and virtual volumes are not listed. Example output: { "return": [ { "name": "\\\\.\\PhysicalDrive0", "partition": false, "address": { "serial": "QM00001", "bus-type": "sata", ... }, "slaves": [] } ] } Signed-off-by: Tom=C3=A1=C5=A1 Golembiovsk=C3=BD --- qga/commands-win32.c | 97 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 6 deletions(-) diff --git a/qga/commands-win32.c b/qga/commands-win32.c index e9976a0c46..9ac847a187 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -945,6 +945,91 @@ out: return list; } =20 +GuestDiskInfoList *qmp_guest_get_disks(Error **errp) +{ + GuestDiskInfoList *new =3D NULL, *ret =3D NULL; + HDEVINFO dev_info; + SP_DEVICE_INTERFACE_DATA dev_iface_data; + int i; + + dev_info =3D SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0, + DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + if (dev_info =3D=3D INVALID_HANDLE_VALUE) { + error_setg_win32(errp, GetLastError(), "failed to get device tree"= ); + return NULL; + } + + g_debug("enumerating devices"); + dev_iface_data.cbSize =3D sizeof(SP_DEVICE_INTERFACE_DATA); + for (i =3D 0; + SetupDiEnumDeviceInterfaces(dev_info, NULL, &GUID_DEVINTERFACE_DIS= K, + i, &dev_iface_data); + i++) { + GuestDiskAddress *address =3D NULL; + GuestDiskInfo *disk =3D NULL; + Error *local_err =3D NULL; + g_autofree PSP_DEVICE_INTERFACE_DETAIL_DATA + pdev_iface_detail_data =3D NULL; + STORAGE_DEVICE_NUMBER sdn; + HANDLE dev_file; + DWORD size =3D 0; + + g_debug(" getting device path"); + while (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_iface_data, + pdev_iface_detail_data, + size, &size, + NULL)) { + if (GetLastError() =3D=3D ERROR_INSUFFICIENT_BUFFER) { + pdev_iface_detail_data =3D g_malloc(size); + pdev_iface_detail_data->cbSize =3D + sizeof(*pdev_iface_detail_data); + } else { + g_debug("failed to get device interface details"); + continue; + } + } + + g_debug(" device: %s", pdev_iface_detail_data->DevicePath); + dev_file =3D CreateFile(pdev_iface_detail_data->DevicePath, 0, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (!DeviceIoControl(dev_file, IOCTL_STORAGE_GET_DEVICE_NUMBER, + NULL, 0, &sdn, sizeof(sdn), &size, NULL)) { + CloseHandle(dev_file); + debug_error("failed to get storage device number"); + continue; + } + CloseHandle(dev_file); + + disk =3D g_new0(GuestDiskInfo, 1); + disk->name =3D g_strdup_printf("\\\\.\\PhysicalDrive%lu", + sdn.DeviceNumber); + + g_debug(" number: %lu", sdn.DeviceNumber); + address =3D g_malloc0(sizeof(GuestDiskAddress)); + address->has_dev =3D true; + address->dev =3D g_strdup(disk->name); + get_single_disk_info(sdn.DeviceNumber, address, &local_err); + if (local_err) { + g_debug("failed to get disk info: %s", + error_get_pretty(local_err)); + error_free(local_err); + qapi_free_GuestDiskAddress(address); + address =3D NULL; + } else { + disk->address =3D address; + disk->has_address =3D true; + } + + new =3D g_malloc0(sizeof(GuestDiskInfoList)); + new->value =3D disk; + new->next =3D ret; + ret =3D new; + } + + SetupDiDestroyDeviceInfoList(dev_info); + return ret; +} + #else =20 static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **err= p) @@ -952,6 +1037,12 @@ static GuestDiskAddressList *build_guest_disk_info(ch= ar *guid, Error **errp) return NULL; } =20 +GuestDiskInfoList *qmp_guest_get_disks(Error **errp) +{ + error_setg(errp, QERR_UNSUPPORTED); + return NULL; +} + #endif /* CONFIG_QGA_NTDDSCSI */ =20 static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp) @@ -2229,9 +2320,3 @@ GuestOSInfo *qmp_guest_get_osinfo(Error **errp) =20 return info; } - -GuestDiskInfoList *qmp_guest_get_disks(Error **errp) -{ - error_setg(errp, QERR_UNSUPPORTED); - return NULL; -} --=20 2.25.0