Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

297 lines
7.7 KiB

#include <stdafx.h>
#include <esent.h>
#include <comadmin.h>
#include "vs_inc.hxx"
#include "vs_idl.hxx"
#include "comadmin.hxx"
#include "vswriter.h"
#include <jetwriter.h>
#include <ijetwriter.h>
////////////////////////////////////////////////////////////////////////
// Standard foo for file name aliasing. This code block must be after
// all includes of VSS header files.
//
#ifdef VSS_FILE_ALIAS
#undef VSS_FILE_ALIAS
#endif
#define VSS_FILE_ALIAS "WSHJTWRC"
//
////////////////////////////////////////////////////////////////////////
// destructor
__declspec(dllexport) CVssJetWriter::~CVssJetWriter()
{
BS_ASSERT(m_pWriter == NULL);
}
// routine for passing arguments between threads
typedef struct _JW_INIT_ARGS
{
VSS_ID idWriter;
LPCWSTR wszWriterName;
bool bSystemService;
bool bBootableSystemState;
LPCWSTR wszFilesToInclude;
LPCWSTR wszFilesToExclude;
CVssJetWriter *pobj;
} JW_INIT_ARGS;
// separate MTA thread for doing initialization
DWORD CVssJetWriter::InitializeThreadFunc(VOID *pv)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"InitializeThreadFunc");
JW_INIT_ARGS *pargs = (JW_INIT_ARGS *) pv;
bool bCoInitialized = false;
try
{
// intialize MTA thread
ft.hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (ft.HrFailed())
ft.Throw
(
VSSDBG_GEN,
E_UNEXPECTED,
L"CoInitializeEx failed 0x%08lx", ft.hr
);
bCoInitialized = true;
// call internal object to initialize
ft.hr = CVssIJetWriter::Initialize
(
pargs->idWriter,
pargs->wszWriterName,
pargs->bSystemService,
pargs->bBootableSystemState,
pargs->wszFilesToInclude,
pargs->wszFilesToExclude,
pargs->pobj,
&pargs->pobj->m_pWriter
);
if(ft.HrFailed())
{
//
// Add more granular error code -
// 752163 Application/Service might have inconsistent
// backup for their data-store without any warning or other indication
//
switch(ft.hr)
{
case E_INVALIDARG:
case E_OUTOFMEMORY:
case E_ACCESSDENIED:
ft.Throw(VSSDBG_GEN, ft.hr,
L"CvssIJetWriter::Initialize failed");
default:
ft.Throw(VSSDBG_GEN, E_UNEXPECTED,
L"CvssIJetWriter::Initialize failed [0x%08lx]", ft.hr);
}
}
}
VSS_STANDARD_CATCH(ft)
// save result of initialization
pargs->pobj->m_hrInitialized = ft.hr;
if (bCoInitialized)
CoUninitialize();
return 0;
}
// initialize method on external thread
__declspec(dllexport) HRESULT CVssJetWriter::Initialize
(
IN GUID idWriter,
IN LPCWSTR wszWriterName,
bool bSystemService,
bool bBootableSystemState,
LPCWSTR wszFilesToInclude,
LPCWSTR wszFilesToExclude
)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::Initialize");
try
{
DWORD tid;
// setup arguments to thread
JW_INIT_ARGS args;
args.idWriter = idWriter;
args.wszWriterName = wszWriterName;
args.bSystemService = bSystemService;
args.bBootableSystemState = bBootableSystemState;
args.wszFilesToInclude = wszFilesToInclude;
args.wszFilesToExclude = wszFilesToExclude;
args.pobj = this;
// create thread
HANDLE hThread = CreateThread
(
NULL,
256*1024,
CVssJetWriter::InitializeThreadFunc,
&args,
0,
&tid
);
if (hThread == NULL)
ft.Throw
(
VSSDBG_GEN,
E_UNEXPECTED,
L"CreateThread failed with error %d",
GetLastError()
);
// wait for thread to complete
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
VSS_STANDARD_CATCH(ft)
if (!ft.HrFailed())
// get result of initialization
ft.hr = m_hrInitialized;
return ft.hr;
}
__declspec(dllexport) void CVssJetWriter::Uninitialize()
{
// call uninitialize
if (m_pWriter)
{
CVssIJetWriter::Uninitialize((PVSSIJETWRITER) m_pWriter);
m_pWriter = NULL;
}
}
__declspec(dllexport) bool CVssJetWriter::OnIdentify(IVssCreateWriterMetadata *pIVssWriterMetadata)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnIdentify");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPrepareBackupBegin(IN IVssWriterComponents *pIVssWriterComponents)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPrepareBackupBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPrepareBackupEnd(IN IVssWriterComponents *pIVssWriterComponents,
bool fJetPrepareSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPrepareBackupEnd");
return fJetPrepareSucceeded;
}
__declspec(dllexport) bool CVssJetWriter::OnPrepareSnapshotBegin()
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPrepareSnapshotBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPrepareSnapshotEnd(bool fJetPrepareSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPrepareSnapshotEnd");
return fJetPrepareSucceeded;
}
__declspec(dllexport) bool CVssJetWriter::OnFreezeBegin()
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnFreezeBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnFreezeEnd(bool fJetFreezeSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnFreezeEnd");
return fJetFreezeSucceeded;
}
__declspec(dllexport) bool CVssJetWriter::OnThawBegin()
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnThawBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnThawEnd(bool fJetThawSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnThawEnd");
return fJetThawSucceeded;
}
__declspec(dllexport) bool CVssJetWriter::OnPostSnapshot(IN IVssWriterComponents *pIVssWriterComponents)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPostSnapshot");
return true;
}
__declspec(dllexport) void CVssJetWriter::OnAbortBegin()
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnAbortBegin");
}
__declspec(dllexport) void CVssJetWriter::OnAbortEnd()
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnAbortEnd");
}
__declspec(dllexport) bool CVssJetWriter::OnBackupCompleteBegin(IN IVssWriterComponents *pComponent)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnBackupCompleteBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnBackupCompleteEnd(IN IVssWriterComponents *pComponent,
bool fJetBackupCompleteSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnBackupCompleteEnd");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPreRestoreBegin(IN IVssWriterComponents *pIVssWriterComponents)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPreRestoreBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPreRestoreEnd(IN IVssWriterComponents *pIVssWriterComponents,
IN bool fJetRestoreSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPreRestoreEnd");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPostRestoreBegin(IN IVssWriterComponents *pIVssWriterComponents)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPostRestoreBegin");
return true;
}
__declspec(dllexport) bool CVssJetWriter::OnPostRestoreEnd(IN IVssWriterComponents *pIVssWriterComponents,
IN bool fJetRestoreSucceeded)
{
CVssFunctionTracer ft(VSSDBG_GEN, L"CVssJetWriter::OnPostRestoreEnd");
return true;
}