Message ID | 20230209085004.2745131-3-kfir@daynix.com |
---|---|
State | New |
Headers | show |
Series | qga/win/vss: add VSS backup type options | expand |
Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com> On Thu, Feb 9, 2023 at 2:50 AM Kfir Manor <kfir@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 <kfir@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 > >
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"
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 <kfir@daynix.com> --- qga/vss-win32/requester.cpp | 38 +++++++++++++++++++++++++++++++++++++ qga/vss-win32/vss-handles.h | 3 +++ 2 files changed, 41 insertions(+)