windows-nt/Source/XPSP1/NT/base/fs/utils/asrtools/asrsfgen/critdrv.h
2020-09-26 16:20:57 +08:00

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