Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

139 lines
3.1 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998 - 2000.
//
// File: clogdump.cxx
//
// Contents: Changelog dump utility
//
// History: 04 Mar 1998 AlanW Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <changlog.hxx>
DECLARE_INFOLEVEL(ci)
unsigned fVerbose = 0;
int ChangeLogDump( char * pszPath );
int __cdecl main( int argc, char * argv[] )
{
char * pszFile = argv[1];
unsigned cFail = 0;
for ( int i = 1; i < argc; i++ )
{
if ( argv[i][0] == '-' )
{
switch ( argv[i][1] )
{
case 'v':
case 'V':
fVerbose = 1;
break;
#if 0
case 'm':
case 'M':
fReadMetadata = TRUE;
break;
case 'f':
case 'F':
i++;
if ( cField < cMaxFields )
aiField[cField++] = strtol( argv[i], 0, 10 );
break;
#endif // 0
default:
fprintf(stderr, "Usage: file ...\n");
exit(2);
}
continue;
}
else
{
pszFile = argv[i];
cFail += ChangeLogDump(pszFile);
}
}
return cFail != 0;
}
int ChangeLogDump( char * pszPath )
{
HANDLE h = CreateFileA( pszPath,
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
0,
0 );
if ( INVALID_HANDLE_VALUE == h )
{
printf( "Can't open file %s. Error %u\n", pszPath, GetLastError() );
return 1;
}
printf( "fileaddr rec\t\tUSN\tWorkID\tVolID\tAction\tRetries\n" );
ULONG cbRead;
struct ChangeRecord {
CDocNotification aRecord[cDocInChunk];
ULONG ulChecksum;
} ChangeRecord;
for ( unsigned i = 0; ; i++ )
{
if ( ! ReadFile( h, &ChangeRecord, sizeof ChangeRecord, &cbRead, 0 ) )
{
fprintf(stderr, "Error %d reading %s\n", GetLastError(), pszPath );
CloseHandle( h );
return 1;
}
if (cbRead == 0)
break;
for ( unsigned j = 0; j < cDocInChunk; j++ )
{
CDocNotification * pRecord = &ChangeRecord.aRecord[j];
if (0 == pRecord->Wid())
continue;
printf("%08x %d.\t",
i*sizeof ChangeRecord + j*sizeof (CDocNotification),
i*cDocInChunk + j );
if ( widInvalid == pRecord->Wid() )
{
printf( "<unused>\n" );
continue;
}
char szUSN[40];
_i64toa( pRecord->Usn(), szUSN, 10 );
printf("%11s\t%6d\t%5d\t%5d\t%5d\n",
szUSN, pRecord->Wid(),
pRecord->VolumeId(), pRecord->Action(), pRecord->Retries() );
}
}
CloseHandle( h );
return 0;
}