windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/winmgmt2/writer.cpp
2020-09-26 16:20:57 +08:00

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));
}