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.
 
 
 
 
 
 

154 lines
3.6 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998 - 2000.
//
// File: vmapdump.cxx
//
// Contents: VMAP dump utility
//
// History: 22 Jan 1998 AlanW Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <vmap.hxx>
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;
}