//+------------------------------------------------------------------------- // // 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 #include #include #include #include // typedef int DCB; #include #include #include #include #undef CREATE_NEW #undef OPEN_EXISTING //#include //#include //#include "..\nodetype.h" //#include "..\Fat.h" //#include "..\Lfn.h" //#include "..\FatStruc.h" //#include "..\FatData.h" #include #include #include //#include // 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 #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