/*++ Copyright (c) 2000-2001 Microsoft Corporation Module Name: engine.h Abstract: Header file for the file system dump utility engine Author: Stefan R. Steiner [ssteiner] 02-18-2000 Revision History: --*/ #ifndef __H_ENGINE_ #define __H_ENGINE_ class CFsdVolumeStateManager; class CFsdVolumeState; class CDumpEngine { public: CDumpEngine( IN CBsString cwsDirFileSpec, IN CDumpParameters &cDumpParameters ) : m_pcParams( &cDumpParameters ), m_ullNumDirs( 0 ), m_ullNumMountpoints( 0 ), m_ullNumBytesChecksummed( 0 ), m_ullNumBytesTotalUnnamedStream( 0 ), m_ullNumBytesTotalNamedDataStream( 0 ), m_ullNumReparsePoints( 0 ), m_ullNumFiles( 0 ), m_bShareName( FALSE ), m_ullNumFilesExcluded( 0 ), m_ullNumHardLinks( 0 ), m_ullNumDiscreteDACEs( 0 ), m_ullNumDiscreteSACEs( 0 ), m_ullNumEncryptedFiles( 0 ), m_ullNumFilesWithObjectIds( 0 ) { assert( cwsDirFileSpec.GetLength() >= 1 ); // // Let's do a bunch of stuff to normalize the given directory path. Windows doesn't // make this easy.... // BOOL bPathIsInLongPathForm = FALSE; if ( cwsDirFileSpec.Left( 4 ) == L"\\\\?\\" || cwsDirFileSpec.Left( 4 ) == L"\\\\.\\" ) { // // Switch . with ? if it is there // cwsDirFileSpec.SetAt( 2, L'?' ); bPathIsInLongPathForm = TRUE; } else if ( cwsDirFileSpec.Left( 2 ) == L"\\\\" ) { // // Remote path // m_bShareName = TRUE; } else if ( cwsDirFileSpec.GetLength() == 2 && cwsDirFileSpec[1] == L':' ) { // // Just the drive letter and :. GetFullPathNameW thinks that means // the current directory on the drive whereas I mean for it to be the // entire volume, i.e. L:\ // cwsDirFileSpec += L'\\'; } // // Let's get the full path // LPWSTR pwszFileName; if ( ::GetFullPathNameW( cwsDirFileSpec, FSD_MAX_PATH, m_cwsDirFileSpec.GetBufferSetLength( FSD_MAX_PATH ), &pwszFileName ) == 0 ) { m_pcParams->ErrPrint( L"ERROR - Unable to get full path name of '%s', dwRet: %d, trying with relative pathname", cwsDirFileSpec.c_str(), ::GetLastError() ); m_cwsDirFileSpec.ReleaseBuffer() ; m_cwsDirFileSpec = cwsDirFileSpec; } else { m_cwsDirFileSpec.ReleaseBuffer(); } // // Must prepare the path to support > MAX_PATH file path by // tacking on \\?\ on the front of the path. Shares have // a slightly different format. // if ( !( m_pcParams->m_bDisableLongPaths || bPathIsInLongPathForm ) ) { if ( m_bShareName ) { // BUGBUG: When the bug in GetVolumePathNameW() is fixed, uncomment the // following: // m_cwsDirFileSpec = L"\\\\?\\UNC"; // m_cwsDirFileSpec += cwsDirFileSpec.c_str() + 1; // Have to chop off one '\' } else { m_cwsDirFileSpec = L"\\\\?\\" + m_cwsDirFileSpec; } } // // Add a trailing '\' if necessary // if ( m_pcParams->m_eFsDumpType != eFsDumpFile && m_cwsDirFileSpec.Right( 1 ) != L"\\" ) m_cwsDirFileSpec += L'\\'; // // Finally done mucking with paths... // } virtual ~CDumpEngine() { } DWORD PerformDump(); static LPCSTR GetHeaderInformation(); private: DWORD ProcessDir( IN CFsdVolumeStateManager *pcFsdVolStateManager, IN CFsdVolumeState *pcFsdVolState, IN const CBsString& cwsDirPath, IN INT cDirFileSpecLength, IN INT cVolMountPointOffset ); VOID PrintEntry( IN CFsdVolumeState *pcFsdVolState, IN const CBsString& cwsDirPath, IN INT cDirFileSpecLength, IN SDirectoryEntry *psDirEntry, IN BOOL bSingleEntryOutput = FALSE ); CBsString m_cwsDirFileSpec; CDumpParameters *m_pcParams; ULONGLONG m_ullNumDirs; ULONGLONG m_ullNumFiles; ULONGLONG m_ullNumMountpoints; ULONGLONG m_ullNumReparsePoints; ULONGLONG m_ullNumBytesChecksummed; ULONGLONG m_ullNumBytesTotalUnnamedStream; ULONGLONG m_ullNumBytesTotalNamedDataStream; ULONGLONG m_ullNumFilesExcluded; ULONGLONG m_ullNumHardLinks; ULONGLONG m_ullNumDiscreteDACEs; ULONGLONG m_ullNumDiscreteSACEs; ULONGLONG m_ullNumEncryptedFiles; ULONGLONG m_ullNumFilesWithObjectIds; BOOL m_bShareName; }; #endif // __H_ENGINE_