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