177 lines
3.8 KiB
C
177 lines
3.8 KiB
C
|
//-------------------------------------------------------------------
|
||
|
//
|
||
|
// critical drivers suppot
|
||
|
//
|
||
|
|
||
|
typedef struct _WSTRING_DATA_LINK
|
||
|
{
|
||
|
struct _WSTRING_DATA_LINK *m_psdlNext;
|
||
|
WCHAR rgwc[2040];
|
||
|
} WSTRING_DATA_LINK;
|
||
|
|
||
|
|
||
|
// class string data
|
||
|
class CWStringData
|
||
|
{
|
||
|
public:
|
||
|
// @cmember constructor
|
||
|
CWStringData();
|
||
|
|
||
|
// @cmember destructor
|
||
|
~CWStringData();
|
||
|
|
||
|
// @cmember allocate a string
|
||
|
LPWSTR AllocateString(unsigned cwc);
|
||
|
|
||
|
// @cmember copy a string
|
||
|
LPWSTR CopyString(LPCWSTR wsz);
|
||
|
|
||
|
private:
|
||
|
// @cmember allocate a new string data link
|
||
|
void AllocateNewLink();
|
||
|
|
||
|
// @cmember current link
|
||
|
WSTRING_DATA_LINK *m_psdlCur;
|
||
|
|
||
|
// @cmember offset in current link for next string
|
||
|
unsigned m_ulNextString;
|
||
|
|
||
|
// @cmember first link
|
||
|
WSTRING_DATA_LINK *m_psdlFirst;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// list of critical volumes
|
||
|
class CVolumeList
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CVolumeList();
|
||
|
|
||
|
// destructor
|
||
|
~CVolumeList();
|
||
|
|
||
|
// add a path to the volume list
|
||
|
void AddPath(LPWSTR wszPath);
|
||
|
|
||
|
// @cmember add a file to the volume list
|
||
|
void AddFile(LPWSTR wszFile);
|
||
|
|
||
|
// @cmember obtain list of volumes
|
||
|
LPWSTR GetVolumeList();
|
||
|
|
||
|
private:
|
||
|
enum
|
||
|
{
|
||
|
// amount to grow paths array by
|
||
|
x_cwszPathsInc = 8,
|
||
|
|
||
|
// amount to grow volumes array by
|
||
|
x_cwszVolumesInc = 4
|
||
|
};
|
||
|
|
||
|
// determine if a path is a volume
|
||
|
BOOL TryAddVolumeToList(LPCWSTR wszPath, BOOL fVolumeRoot);
|
||
|
|
||
|
// determine if path is in the list; if not add it to list
|
||
|
BOOL AddPathToList(LPWSTR wszPath);
|
||
|
|
||
|
// @cmember determine if a volume is in the list; if not add it to the list
|
||
|
BOOL AddVolumeToList(LPCWSTR wszVolume);
|
||
|
|
||
|
// @cmember get volume from the path
|
||
|
void GetVolumeFromPath(LPCWSTR wsz, LPWSTR wszVolumeName);
|
||
|
|
||
|
// @cmember cached strings
|
||
|
CWStringData m_sd;
|
||
|
|
||
|
// volumes encountered so far
|
||
|
LPCWSTR *m_rgwszVolumes;
|
||
|
|
||
|
// # of volumes allocate
|
||
|
unsigned m_cwszVolumes;
|
||
|
|
||
|
// max # of volumes in array
|
||
|
unsigned m_cwszVolumesMax;
|
||
|
|
||
|
// paths encountered so far
|
||
|
LPCWSTR *m_rgwszPaths;
|
||
|
|
||
|
// # of paths encountered so far
|
||
|
unsigned m_cwszPaths;
|
||
|
|
||
|
// @cmember max # of paths in array
|
||
|
unsigned m_cwszPathsMax;
|
||
|
};
|
||
|
|
||
|
|
||
|
// FRS entry points
|
||
|
typedef DWORD ( WINAPI *PF_FRS_ERR_CALLBACK )( CHAR *, DWORD );
|
||
|
typedef DWORD ( WINAPI *PF_FRS_INIT )( PF_FRS_ERR_CALLBACK, DWORD, PVOID * );
|
||
|
typedef DWORD ( WINAPI *PF_FRS_DESTROY )( PVOID *, DWORD, HKEY *, LPDWORD, CHAR *) ;
|
||
|
typedef DWORD ( WINAPI *PF_FRS_GET_SETS )( PVOID );
|
||
|
typedef DWORD ( WINAPI *PF_FRS_ENUM_SETS )( PVOID, DWORD, PVOID * );
|
||
|
typedef DWORD ( WINAPI *PF_FRS_IS_SYSVOL )( PVOID, PVOID, BOOL * );
|
||
|
typedef DWORD ( WINAPI *PF_FRS_GET_PATH )( PVOID, PVOID, DWORD *, WCHAR * ) ;
|
||
|
typedef DWORD ( WINAPI *PF_FRS_GET_OTHER_PATHS)(PVOID, PVOID, DWORD *, WCHAR *, DWORD *, WCHAR *);
|
||
|
|
||
|
// iterate over frs drives
|
||
|
class CFRSIter
|
||
|
{
|
||
|
public:
|
||
|
// constructor
|
||
|
CFRSIter();
|
||
|
|
||
|
// destructor
|
||
|
~CFRSIter();
|
||
|
|
||
|
// initialization routine
|
||
|
void Init();
|
||
|
|
||
|
// initialize iterator
|
||
|
BOOL BeginIteration();
|
||
|
|
||
|
// end iteration
|
||
|
void EndIteration();
|
||
|
|
||
|
// obtain path to next replication set
|
||
|
LPWSTR GetNextSet(BOOL fSkipToSysVol, LPWSTR *pwszPaths);
|
||
|
|
||
|
private:
|
||
|
// cleanup frs backup restore context
|
||
|
void CleanupIteration();
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
x_IterNotStarted,
|
||
|
x_IterStarted,
|
||
|
x_IterComplete
|
||
|
};
|
||
|
|
||
|
// is this initialized
|
||
|
BOOL m_fInitialized;
|
||
|
HINSTANCE m_hLib;
|
||
|
DWORD ( WINAPI *m_pfnFrsInitBuRest )( PF_FRS_ERR_CALLBACK, DWORD, PVOID * );
|
||
|
DWORD ( WINAPI *m_pfnFrsEndBuRest )( PVOID *, DWORD, HKEY *, LPDWORD, CHAR *) ;
|
||
|
DWORD ( WINAPI *m_pfnFrsGetSets )( PVOID );
|
||
|
DWORD ( WINAPI *m_pfnFrsEnumSets )( PVOID, DWORD, PVOID * );
|
||
|
DWORD ( WINAPI *m_pfnFrsIsSetSysVol )( PVOID, PVOID, BOOL * );
|
||
|
DWORD ( WINAPI *m_pfnFrsGetPath )( PVOID, PVOID, DWORD *, WCHAR * ) ;
|
||
|
DWORD ( WINAPI *m_pfnFrsGetOtherPaths) ( PVOID, PVOID, DWORD *, WCHAR *, DWORD *, WCHAR * );
|
||
|
|
||
|
// has iteration been started
|
||
|
int m_stateIteration;
|
||
|
|
||
|
// current set iterated
|
||
|
unsigned m_iset;
|
||
|
|
||
|
// context for iteration
|
||
|
PVOID m_frs_context;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
LPWSTR pFindCriticalVolumes();
|
||
|
|