191 lines
3.9 KiB
C++
191 lines
3.9 KiB
C++
/*++
|
|
|
|
Copyright (C) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
writer.cpp
|
|
|
|
Abstract:
|
|
|
|
Volume SnapShot Writer for WMI
|
|
|
|
History:
|
|
|
|
a-shawnb 06-Nov-00 Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "writer.h"
|
|
#include <genutils.h> // for EnableAllPrivileges()
|
|
#include <malloc.h>
|
|
|
|
CWbemVssWriter::CWbemVssWriter() : CVssWriter(),
|
|
m_pBackupRestore(NULL),
|
|
m_Lock(THROW_LOCK,0x80000000 | 500L)
|
|
{
|
|
}
|
|
|
|
CWbemVssWriter::~CWbemVssWriter()
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
if (m_pBackupRestore)
|
|
{
|
|
hr = m_pBackupRestore->Resume();
|
|
m_pBackupRestore->Release();
|
|
m_pBackupRestore = NULL;
|
|
}
|
|
}
|
|
|
|
// {A6AD56C2-B509-4e6c-BB19-49D8F43532F0}
|
|
static VSS_ID s_WRITERID = {0xa6ad56c2, 0xb509, 0x4e6c, 0xbb, 0x19, 0x49, 0xd8, 0xf4, 0x35, 0x32, 0xf0};
|
|
static LPCWSTR s_WRITERNAME = L"WMI Writer";
|
|
|
|
HRESULT CWbemVssWriter::Initialize()
|
|
{
|
|
return CVssWriter::Initialize(s_WRITERID, s_WRITERNAME, VSS_UT_SYSTEMSERVICE, VSS_ST_OTHER);
|
|
}
|
|
|
|
extern HRESULT GetRepositoryDirectory(wchar_t wszRepositoryDirectory[MAX_PATH+1]);
|
|
|
|
bool STDMETHODCALLTYPE CWbemVssWriter::OnIdentify(IN IVssCreateWriterMetadata *pMetadata)
|
|
{
|
|
wchar_t wszRepositoryDirectory[MAX_PATH+1];
|
|
HRESULT hr = GetRepositoryDirectory(wszRepositoryDirectory);
|
|
if (FAILED(hr))
|
|
return false;
|
|
|
|
hr = pMetadata->AddComponent( VSS_CT_FILEGROUP,
|
|
NULL,
|
|
L"WMI",
|
|
L"Windows Managment Instrumentation",
|
|
NULL,
|
|
0,
|
|
false,
|
|
false,
|
|
false
|
|
);
|
|
if (FAILED(hr))
|
|
return false;
|
|
|
|
hr = pMetadata->AddFilesToFileGroup(
|
|
NULL,
|
|
L"WMI",
|
|
wszRepositoryDirectory,
|
|
L"*.*",
|
|
true,
|
|
NULL
|
|
);
|
|
if (FAILED(hr))
|
|
return false;
|
|
|
|
hr = pMetadata->SetRestoreMethod(
|
|
VSS_RME_RESTORE_AT_REBOOT,
|
|
NULL,
|
|
NULL,
|
|
VSS_WRE_NEVER,
|
|
true
|
|
);
|
|
if (FAILED(hr))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool STDMETHODCALLTYPE CWbemVssWriter::OnPrepareSnapshot()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//
|
|
// Doing the Job on this method, we will have a time-out guarantee
|
|
// We sync the OnFreeze and the OnAbort/OnThaw calls,
|
|
// so that, if a TimeOut occurs, we are not arbitrarly unlocking the repository
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
|
|
bool STDMETHODCALLTYPE CWbemVssWriter::OnFreeze()
|
|
{
|
|
#ifdef _X86_
|
|
DWORD * pDW = (DWORD *)_alloca(sizeof(DWORD));
|
|
#endif
|
|
LockGuard<CriticalSection> lg(m_Lock);
|
|
if (!lg.locked())
|
|
return false;
|
|
|
|
// m_pBackupRestore should always be NULL coming into this
|
|
if (m_pBackupRestore)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
HRESULT hr = CoCreateInstance(CLSID_WbemBackupRestore, 0, CLSCTX_LOCAL_SERVER,
|
|
IID_IWbemBackupRestoreEx, (LPVOID *) &m_pBackupRestore);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (SUCCEEDED(hr = EnableAllPrivileges(TOKEN_PROCESS)))
|
|
{
|
|
hr = m_pBackupRestore->Pause();
|
|
if (FAILED(hr))
|
|
{
|
|
m_pBackupRestore->Release();
|
|
m_pBackupRestore = NULL;
|
|
}
|
|
}
|
|
}
|
|
return (SUCCEEDED(hr));
|
|
}
|
|
|
|
bool STDMETHODCALLTYPE CWbemVssWriter::OnThaw()
|
|
{
|
|
#ifdef _X86_
|
|
DWORD * pDW = (DWORD *)_alloca(sizeof(DWORD));
|
|
#endif
|
|
LockGuard<CriticalSection> lg(m_Lock);
|
|
while (!lg.locked()){
|
|
Sleep(20);
|
|
lg.acquire();
|
|
};
|
|
|
|
|
|
if (!m_pBackupRestore)
|
|
{
|
|
// if m_pBackupRestore is NULL, then we haven't been
|
|
// asked to prepare or we failed our preparation
|
|
DebugBreak();
|
|
return false;
|
|
}
|
|
|
|
HRESULT hr = m_pBackupRestore->Resume();
|
|
m_pBackupRestore->Release();
|
|
m_pBackupRestore = NULL;
|
|
|
|
return (SUCCEEDED(hr));
|
|
}
|
|
|
|
bool STDMETHODCALLTYPE CWbemVssWriter::OnAbort()
|
|
{
|
|
#ifdef _X86_
|
|
DWORD * pDW = (DWORD *)_alloca(sizeof(DWORD));
|
|
#endif
|
|
LockGuard<CriticalSection> lg(m_Lock);
|
|
while (!lg.locked()){
|
|
Sleep(20);
|
|
lg.acquire();
|
|
};
|
|
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
if (m_pBackupRestore)
|
|
{
|
|
hr = m_pBackupRestore->Resume();
|
|
m_pBackupRestore->Release();
|
|
m_pBackupRestore = NULL;
|
|
}
|
|
|
|
return (SUCCEEDED(hr));
|
|
}
|