Reviewed-by: Konstantin Kostiuk <kkost...@redhat.com>

On Thu, Feb 9, 2023 at 2:50 AM Kfir Manor <k...@daynix.com> wrote:

> Query VSS backup type number (DWORD) from QEMU Guest Agent VSS Provider
> registry key registry value VssOption
>
> Translate the VSS backup type number (DWORD) into its VSS backup type
> (VSS_BACKUP_TYPE)
>
> Returns the queried VSS backup type if the program encounters unexpected
> behaviors or values return default VSS backup type VSS_BT_FULL instead
>
> Signed-off-by: Kfir Manor <k...@daynix.com>
> ---
>  qga/vss-win32/requester.cpp | 38 +++++++++++++++++++++++++++++++++++++
>  qga/vss-win32/vss-handles.h |  3 +++
>  2 files changed, 41 insertions(+)
>
> diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
> index b371affeab..27fdb9236b 100644
> --- a/qga/vss-win32/requester.cpp
> +++ b/qga/vss-win32/requester.cpp
> @@ -23,6 +23,8 @@
>  /* Call QueryStatus every 10 ms while waiting for frozen event */
>  #define VSS_TIMEOUT_EVENT_MSEC 10
>
> +#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__))
> @@ -234,6 +236,42 @@ out:
>      }
>  }
>
> +DWORD get_reg_dword_value(HKEY baseKey, LPCSTR subKey, LPCSTR valueName,
> +                          DWORD defaultData)
> +{
> +    DWORD regGetValueError;
> +    DWORD dwordData;
> +    DWORD dataSize = sizeof(DWORD);
> +
> +    regGetValueError = RegGetValue(baseKey, subKey, valueName,
> RRF_RT_DWORD,
> +                                   NULL, &dwordData, &dataSize);
> +    if (regGetValueError  != ERROR_SUCCESS) {
> +        return defaultData;
> +    }
> +    return dwordData;
> +}
> +
> +bool is_valid_vss_backup_type(VSS_BACKUP_TYPE vssBT)
> +{
> +    return (vssBT > VSS_BT_UNDEFINED && vssBT < VSS_BT_OTHER);
> +}
> +
> +VSS_BACKUP_TYPE get_vss_backup_type(
> +    VSS_BACKUP_TYPE defaultVssBT = DEFAULT_VSS_BACKUP_TYPE)
> +{
> +    VSS_BACKUP_TYPE vssBackupType;
> +
> +    vssBackupType = static_cast<VSS_BACKUP_TYPE>(
> +                            get_reg_dword_value(HKEY_LOCAL_MACHINE,
> +
> QGA_PROVIDER_REGISTRY_ADDRESS,
> +                                                "VssOption",
> +                                                defaultVssBT));
> +    if (!is_valid_vss_backup_type(vssBackupType)) {
> +        return defaultVssBT;
> +    }
> +    return vssBackupType;
> +}
> +
>  void requester_freeze(int *num_vols, void *mountpoints, ErrorSet *errset)
>  {
>      COMPointer<IVssAsync> pAsync;
> diff --git a/qga/vss-win32/vss-handles.h b/qga/vss-win32/vss-handles.h
> index 0f8a741ad2..1a7d842129 100644
> --- a/qga/vss-win32/vss-handles.h
> +++ b/qga/vss-win32/vss-handles.h
> @@ -6,6 +6,9 @@
>  #define QGA_PROVIDER_NAME "QEMU Guest Agent VSS Provider"
>  #define QGA_PROVIDER_LNAME L(QGA_PROVIDER_NAME)
>  #define QGA_PROVIDER_VERSION L(QEMU_VERSION)
> +#define QGA_PROVIDER_REGISTRY_ADDRESS "SYSTEM\\CurrentControlSet"\
> +                                      "\\Services"\
> +                                      "\\" QGA_PROVIDER_NAME
>
>  #define EVENT_NAME_FROZEN  "Global\\QGAVSSEvent-frozen"
>  #define EVENT_NAME_THAW    "Global\\QGAVSSEvent-thaw"
> --
> 2.38.1
>
>

Reply via email to