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.
250 lines
6.7 KiB
250 lines
6.7 KiB
|
|
#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 );
|
|
|
|
}
|
|
|
|
|
|
|
|
|