You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
5.2 KiB
179 lines
5.2 KiB
/*++
|
|
|
|
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_
|
|
|