#include #pragma hdrstop #include #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(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(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(dirname), lLastError); } } else _tprintf( TEXT(" Deleted %s\n"), static_cast(dirname) ); _tcscpy( tszFile, static_cast(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 ); }