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.
 
 
 
 
 
 

332 lines
10 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: PCH.cxx
//
// Contents: Pre-compiled header
//
// History: 21-Dec-92 BartoszM Created
//
//--------------------------------------------------------------------------
#define KDEXTMODE
//
// Following define prevents the inclusion of extra filter related fields
// in the FSRTL_COMMON_FCB_HEADER in fsrtl.h, whcih aren't in ntifs.h (used
// by FAT)
//
#define BUILDING_FSKDEXT
#ifndef __FATKDPCH_H
#define __FATKDPCH_H
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <ntos.h>
#include <zwapi.h>
// typedef int DCB;
#include <windef.h>
#include <windows.h>
#include <memory.h>
#include <fsrtl.h>
#undef CREATE_NEW
#undef OPEN_EXISTING
//#include <ntifs.h>
//#include <ntdddisk.h>
//#include "..\nodetype.h"
//#include "..\Fat.h"
//#include "..\Lfn.h"
//#include "..\FatStruc.h"
//#include "..\FatData.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include <imagehlp.h>
// Stolen from ntrtl.h to override RECOMASSERT
#undef ASSERT
#undef ASSERTMSG
#if DBG
#define ASSERT( exp ) \
if (!(exp)) \
RtlAssert( #exp, __FILE__, __LINE__, NULL )
#define ASSERTMSG( msg, exp ) \
if (!(exp)) \
RtlAssert( #exp, __FILE__, __LINE__, msg )
#else
#define ASSERT( exp )
#define ASSERTMSG( msg, exp )
#endif // DBG
#define KDEXT_64BIT
#include <wdbgexts.h>
#define OFFSET(struct, elem) ((char *) &(struct->elem) - (char *) struct)
#define _DRIVER
#define KDBG_EXT
#include "wmistr.h"
#pragma hdrstop
typedef struct _STATE {
ULONG mask;
ULONG value;
CHAR *pszname;
} STATE;
VOID
PrintState(STATE *ps, ULONG state);
typedef VOID (*ELEMENT_DUMP_ROUTINE)(
IN ULONG64 RemoteAddress,
IN LONG Options
);
typedef ELEMENT_DUMP_ROUTINE *PELEMENT_DUMP_ROUTINE;
struct _NODE_TYPE_INFO_NEW;
typedef struct _NODE_TYPE_INFO_NEW *PNODE_TYPE_INFO_NEW;
typedef VOID (*STRUCT_DUMP_ROUTINE)(
IN ULONG64 Address,
IN LONG Options,
IN PNODE_TYPE_INFO_NEW InfoNode
);
typedef STRUCT_DUMP_ROUTINE *PSTRUCT_DUMP_ROUTINE;
#define DUMP_ROUTINE( X) \
VOID \
X( IN ULONG64 Address, \
IN LONG Options, \
IN PNODE_TYPE_INFO_NEW InfoNode)
//
// Node types, names, and associated dump routines.
//
typedef struct _NODE_TYPE_INFO_NEW {
USHORT TypeCode; // should be NODE_TYPE_CODE
char *Text;
char *TypeName;
STRUCT_DUMP_ROUTINE DumpRoutine;
// char *flagsfield; // TODO: add field to specify field recursion (dump params) as well?
// STATE *flagsinfo;
} NODE_TYPE_INFO_NEW;
#define NodeTypeName( InfoIndex) (NewNodeTypeCodes[ (InfoIndex)].Text)
#define NodeTypeTypeName( InfoIndex) (NewNodeTypeCodes[ (InfoIndex)].TypeName)
#define NodeTypeDumpFunction( InfoIndex) (NewNodeTypeCodes[ (InfoIndex)].DumpRoutine)
#define NodeTypeSize( InfoIndex) (NewNodeTypeCodes[ (InfoIndex)].Size)
//
// Define the global in memory structure tag information
//
extern NODE_TYPE_INFO_NEW NewNodeTypeCodes[];
#define TypeCodeInfoIndex( X) SearchTypeCodeIndex( X, NewNodeTypeCodes)
ULONG
SearchTypeCodeIndex (
IN USHORT TypeCode,
IN NODE_TYPE_INFO_NEW TypeCodes[]
);
#define AVERAGE(TOTAL,COUNT) ((COUNT) != 0 ? (TOTAL)/(COUNT) : 0)
//
// DUMP_WITH_OFFSET -- for dumping pointers contained in structures.
//
#define DUMP8_WITH_OFFSET(type, ptr, element, label) \
dprintf( "\n(%03x) %8hx %s ", \
FIELD_OFFSET(type, element), \
(USHORT)((UCHAR)ptr.element), \
label )
#define DUMP16_WITH_OFFSET(type, ptr, element, label) \
dprintf( "\n(%03x) %8hx %s ", \
FIELD_OFFSET(type, element), \
(USHORT)ptr.element, \
label )
#define DUMP_WITH_OFFSET(type, ptr, element, label) \
dprintf( "\n(%03x) %08x %s ", \
FIELD_OFFSET(type, element), \
ptr.element, \
label )
#define DUMP64_WITH_OFFSET(type, ptr, element, label) \
dprintf( "\n(%03x) %016I64x %s ", \
FIELD_OFFSET(type, element), \
ptr.element, \
label )
//
// DUMP_EMBW_OFFSET -- for dumping elements embedded in structures.
//
#define DUMP_EMBW_OFFSET(type, address, element, label) \
dprintf( "\n(%03x) %08x -> %s ", \
FIELD_OFFSET(type, element), \
((PUCHAR)address) + FIELD_OFFSET(type, element), \
label )
#define ReadM( B, A, L) { \
ULONG RmResult; \
if (!ReadMemory( (A), (B), (L), &RmResult)) { \
dprintf( "Unable to read %d bytes at 0x%I64x\n", (L), (A)); \
return; \
} \
}
#define RM( Addr, Obj, pObj, Type, Result ) { \
(pObj) = (Type)(Addr); \
if ( !ReadMemory( (Addr), &(Obj), sizeof( Obj ), &(Result)) ) { \
dprintf( "Unable to read %d bytes at %p\n", sizeof(Obj), (Addr)); \
return; \
} \
}
#define RMSS( Addr, Length, Obj, pObj, Type, Result ) { \
(pObj) = (Type)(Addr); \
if ( !ReadMemory( (Addr), &(Obj), (Length), &(Result)) ) { \
dprintf( "Unable to read %d bytes at %p\n", (Length), (Addr)); \
return; \
} \
}
#define ROE( X) { \
ULONG _E_; \
if (_E_ = (X)) { \
dprintf("Error %d (File %s Line %d)\n", _E_, __FILE__, __LINE__); \
return; \
} \
}
VOID
DumpStr(
IN ULONG FieldOffset,
IN ULONG64 StringAddress,
IN PUCHAR Label,
IN BOOLEAN CrFirst,
IN BOOLEAN Wide
);
//
// ....( TYPE, LOCAL_RECORD, REMOTE_ADDRESS_OF_RECORD, TYPE_FIELD_NAME, LABEL)
//
#define DUMP_UCST_OFFSET( type, ptr, address, resident, element, label) \
DumpWStr( FIELD_OFFSET(type, element), \
resident ? (((PUCHAR)address) + FIELD_OFFSET(type, element)) : *((PVOID*)&(ptr.element)), \
resident ? &(ptr.element) : NULL, \
label, TRUE \
)
#define DUMP_UCST_OFFSET_NO_CR( type, ptr, address, resident, element, label) \
DumpWStr( FIELD_OFFSET(type, element), \
resident ? (((PUCHAR)address) + FIELD_OFFSET(type, element)) : *((PVOID*)&(ptr.element)), \
resident ? &(ptr.element) : NULL, \
label, FALSE \
)
#define DUMP_STRN_OFFSET( type, ptr, address, resident, element, label) \
DumpStr( FIELD_OFFSET(type, element), \
resident ? (((PUCHAR)address) + FIELD_OFFSET(type, element)) : *((PVOID*)&(ptr.element)), \
resident ? &(ptr.element) : NULL, \
label, TRUE \
)
#define DUMP_STRN_OFFSET_NO_CR( type, ptr, address, resident, element, label) \
DumpStr( FIELD_OFFSET(type, element), \
resident ? (((PUCHAR)address) + FIELD_OFFSET(type, element)) : *((PVOID*)&(ptr.element)), \
resident ? &(ptr.element) : NULL, \
label, FALSE \
)
#define DUMP_RAW_TERM_STRN_OFFSET( type, ptr, address, element, label) \
dprintf( "\n(%03x) %08x -> %s = '%s'", \
FIELD_OFFSET(type, element), \
((PUCHAR)address) + FIELD_OFFSET(type, element), \
label , \
ptr.element)
VOID
DumpList(
IN ULONG64 RemoteListEntryAddress,
IN ELEMENT_DUMP_ROUTINE ProcessElementRoutine,
IN ULONG OffsetToContainerStart,
IN BOOLEAN ProcessThisEntry,
IN ULONG Options
);
VOID
ParseAndDump (
IN PCHAR args,
IN STRUCT_DUMP_ROUTINE DumpFunction,
ULONG Processor,
HANDLE hCurrentThread
);
ULONG
Dt( IN UCHAR *Type,
IN ULONG64 Addr,
IN ULONG Recur,
IN ULONG FieldInfoCount,
IN FIELD_INFO FieldInfo[]
);
//
// Definitions nicked from fsrtl/largemcb.c to enable dumping of FAT/UDFS
// MCB structures
//
typedef struct _MAPPING {
VBN NextVbn;
LBN Lbn;
} MAPPING;
typedef MAPPING *PMAPPING;
typedef struct _NONOPAQUE_MCB {
PFAST_MUTEX FastMutex;
ULONG MaximumPairCount;
ULONG PairCount;
POOL_TYPE PoolType;
PMAPPING Mapping;
} NONOPAQUE_MCB;
typedef NONOPAQUE_MCB *PNONOPAQUE_MCB;
//
// A macro to return the size, in bytes, of a retrieval mapping structure
//
#define SizeOfMapping(MCB) ((sizeof(MAPPING) * (MCB)->MaximumPairCount))
#endif