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.
154 lines
3.6 KiB
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;
|
|
}
|