windows-nt/Source/XPSP1/NT/base/fs/ntfs/tests/syscache/dumplog.cxx
2020-09-26 16:20:57 +08:00

211 lines
5.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: dumplog.cxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// Coupling:
//
// Notes:
//
// History: 2-05-2000 benl Created
//
//----------------------------------------------------------------------------
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct _SYSCACHE_LOG {
int Event;
int Flags;
LONGLONG Start;
LONGLONG Range;
LONGLONG Result;
// ULONG ulDump;
} SYSCACHE_LOG, *PSYSCACHE_LOG;
typedef struct _ON_DISK_SYSCACHE_LOG {
ULONG SegmentNumberUnsafe;
ULONG Reserved;
int Event;
int Flags;
LONGLONG Start;
LONGLONG Range;
LONGLONG Result;
} ON_DISK_SYSCACHE_LOG, *PON_DISK_SYSCACHE_LOG;
#define SCE_VDL_CHANGE 0
#define SCE_ZERO_NC 1
#define SCE_ZERO_C 2
#define SCE_READ 3
#define SCE_WRITE 4
#define SCE_ZERO_CAV 5
#define SCE_ZERO_MF 6
#define SCE_ZERO_FST 7
#define SCE_CC_FLUSH 8
#define SCE_CC_FLUSH_AND_PURGE 9
#define SCE_WRITE_FILE_SIZES 10
#define SCE_MAX_EVENT 11
#define SCE_FLAG_WRITE 0x1
#define SCE_FLAG_READ 0x2
#define SCE_FLAG_PAGING 0x4
#define SCE_FLAG_ASYNC 0x8
#define SCE_FLAG_SET_ALLOC 0x10
#define SCE_FLAG_SET_EOF 0x20
#define SCE_FLAG_CANT_WAIT 0x40
#define SCE_FLAG_SYNC_PAGING 0x80
#define SCE_FLAG_LAZY_WRITE 0x100
#define SCE_FLAG_CACHED 0x200
#define SCE_FLAG_ON_DISK_READ 0x400
#define SCE_FLAG_RECURSIVE 0x800
#define SCE_FLAG_NON_CACHED 0x1000
#define SCE_FLAG_UPDATE_FROM_DISK 0x2000
#define SCE_MAX_FLAG 0x4000
char * LogEvent[] =
{
"SCE_VDL_CHANGE",
"SCE_ZERO_NC",
"SCE_ZERO_C",
"SCE_READ",
"SCE_WRITE",
"SCE_ZERO_CAV",
"SCE_ZERO_MF",
"SCE_ZERO_FST",
"SCE_CC_FLUSH",
"SCE_CC_FLUSH_AND_PURGE",
"SCE_WRITE_FILE_SIZES",
"SCE_MAX_EVENT"
};
void __cdecl main (int argc, char *argv[])
{
HANDLE hFile;
TCHAR szName[] = "c:\\$ntfs.log";
UCHAR szBuffer[ 0x1000 ];
PON_DISK_SYSCACHE_LOG pEntry;
ULONG ulRet;
int iIndex;
if (argc < 2 || argv[1][0] == '\0') {
printf( "Utility to dump $ntfs.log\n" );
printf( "Usage: dumpsyscachelog drive:\n" );
return;
}
szName[0] = argv[1][0];
hFile = CreateFile( szName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if (INVALID_HANDLE_VALUE == hFile) {
printf( "Open of %s failed %d\n", szName, GetLastError() );
return;
}
do {
if (!ReadFile( hFile,
&szBuffer,
sizeof( szBuffer ),
&ulRet,
NULL )) {
printf( "ReadFile failed %d\n", GetLastError() );
return;
}
pEntry = (PON_DISK_SYSCACHE_LOG)szBuffer;
for (iIndex=0; iIndex < 0x1000 / sizeof( ON_DISK_SYSCACHE_LOG ); iIndex++) {
//
// Breakout if the segref is 0, we're at the end of the log
//
if (pEntry->SegmentNumberUnsafe == 0) {
return;
} else {
printf( "File: 0x%x ", pEntry->SegmentNumberUnsafe );
}
if (pEntry->Event < SCE_MAX_EVENT) {
printf( "(%s)\n", LogEvent[pEntry->Event] );
} else {
printf( "\n" );
}
printf( "Flags: 0x%x (", pEntry->Flags);
if (pEntry->Flags & SCE_FLAG_WRITE) {
printf( "write " );
}
if (pEntry->Flags & SCE_FLAG_READ) {
printf( "read " );
}
if (pEntry->Flags & SCE_FLAG_PAGING) {
printf( "paging io " );
}
if (pEntry->Flags & SCE_FLAG_ASYNC) {
printf( "asyncfileobj " );
}
if (pEntry->Flags & SCE_FLAG_SET_ALLOC) {
printf( "setalloc " );
}
if (pEntry->Flags & SCE_FLAG_SET_EOF) {
printf( "seteof " );
}
if (pEntry->Flags & SCE_FLAG_CANT_WAIT) {
printf( "cantwait ");
}
if (pEntry->Flags & SCE_FLAG_SYNC_PAGING) {
printf( "synchpaging " );
}
if (pEntry->Flags & SCE_FLAG_LAZY_WRITE) {
printf( "lazywrite " );
}
if (pEntry->Flags & SCE_FLAG_CACHED) {
printf( "cached " );
}
if (pEntry->Flags & SCE_FLAG_ON_DISK_READ) {
printf( "fromdisk " );
}
if (pEntry->Flags & SCE_FLAG_RECURSIVE) {
printf( "recursive " );
}
if (pEntry->Flags & SCE_FLAG_NON_CACHED) {
printf( "noncached " );
}
if (pEntry->Flags & SCE_FLAG_UPDATE_FROM_DISK) {
printf( "updatefromdisk " );
}
printf(")\n");
printf("Start: 0x%I64x Range: 0x%I64x Result: 0x%I64x\n\n",
pEntry->Start, pEntry->Range, pEntry->Result);
pEntry++;
} // endfor
} while ( TRUE );
}