mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|