windows-nt/Source/XPSP1/NT/com/svcdlls/trksvcs/dltadmin/cleanvol.cxx
2020-09-26 16:20:57 +08:00

251 lines
6.4 KiB
C++

#include <pch.cxx>
#pragma hdrstop
#include <ole2.h>
#include "trkwks.hxx"
#include "dltadmin.hxx"
class CLogFileNotify : public PLogFileNotify
{
void OnHandlesMustClose()
{
return;
}
};
BOOL
EmptyLogFile( LONG iVol )
{
LogInfo loginfo, loginfoNew;
CLogFile logfile;
BOOL fSuccess = FALSE;
TCHAR tszFile[ MAX_PATH + 1 ];
CTrkWksConfiguration wksconfig;
CLogFileNotify logfilenotify;
__try
{
wksconfig.Initialize();
memset( &loginfo, 0, sizeof(loginfo) );
memset( &loginfoNew, 0, sizeof(loginfoNew) );
logfile.Initialize( static_cast<const TCHAR*>(CVolumeDeviceName(iVol)),
&wksconfig, &logfilenotify, VolChar(iVol) );
logfile.ReadExtendedHeader( CLOG_LOGINFO_START, &loginfo, sizeof(loginfo) );
loginfoNew.ilogStart = loginfoNew.ilogWrite = loginfoNew.ilogRead = 0;
loginfoNew.ilogLast = loginfoNew.ilogEnd = loginfo.ilogEnd;
loginfoNew.seqNext = 0;
loginfoNew.seqLastRead = loginfoNew.seqNext - 1;
logfile.WriteExtendedHeader( CLOG_LOGINFO_START, &loginfoNew, sizeof(loginfoNew) );
logfile.SetShutdown( TRUE );
logfile.InitializeLogEntries( 0, logfile.NumEntriesInFile() - 1 );
_tprintf( TEXT(" Emptied log\n" ) );
fSuccess = TRUE;
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
logfile.UnInitialize();
}
return( fSuccess );
}
BOOL
DeleteLogFile( LONG iVol )
{
NTSTATUS status;
BOOL fSuccess = FALSE;
TCHAR tszFile[ MAX_PATH + 1 ];
__try // __except
{
status = SetVolId( iVol, CVolumeId() );
if( !NT_SUCCESS(status) )
{
_tprintf( TEXT(" Couldn't delete vol ID (%08x)\n"), status );
__leave;
}
_tcscpy( tszFile, static_cast<const TCHAR*>(CVolumeDeviceName(iVol)) );
_tcscat( tszFile, s_tszLogFileName );
for( int i = 0; i < 4; i ++ )
{
// Delete the file
if(!DeleteFile( tszFile ))
{
LONG lLastError = GetLastError();
if( ERROR_FILE_NOT_FOUND != lLastError
&&
ERROR_PATH_NOT_FOUND != lLastError )
{
_tprintf(TEXT(" Couldn't delete %s (%08x)\n"), tszFile, GetLastError());
}
}
else
_tprintf( TEXT(" Deleted %s\n"), tszFile );
if( 1 & i ) // 1, 3
{
CDirectoryName dirname;
dirname.SetFromFileName( tszFile );
if(!RemoveDirectory( dirname ))
{
LONG lLastError = GetLastError();
if( ERROR_FILE_NOT_FOUND != lLastError )
{
_tprintf(TEXT(" Couldn't delete %s (%lu)\n"),
static_cast<const TCHAR*>(dirname), lLastError);
}
}
else
_tprintf( TEXT(" Deleted %s\n"), static_cast<const TCHAR*>(dirname) );
_tcscpy( tszFile, static_cast<const TCHAR*>(CVolumeDeviceName(iVol)) );
_tcscat( tszFile, s_tszOldLogFileName );
}
else
_tcscat( tszFile, TEXT(".bak") );
}
fSuccess = TRUE;
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
_tprintf( TEXT("Exception %08x in DeleteLogFileAndOids"), GetExceptionCode() );
}
return( fSuccess );
}
BOOL
DltAdminCleanVol( ULONG cArgs, TCHAR * const rgptszArgs[], ULONG *pcEaten )
{
NTSTATUS status = 0;
TCHAR* ptcTmp = NULL;
LONG iVol, iVolChar = 0;
BOOL fSuccess = TRUE;
BOOL fEmptyLog = FALSE;
*pcEaten = 0;
if( 1 <= cArgs )
{
_tcsupr( rgptszArgs[0] );
if( IsHelpArgument( rgptszArgs[0] ))
{
printf( "\nOption CleanVol\n"
" Purpose: Clean all the IDs (object and volume) a volume\n"
" Usage: -cleanvol [options] [drive letter]\n"
" Options: -e Empty log rather than deleting it\n"
" E.g.: -cleanvol -r D:\n"
" -cleanvol\n"
" Note: If no drive is specified, all drives will be cleaned\n" );
*pcEaten = 1;
return( TRUE );
}
if( TEXT('-') == rgptszArgs[0][0]
||
TEXT('/') == rgptszArgs[0][0] )
{
(*pcEaten)++;
switch( rgptszArgs[0][1] )
{
case 'E':
fEmptyLog = TRUE;
break;
default:
_tprintf( TEXT("Invalid option. Use -cleanvol -? for help\n") );
return( TRUE );
}
iVolChar = 1;
}
else
iVolChar = 0;
}
if( iVolChar < cArgs )
{
(*pcEaten)++;
_tcsupr( rgptszArgs[iVolChar] );
iVol = *rgptszArgs[iVolChar] - TEXT('A');
}
else
iVol = 0;
EnablePrivilege( SE_RESTORE_NAME );
while( iVol < 26 )
{
if( IsLocalObjectVolume( iVol ))
{
LONG lLastError = 0;
printf( "Cleaning volume %c:\n", iVol+TEXT('A') );
if( fEmptyLog )
fSuccess = EmptyLogFile( iVol );
else
fSuccess = DeleteLogFile( iVol );
__try // except
{
CObjId objid;
CDomainRelativeObjId droid;
CObjIdEnumerator oie;
ULONG cObjId = 0;
if(oie.Initialize(CVolumeDeviceName(iVol)) == TRUE)
{
if(oie.FindFirst(&objid, &droid))
{
do
{
DelObjId( iVol, objid );
cObjId++;
} while(oie.FindNext(&objid, &droid));
printf( " Deleted %d object ID%s\n",
cObjId,
1 == cObjId ? "" : "s" );
}
}
}
__except( BreakOnDebuggableException() )
{
}
} // if( IsLocalObjectVolume( iVol ))
if( 1 <= cArgs ) break;
iVol++;
} // while( iVol < 26 )
return( fSuccess );
}