windows-nt/Source/XPSP1/NT/sdktools/fsdump/inc/engine.h
2020-09-26 16:20:57 +08:00

180 lines
5.1 KiB
C++

/*++
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_