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.
160 lines
5.3 KiB
160 lines
5.3 KiB
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <ole2.h>
|
|
#include "trkwks.hxx"
|
|
#include "dltadmin.hxx"
|
|
|
|
|
|
|
|
BOOL
|
|
DltAdminEnumOids( ULONG cArgs, TCHAR * const rgptszArgs[], ULONG *pcEaten )
|
|
{
|
|
LONG iVol = 0;
|
|
LONG iArg = 0;
|
|
BOOL fSuccess = FALSE;
|
|
BOOL fCrossVolumeOnly = FALSE;
|
|
BOOL fShowPath = FALSE;
|
|
BOOL fShowBirth = FALSE;
|
|
BOOL fAllVolumes = TRUE;
|
|
|
|
if( 1 <= cArgs && IsHelpArgument( rgptszArgs[0] ))
|
|
{
|
|
*pcEaten = 1;
|
|
printf( "\nOption EnumOIDs\n"
|
|
" Purpose: Enumerate the object IDs on one or more volumes\n"
|
|
" Usage: -enumoids [-<options>] [drive letter (all drives if omitted)]\n"
|
|
" Options: -x => Show only files with cross-volume bit set\n"
|
|
" -b => Show the birth ID too\n"
|
|
" -f => Show the filename too\n"
|
|
" E.g.: -enumoids\n"
|
|
" -enumoids -xb d:\n" );
|
|
return( TRUE );
|
|
}
|
|
|
|
if( cArgs > 0 &&
|
|
( TEXT('/') == rgptszArgs[iArg][0]
|
|
||
|
|
TEXT('-') == rgptszArgs[iArg][0]
|
|
) )
|
|
{
|
|
_tcslwr( rgptszArgs[iArg] );
|
|
for( LONG iOption = 1; TEXT('\0') != rgptszArgs[0][iOption]; iOption++ )
|
|
{
|
|
switch( rgptszArgs[iArg][iOption] )
|
|
{
|
|
case TEXT('x'):
|
|
fCrossVolumeOnly = TRUE;
|
|
break;
|
|
case TEXT('b'):
|
|
fShowBirth = TRUE;
|
|
break;
|
|
case TEXT('f'):
|
|
fShowPath = TRUE;
|
|
break;
|
|
default:
|
|
_tprintf( TEXT("Ignoring invalid option (use -? for help): %c\n"), rgptszArgs[0][iOption] );
|
|
break;
|
|
}
|
|
}
|
|
iArg++;
|
|
(*pcEaten)++;
|
|
}
|
|
|
|
if( cArgs > iArg )
|
|
{
|
|
_tcslwr( rgptszArgs[iArg] );
|
|
if( TEXT(':') != rgptszArgs[iArg][1]
|
|
||
|
|
TEXT('a') > rgptszArgs[iArg][0]
|
|
||
|
|
TEXT('z') < rgptszArgs[iArg][0] )
|
|
{
|
|
printf( "Invalid arguments. Use -? for help\n" );
|
|
return( FALSE );
|
|
}
|
|
|
|
(*pcEaten)++;
|
|
iVol = rgptszArgs[iArg][0] - TEXT('a');
|
|
fAllVolumes = FALSE;
|
|
}
|
|
|
|
|
|
while( iVol < 26 )
|
|
{
|
|
if( IsLocalObjectVolume( iVol ))
|
|
{
|
|
LONG lLastError = 0;
|
|
|
|
printf( "Volume %c:\n", iVol+TEXT('a') );
|
|
|
|
__try // __finally
|
|
{
|
|
CObjId objid;
|
|
CDomainRelativeObjId droidBirth;
|
|
CObjIdEnumerator oie;
|
|
ULONG cObjId = 0;
|
|
|
|
if(oie.Initialize(CVolumeDeviceName(iVol)) == TRUE)
|
|
{
|
|
if( oie.FindFirst( &objid, &droidBirth ))
|
|
{
|
|
do
|
|
{
|
|
if( fCrossVolumeOnly && droidBirth.GetVolumeId().GetUserBitState()
|
|
||
|
|
!fCrossVolumeOnly )
|
|
{
|
|
if( droidBirth.GetVolumeId().GetUserBitState() )
|
|
printf( " x " );
|
|
else
|
|
printf( " " );
|
|
|
|
_tprintf( TEXT("objid = %s\n"),
|
|
static_cast<const TCHAR*>(CStringize(objid)));
|
|
|
|
if( fShowBirth )
|
|
{
|
|
_tprintf( TEXT(" %s (birth volid)\n"),
|
|
static_cast<const TCHAR*>(CStringize(droidBirth.GetVolumeId() )));
|
|
_tprintf( TEXT(" %s (birth objid)\n"),
|
|
static_cast<const TCHAR*>(CStringize(droidBirth.GetObjId() )));
|
|
}
|
|
|
|
if( fShowPath )
|
|
{
|
|
TCHAR tszPath[ MAX_PATH + 1 ];
|
|
NTSTATUS status = FindLocalPath( iVol, objid, &droidBirth, &tszPath[2] );
|
|
if( NT_SUCCESS(status) )
|
|
{
|
|
tszPath[0] = VolChar(iVol);
|
|
tszPath[1] = TEXT(':');
|
|
_tprintf( TEXT(" %s\n"), tszPath );
|
|
}
|
|
else
|
|
_tprintf( TEXT(" %s (%08x)\n"), TEXT("<not found>"), status );
|
|
}
|
|
}
|
|
|
|
} while(oie.FindNext(&objid, &droidBirth));
|
|
|
|
}
|
|
}
|
|
}
|
|
__except( BreakOnDebuggableException() )
|
|
{
|
|
printf( "Exception occurred: %08x\n", GetExceptionCode() );
|
|
}
|
|
|
|
} // if( IsLocalObjectVolume( iVol ))
|
|
|
|
if( !fAllVolumes )
|
|
break;
|
|
iVol++;
|
|
|
|
} // while( iVol < 26 )
|
|
|
|
return( TRUE );
|
|
}
|