//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1998 - 2000. // // File: vmapdump.cxx // // Contents: VMAP dump utility // // History: 22 Jan 1998 AlanW Created // //-------------------------------------------------------------------------- #include #pragma hdrstop #include DECLARE_INFOLEVEL(ci) unsigned fVerbose = 0; int VMapDump( 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 += VMapDump(pszFile); } } return cFail != 0; } int VMapDump( 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\tparent\ttype\n" "\t\tvirtual scope\n" "\t\tphysical scope\n" ); ULONG cbRead; CVMapDesc VMapDesc; for ( unsigned i = 0; ; i++ ) { if ( ! ReadFile( h, &VMapDesc, sizeof VMapDesc, &cbRead, 0 ) ) { fprintf(stderr, "Error %d reading %s\n", GetLastError(), pszPath ); CloseHandle( h ); return 1; } if (cbRead == 0) break; if (VMapDesc.IsFree()) continue; printf("%08x %d.\t%d\t%03x", i*sizeof VMapDesc, i, VMapDesc.Parent(), VMapDesc.RootType() ); if (VMapDesc.IsManual()) printf(" ManualRoot"); if (VMapDesc.IsAutomatic()) printf(" AutomaticRoot"); if (VMapDesc.IsInUse()) printf(" UsedRoot"); if (VMapDesc.IsNNTP()) printf(" NNTPRoot"); if (VMapDesc.IsNonIndexedVDir()) printf(" NonIndexedVDir"); if (VMapDesc.IsIMAP()) printf(" IMAPRoot"); printf("\n"); unsigned cchVirtual = VMapDesc.VirtualLength(); unsigned cchPhysical = VMapDesc.PhysicalLength(); if (cchVirtual > MAX_PATH) { fprintf(stderr, "Error - Virtual path len too long, %d\n", cchVirtual ); cchVirtual = MAX_PATH; } if (cchPhysical > MAX_PATH) { fprintf(stderr, "Error - Physical path len too long, %d\n", cchPhysical ); cchPhysical = MAX_PATH; } printf("\t\t%*.64ws\n\t\t%*.64ws\n", cchVirtual, VMapDesc.VirtualPath(), cchPhysical, VMapDesc.PhysicalPath() ); } CloseHandle( h ); return 0; }