diff --git a/0001-Change-Version.patch b/0001-Change-Version.patch index 0f0b029..626321f 100644 --- a/0001-Change-Version.patch +++ b/0001-Change-Version.patch @@ -14,6 +14,6 @@ index 91ff57278e..586de296f5 100644 +++ b/VERSION @@ -1 +1 @@ -8.0.0 -+106.0.0 ++106.0.1 -- 2.17.2 diff --git a/mingw-qemu-ga-win.spec b/mingw-qemu-ga-win.spec index 9b7b069..9f1b0c0 100644 --- a/mingw-qemu-ga-win.spec +++ b/mingw-qemu-ga-win.spec @@ -6,12 +6,12 @@ %define ga_distro "RHEL" Name: mingw-qemu-ga-win -Version: 106.0.0 +Version: 106.0.1 Release: 1%{?dist} Summary: Qemus Guest agent for Windows Group: System Environment/Daemons -License: GPLv2+ and LGPLv2+ and BSD +License: Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND FSFAP AND GPL-1.0-or-later AND GPL-2.0-only AND GPL-2.0-or-later AND GPL-2.0-or-later with GCC-exception-2.0 exception AND LGPL-2.0-only AND LGPL-2.0-or-later AND LGPL-2.1-only and LGPL-2.1-or-later AND MIT and public-domain and CC-BY-3.0 URL: http://www.qemu.org/ Requires(post): systemd-units Requires(preun): systemd-units @@ -19,6 +19,7 @@ Requires(postun): systemd-units Source0: http://wiki.qemu.org/download/qemu-%{qemu_version}.tar.bz2 Patch0001: 0001-Change-Version.patch +Patch0002: v5_20230710_kkostiuk_qga_vss_logging.mbx BuildArch: noarch @@ -64,6 +65,7 @@ This package does not need to be installed on the host OS. %prep %setup -q -n qemu-%{qemu_version} %patch0001 -p1 +%patch0002 -p1 %build @@ -120,6 +122,11 @@ cp build/qga/qemu-ga-x86_64.msi $RPM_BUILD_ROOT%{mingw64_bindir} %{mingw64_bindir}/qemu-ga* %changelog +* Sun Jul 10 2023 Konstantin Kostiuk 106.0.1 +- Set version to 106.0.1 +- RHELPLAN-147763 - [mingw-qemu-ga-win] VSS DLL: Add logging mechanism +- RHEL-581 - Use the SPDX vocabulary to specify the license + * Sun Apr 23 2023 Konstantin Kostiuk 106.0.0 - Set version to 106.0.0 - RHEL-408 - Add provides, obsoletes for mingw-qemu-ga-win diff --git a/v5_20230710_kkostiuk_qga_vss_logging.mbx b/v5_20230710_kkostiuk_qga_vss_logging.mbx new file mode 100644 index 0000000..e8e59c6 --- /dev/null +++ b/v5_20230710_kkostiuk_qga_vss_logging.mbx @@ -0,0 +1,711 @@ +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v5 1/4] QGA VSS: Add wrapper to send log to debugger and stderr +From: Konstantin Kostiuk +Date: Mon, 10 Jul 2023 12:14:36 +0300 +Message-Id: <20230710091439.1010553-2-kkostiuk@redhat.com> +To: qemu-devel@nongnu.org +Cc: Marc-André Lureau , Michael Roth ,Philippe Mathieu-Daudé , Thomas Huth +In-Reply-To: <20230710091439.1010553-1-kkostiuk@redhat.com> +References: <20230710091439.1010553-1-kkostiuk@redhat.com> +List-Id: +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +Signed-off-by: Konstantin Kostiuk +Reviewed-by: Thomas Huth +--- + qga/vss-win32/meson.build | 2 +- + qga/vss-win32/vss-debug.cpp | 39 +++++++++++++++++++++++++++++++++++++ + qga/vss-win32/vss-debug.h | 25 ++++++++++++++++++++++++ + 3 files changed, 65 insertions(+), 1 deletion(-) + create mode 100644 qga/vss-win32/vss-debug.cpp + create mode 100644 qga/vss-win32/vss-debug.h + +diff --git a/qga/vss-win32/meson.build b/qga/vss-win32/meson.build +index 9483ccd3b8..0ac918910b 100644 +--- a/qga/vss-win32/meson.build ++++ b/qga/vss-win32/meson.build +@@ -7,7 +7,7 @@ link_args = cc.get_supported_link_arguments([ + + qga_vss = shared_module( + 'qga-vss', +- ['requester.cpp', 'provider.cpp', 'install.cpp', genh], ++ ['requester.cpp', 'provider.cpp', 'install.cpp', 'vss-debug.cpp', genh], + name_prefix: '', + cpp_args: ['-Wno-unknown-pragmas', '-Wno-delete-non-virtual-dtor', '-Wno-non-virtual-dtor'], + link_args: link_args, +diff --git a/qga/vss-win32/vss-debug.cpp b/qga/vss-win32/vss-debug.cpp +new file mode 100644 +index 0000000000..820b1c6667 +--- /dev/null ++++ b/qga/vss-win32/vss-debug.cpp +@@ -0,0 +1,39 @@ ++/* ++ * QEMU Guest Agent VSS debug declarations ++ * ++ * Copyright (C) 2023 Red Hat Inc ++ * ++ * Authors: ++ * Konstantin Kostiuk ++ * ++ * This work is licensed under the terms of the GNU GPL, version 2 or later. ++ * See the COPYING file in the top-level directory. ++ */ ++ ++#include "qemu/osdep.h" ++#include "vss-debug.h" ++#include "vss-common.h" ++ ++void qga_debug_internal(const char *funcname, const char *fmt, ...) ++{ ++ char user_string[512] = {0}; ++ char full_string[640] = {0}; ++ ++ va_list args; ++ va_start(args, fmt); ++ if (vsnprintf(user_string, _countof(user_string), fmt, args) <= 0) { ++ va_end(args); ++ return; ++ } ++ ++ va_end(args); ++ ++ if (snprintf(full_string, _countof(full_string), ++ QGA_PROVIDER_NAME "[%lu]: %s %s\n", ++ GetCurrentThreadId(), funcname, user_string) <= 0) { ++ return; ++ } ++ ++ OutputDebugString(full_string); ++ fputs(full_string, stderr); ++} +diff --git a/qga/vss-win32/vss-debug.h b/qga/vss-win32/vss-debug.h +new file mode 100644 +index 0000000000..7800457392 +--- /dev/null ++++ b/qga/vss-win32/vss-debug.h +@@ -0,0 +1,25 @@ ++/* ++ * QEMU Guest Agent VSS debug declarations ++ * ++ * Copyright (C) 2023 Red Hat Inc ++ * ++ * Authors: ++ * Konstantin Kostiuk ++ * ++ * This work is licensed under the terms of the GNU GPL, version 2 or later. ++ * See the COPYING file in the top-level directory. ++ */ ++ ++#include "qemu/osdep.h" ++#include ++ ++#ifndef VSS_DEBUG_H ++#define VSS_DEBUG_H ++ ++void qga_debug_internal(const char *funcname, const char *fmt, ...) G_GNUC_PRINTF(2, 3); ++ ++#define qga_debug(fmt, ...) qga_debug_internal(__func__, fmt, ## __VA_ARGS__) ++#define qga_debug_begin qga_debug("begin") ++#define qga_debug_end qga_debug("end") ++ ++#endif + +-- +2.34.1 + + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v5 2/4] QGA VSS: Replace 'fprintf(stderr' with qga_debug +From: Konstantin Kostiuk +Date: Mon, 10 Jul 2023 12:14:37 +0300 +Message-Id: <20230710091439.1010553-3-kkostiuk@redhat.com> +To: qemu-devel@nongnu.org +Cc: Marc-André Lureau , Michael Roth ,Philippe Mathieu-Daudé , Thomas Huth +In-Reply-To: <20230710091439.1010553-1-kkostiuk@redhat.com> +References: <20230710091439.1010553-1-kkostiuk@redhat.com> +List-Id: +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +Signed-off-by: Konstantin Kostiuk +Reviewed-by: Philippe Mathieu-Daudé +Reviewed-by: Thomas Huth +--- + qga/vss-win32/install.cpp | 12 ++++++------ + qga/vss-win32/requester.cpp | 9 +++++---- + 2 files changed, 11 insertions(+), 10 deletions(-) + +diff --git a/qga/vss-win32/install.cpp b/qga/vss-win32/install.cpp +index ff93b08a9e..e03473d1a8 100644 +--- a/qga/vss-win32/install.cpp ++++ b/qga/vss-win32/install.cpp +@@ -13,6 +13,7 @@ + #include "qemu/osdep.h" + + #include "vss-common.h" ++#include "vss-debug.h" + #ifdef HAVE_VSS_SDK + #include + #else +@@ -54,7 +55,7 @@ void errmsg(DWORD err, const char *text) + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (char *)&msg, 0, NULL); +- fprintf(stderr, "%.*s. (Error: %lx) %s\n", len, text, err, msg); ++ qga_debug("%.*s. (Error: %lx) %s", len, text, err, msg); + LocalFree(msg); + } + +@@ -219,7 +220,7 @@ static HRESULT QGAProviderRemove(ICatalogCollection *coll, int i, void *arg) + { + HRESULT hr; + +- fprintf(stderr, "Removing COM+ Application: %s\n", QGA_PROVIDER_NAME); ++ qga_debug("Removing COM+ Application: %s", QGA_PROVIDER_NAME); + chk(coll->Remove(i)); + out: + return hr; +@@ -304,9 +305,8 @@ STDAPI COMRegister(void) + } + strcpy(tlbPath, dllPath); + strcpy(tlbPath+n-3, "tlb"); +- fprintf(stderr, "Registering " QGA_PROVIDER_NAME ":\n"); +- fprintf(stderr, " %s\n", dllPath); +- fprintf(stderr, " %s\n", tlbPath); ++ qga_debug("Registering " QGA_PROVIDER_NAME ": %s %s", ++ dllPath, tlbPath); + if (!PathFileExists(tlbPath)) { + hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + errmsg(hr, "Failed to lookup tlb"); +@@ -517,7 +517,7 @@ namespace _com_util + } + + if (mbstowcs(bstr, ascii, len) == (size_t)-1) { +- fprintf(stderr, "Failed to convert string '%s' into BSTR", ascii); ++ qga_debug("Failed to convert string '%s' into BSTR", ascii); + bstr[0] = 0; + } + return bstr; +diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp +index 3e998af4a8..e85b9bc633 100644 +--- a/qga/vss-win32/requester.cpp ++++ b/qga/vss-win32/requester.cpp +@@ -12,6 +12,7 @@ + + #include "qemu/osdep.h" + #include "vss-common.h" ++#include "vss-debug.h" + #include "requester.h" + #include "install.h" + #include +@@ -59,13 +60,13 @@ STDAPI requester_init(void) + NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, + RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL); + if (FAILED(hr)) { +- fprintf(stderr, "failed to CoInitializeSecurity (error %lx)\n", hr); ++ qga_debug("failed to CoInitializeSecurity (error %lx)", hr); + return hr; + } + + hLib = LoadLibraryA("VSSAPI.DLL"); + if (!hLib) { +- fprintf(stderr, "failed to load VSSAPI.DLL\n"); ++ qga_debug("failed to load VSSAPI.DLL"); + return HRESULT_FROM_WIN32(GetLastError()); + } + +@@ -78,14 +79,14 @@ STDAPI requester_init(void) + #endif + ); + if (!pCreateVssBackupComponents) { +- fprintf(stderr, "failed to get proc address from VSSAPI.DLL\n"); ++ qga_debug("failed to get proc address from VSSAPI.DLL"); + return HRESULT_FROM_WIN32(GetLastError()); + } + + pVssFreeSnapshotProperties = (t_VssFreeSnapshotProperties) + GetProcAddress(hLib, "VssFreeSnapshotProperties"); + if (!pVssFreeSnapshotProperties) { +- fprintf(stderr, "failed to get proc address from VSSAPI.DLL\n"); ++ qga_debug("failed to get proc address from VSSAPI.DLL"); + return HRESULT_FROM_WIN32(GetLastError()); + } + + +-- +2.34.1 + + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v5 3/4] QGA VSS: Print error in err_set +From: Konstantin Kostiuk +Date: Mon, 10 Jul 2023 12:14:38 +0300 +Message-Id: <20230710091439.1010553-4-kkostiuk@redhat.com> +To: qemu-devel@nongnu.org +Cc: Marc-André Lureau , Michael Roth ,Philippe Mathieu-Daudé , Thomas Huth +In-Reply-To: <20230710091439.1010553-1-kkostiuk@redhat.com> +References: <20230710091439.1010553-1-kkostiuk@redhat.com> +List-Id: +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +Signed-off-by: Konstantin Kostiuk +Reviewed-by: Philippe Mathieu-Daudé +Reviewed-by: Thomas Huth +--- + qga/vss-win32/requester.cpp | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp +index e85b9bc633..f3eafacfc1 100644 +--- a/qga/vss-win32/requester.cpp ++++ b/qga/vss-win32/requester.cpp +@@ -26,9 +26,11 @@ + + #define DEFAULT_VSS_BACKUP_TYPE VSS_BT_FULL + +-#define err_set(e, err, fmt, ...) \ +- ((e)->error_setg_win32_wrapper((e)->errp, __FILE__, __LINE__, __func__, \ +- err, fmt, ## __VA_ARGS__)) ++#define err_set(e, err, fmt, ...) { \ ++ (e)->error_setg_win32_wrapper((e)->errp, __FILE__, __LINE__, __func__, \ ++ err, fmt, ## __VA_ARGS__); \ ++ qga_debug(fmt, ## __VA_ARGS__); \ ++} + /* Bad idea, works only when (e)->errp != NULL: */ + #define err_is_set(e) ((e)->errp && *(e)->errp) + /* To lift this restriction, error_propagate(), like we do in QEMU code */ + +-- +2.34.1 + + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v5 4/4] QGA VSS: Add log in functions begin/end +From: Konstantin Kostiuk +Date: Mon, 10 Jul 2023 12:14:39 +0300 +Message-Id: <20230710091439.1010553-5-kkostiuk@redhat.com> +To: qemu-devel@nongnu.org +Cc: Marc-André Lureau , Michael Roth ,Philippe Mathieu-Daudé , Thomas Huth +In-Reply-To: <20230710091439.1010553-1-kkostiuk@redhat.com> +References: <20230710091439.1010553-1-kkostiuk@redhat.com> +List-Id: +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +Add several qga_debug() statements in functions. + +Signed-off-by: Konstantin Kostiuk +--- + qga/vss-win32/install.cpp | 35 +++++++++++++++++++++++++++++++++++ + qga/vss-win32/provider.cpp | 3 +++ + qga/vss-win32/requester.cpp | 34 ++++++++++++++++++++++++++++++++++ + 3 files changed, 72 insertions(+) + +diff --git a/qga/vss-win32/install.cpp b/qga/vss-win32/install.cpp +index e03473d1a8..ae38662a62 100644 +--- a/qga/vss-win32/install.cpp ++++ b/qga/vss-win32/install.cpp +@@ -100,6 +100,8 @@ HRESULT put_Value(ICatalogObject *pObj, LPCWSTR name, T val) + /* Lookup Administrators group name from winmgmt */ + static HRESULT GetAdminName(_bstr_t *name) + { ++ qga_debug_begin; ++ + HRESULT hr; + COMPointer pLoc; + COMPointer pSvc; +@@ -142,6 +144,7 @@ static HRESULT GetAdminName(_bstr_t *name) + } + + out: ++ qga_debug_end; + return hr; + } + +@@ -149,6 +152,8 @@ out: + static HRESULT getNameByStringSID( + const wchar_t *sid, LPWSTR buffer, LPDWORD bufferLen) + { ++ qga_debug_begin; ++ + HRESULT hr = S_OK; + PSID psid = NULL; + SID_NAME_USE groupType; +@@ -168,6 +173,7 @@ static HRESULT getNameByStringSID( + LocalFree(psid); + + out: ++ qga_debug_end; + return hr; + } + +@@ -175,6 +181,8 @@ out: + static HRESULT QGAProviderFind( + HRESULT (*found)(ICatalogCollection *, int, void *), void *arg) + { ++ qga_debug_begin; ++ + HRESULT hr; + COMInitializer initializer; + COMPointer pUnknown; +@@ -205,41 +213,53 @@ static HRESULT QGAProviderFind( + chk(pColl->SaveChanges(&n)); + + out: ++ qga_debug_end; + return hr; + } + + /* Count QGA VSS provider in COM+ Application Catalog */ + static HRESULT QGAProviderCount(ICatalogCollection *coll, int i, void *arg) + { ++ qga_debug_begin; ++ + (*(int *)arg)++; ++ ++ qga_debug_end; + return S_OK; + } + + /* Remove QGA VSS provider from COM+ Application Catalog Collection */ + static HRESULT QGAProviderRemove(ICatalogCollection *coll, int i, void *arg) + { ++ qga_debug_begin; + HRESULT hr; + + qga_debug("Removing COM+ Application: %s", QGA_PROVIDER_NAME); + chk(coll->Remove(i)); + out: ++ qga_debug_end; + return hr; + } + + /* Unregister this module from COM+ Applications Catalog */ + STDAPI COMUnregister(void) + { ++ qga_debug_begin; ++ + HRESULT hr; + + DllUnregisterServer(); + chk(QGAProviderFind(QGAProviderRemove, NULL)); + out: ++ qga_debug_end; + return hr; + } + + /* Register this module to COM+ Applications Catalog */ + STDAPI COMRegister(void) + { ++ qga_debug_begin; ++ + HRESULT hr; + COMInitializer initializer; + COMPointer pUnknown; +@@ -259,12 +279,14 @@ STDAPI COMRegister(void) + + if (!g_hinstDll) { + errmsg(E_FAIL, "Failed to initialize DLL"); ++ qga_debug_end; + return E_FAIL; + } + + chk(QGAProviderFind(QGAProviderCount, (void *)&count)); + if (count) { + errmsg(E_ABORT, "QGA VSS Provider is already installed"); ++ qga_debug_end; + return E_ABORT; + } + +@@ -354,6 +376,7 @@ out: + COMUnregister(); + } + ++ qga_debug_end; + return hr; + } + +@@ -369,6 +392,8 @@ STDAPI_(void) CALLBACK DLLCOMUnregister(HWND, HINSTANCE, LPSTR, int) + + static BOOL CreateRegistryKey(LPCTSTR key, LPCTSTR value, LPCTSTR data) + { ++ qga_debug_begin; ++ + HKEY hKey; + LONG ret; + DWORD size; +@@ -389,6 +414,7 @@ static BOOL CreateRegistryKey(LPCTSTR key, LPCTSTR value, LPCTSTR data) + RegCloseKey(hKey); + + out: ++ qga_debug_end; + if (ret != ERROR_SUCCESS) { + /* As we cannot printf within DllRegisterServer(), show a dialog. */ + errmsg_dialog(ret, "Cannot add registry", key); +@@ -400,6 +426,8 @@ out: + /* Register this dll as a VSS provider */ + STDAPI DllRegisterServer(void) + { ++ qga_debug_begin; ++ + COMInitializer initializer; + COMPointer pVssAdmin; + HRESULT hr = E_FAIL; +@@ -478,12 +506,15 @@ out: + DllUnregisterServer(); + } + ++ qga_debug_end; + return hr; + } + + /* Unregister this VSS hardware provider from the system */ + STDAPI DllUnregisterServer(void) + { ++ qga_debug_begin; ++ + TCHAR key[256]; + COMInitializer initializer; + COMPointer pVssAdmin; +@@ -501,6 +532,7 @@ STDAPI DllUnregisterServer(void) + SHDeleteKey(HKEY_CLASSES_ROOT, key); + SHDeleteKey(HKEY_CLASSES_ROOT, g_szProgid); + ++ qga_debug_end; + return S_OK; /* Uninstall should never fail */ + } + +@@ -527,6 +559,8 @@ namespace _com_util + /* Stop QGA VSS provider service using Winsvc API */ + STDAPI StopService(void) + { ++ qga_debug_begin; ++ + HRESULT hr = S_OK; + SC_HANDLE manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + SC_HANDLE service = NULL; +@@ -551,5 +585,6 @@ STDAPI StopService(void) + out: + CloseServiceHandle(service); + CloseServiceHandle(manager); ++ qga_debug_end; + return hr; + } +diff --git a/qga/vss-win32/provider.cpp b/qga/vss-win32/provider.cpp +index 1b885e24ee..cc72e5ef1b 100644 +--- a/qga/vss-win32/provider.cpp ++++ b/qga/vss-win32/provider.cpp +@@ -12,6 +12,7 @@ + + #include "qemu/osdep.h" + #include "vss-common.h" ++#include "vss-debug.h" + #ifdef HAVE_VSS_SDK + #include + #else +@@ -529,9 +530,11 @@ STDAPI DllCanUnloadNow() + EXTERN_C + BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved) + { ++ qga_debug("begin, reason = %lu", dwReason); + if (dwReason == DLL_PROCESS_ATTACH) { + g_hinstDll = hinstDll; + DisableThreadLibraryCalls(hinstDll); + } ++ qga_debug_end; + return TRUE; + } +diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp +index f3eafacfc1..9884c65e70 100644 +--- a/qga/vss-win32/requester.cpp ++++ b/qga/vss-win32/requester.cpp +@@ -57,6 +57,8 @@ static struct QGAVSSContext { + + STDAPI requester_init(void) + { ++ qga_debug_begin; ++ + COMInitializer initializer; /* to call CoInitializeSecurity */ + HRESULT hr = CoInitializeSecurity( + NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, +@@ -92,11 +94,14 @@ STDAPI requester_init(void) + return HRESULT_FROM_WIN32(GetLastError()); + } + ++ qga_debug_end; + return S_OK; + } + + static void requester_cleanup(void) + { ++ qga_debug_begin; ++ + if (vss_ctx.hEventFrozen) { + CloseHandle(vss_ctx.hEventFrozen); + vss_ctx.hEventFrozen = NULL; +@@ -118,10 +123,13 @@ static void requester_cleanup(void) + vss_ctx.pVssbc = NULL; + } + vss_ctx.cFrozenVols = 0; ++ qga_debug_end; + } + + STDAPI requester_deinit(void) + { ++ qga_debug_begin; ++ + requester_cleanup(); + + pCreateVssBackupComponents = NULL; +@@ -131,11 +139,14 @@ STDAPI requester_deinit(void) + hLib = NULL; + } + ++ qga_debug_end; + return S_OK; + } + + static HRESULT WaitForAsync(IVssAsync *pAsync) + { ++ qga_debug_begin; ++ + HRESULT ret, hr; + + do { +@@ -151,11 +162,14 @@ static HRESULT WaitForAsync(IVssAsync *pAsync) + } + } while (ret == VSS_S_ASYNC_PENDING); + ++ qga_debug_end; + return ret; + } + + static void AddComponents(ErrorSet *errset) + { ++ qga_debug_begin; ++ + unsigned int cWriters, i; + VSS_ID id, idInstance, idWriter; + BSTR bstrWriterName = NULL; +@@ -237,17 +251,21 @@ out: + if (pComponent && info) { + pComponent->FreeComponentInfo(info); + } ++ qga_debug_end; + } + + DWORD get_reg_dword_value(HKEY baseKey, LPCSTR subKey, LPCSTR valueName, + DWORD defaultData) + { ++ qga_debug_begin; ++ + DWORD regGetValueError; + DWORD dwordData; + DWORD dataSize = sizeof(DWORD); + + regGetValueError = RegGetValue(baseKey, subKey, valueName, RRF_RT_DWORD, + NULL, &dwordData, &dataSize); ++ qga_debug_end; + if (regGetValueError != ERROR_SUCCESS) { + return defaultData; + } +@@ -262,6 +280,8 @@ bool is_valid_vss_backup_type(VSS_BACKUP_TYPE vssBT) + VSS_BACKUP_TYPE get_vss_backup_type( + VSS_BACKUP_TYPE defaultVssBT = DEFAULT_VSS_BACKUP_TYPE) + { ++ qga_debug_begin; ++ + VSS_BACKUP_TYPE vssBackupType; + + vssBackupType = static_cast( +@@ -269,6 +289,7 @@ VSS_BACKUP_TYPE get_vss_backup_type( + QGA_PROVIDER_REGISTRY_ADDRESS, + "VssOption", + defaultVssBT)); ++ qga_debug_end; + if (!is_valid_vss_backup_type(vssBackupType)) { + return defaultVssBT; + } +@@ -277,6 +298,8 @@ VSS_BACKUP_TYPE get_vss_backup_type( + + void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset) + { ++ qga_debug_begin; ++ + COMPointer pAsync; + HANDLE volume; + HRESULT hr; +@@ -292,6 +315,7 @@ void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset) + + if (vss_ctx.pVssbc) { /* already frozen */ + *num_vols = 0; ++ qga_debug("finished, already frozen"); + return; + } + +@@ -449,6 +473,7 @@ void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset) + } + } + ++ qga_debug("preparing for backup"); + hr = vss_ctx.pVssbc->PrepareForBackup(pAsync.replace()); + if (SUCCEEDED(hr)) { + hr = WaitForAsync(pAsync); +@@ -472,6 +497,7 @@ void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset) + * CQGAVssProvider::CommitSnapshots will kick vss_ctx.hEventFrozen + * after the applications and filesystems are frozen. + */ ++ qga_debug("do snapshot set"); + hr = vss_ctx.pVssbc->DoSnapshotSet(&vss_ctx.pAsyncSnapshot); + if (FAILED(hr)) { + err_set(errset, hr, "failed to do snapshot set"); +@@ -518,6 +544,7 @@ void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset) + *num_vols = vss_ctx.cFrozenVols = num_fixed_drives; + } + ++ qga_debug("end successful"); + return; + + out: +@@ -528,11 +555,14 @@ out: + out1: + requester_cleanup(); + CoUninitialize(); ++ ++ qga_debug_end; + } + + + void requester_thaw(int *num_vols, void *mountpints, ErrorSet *errset) + { ++ qga_debug_begin; + COMPointer pAsync; + + if (!vss_ctx.hEventThaw) { +@@ -541,6 +571,8 @@ void requester_thaw(int *num_vols, void *mountpints, ErrorSet *errset) + * and no volumes must be frozen. We return without an error. + */ + *num_vols = 0; ++ qga_debug("finished, no volumes were frozen"); ++ + return; + } + +@@ -597,4 +629,6 @@ void requester_thaw(int *num_vols, void *mountpints, ErrorSet *errset) + + CoUninitialize(); + StopService(); ++ ++ qga_debug_end; + } + +-- +2.34.1 + +