 requester.cpp |   15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/qga/vss-win32/requester.cpp b/qga/vss-win32/requester.cpp
index d54408c..1b91ca5 100644
--- a/qga/vss-win32/requester.cpp
+++ b/qga/vss-win32/requester.cpp
@@ -49,17 +49,15 @@ static struct QGAVSSContext {
 
 STDAPI requester_init(void)
 {
-    HRESULT hr;
-
     vss_ctx.hEventFrozen = vss_ctx.hEventThaw = INVALID_HANDLE_VALUE;
 
-    CoInitialize(NULL);
-    hr = CoInitializeSecurity(
+    COMInitializer initializer; /* to call CoInitializeSecurity */
+    HRESULT hr = CoInitializeSecurity(
         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);
-        return HRESULT_FROM_WIN32(GetLastError());
+        return hr;
     }
 
     hLib = LoadLibraryA("VSSAPI.DLL");
@@ -116,8 +114,6 @@ STDAPI requester_deinit(void)
 {
     requester_cleanup();
 
-    CoUninitialize();
-
     pCreateVssBackupComponents = NULL;
     pVssFreeSnapshotProperties = NULL;
     if (hLib) {
@@ -251,6 +247,8 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
         return;
     }
 
+    CoInitialize(NULL);
+
     assert(pCreateVssBackupComponents != NULL);
     hr = pCreateVssBackupComponents(&vss_ctx.pVssbc);
     if (FAILED(hr)) {
@@ -424,6 +422,7 @@ out:
         vss_ctx.pVssbc->AbortBackup();
     }
     requester_cleanup();
+    CoUninitialize();
 }
 
 
@@ -483,4 +482,6 @@ void requester_thaw(int *num_vols, ErrorSet *errset)
     }
     *num_vols = vss_ctx.cFrozenVols;
     requester_cleanup();
+
+    CoUninitialize();
 }
