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.
 
 
 
 
 
 

1596 lines
49 KiB

/*******************************************************************
*
* File : dump.cxx
* Author : Eyal Schwartz
* Copyrights : Microsoft Corp (C) 1996
* Date : 7/15/1998
* Description : implentation of dump routines
*
* Revisions : <date> <name> <description>
*******************************************************************/
#ifndef DUMP_CXX
#define DUMP_CXX
// include //
// common
#include "common.h"
#include "util.hxx"
#include <winsock2.h>
#include <winldap.h>
#include <windns.h>
// dns structures
#include "dns.h"
#include "tree.h"
// Ignore zero sized array warnings.
#pragma warning (disable : 4200)
#include "dnsrpc.h"
#include "name.h"
#include "record.h"
#include "update.h"
#include "dpart.h"
#include "EventControl.h"
#include "zone.h"
#include "msginfo.h"
// local
#include "dump.hxx"
// types //
// BUGBUG: RE-DECLARED from lock.c !!
#define MAX_LOCKED_TIME (300) // 5 minutes
#define LOCK_HISTORY_SIZE (256)
typedef struct _LockEntry
{
LONG Count;
DWORD ThreadId;
LPSTR File;
DWORD Line;
}
LOCK_ENTRY, *PLOCK_ENTRY;
typedef struct _LockTable
{
LPSTR pszName;
DWORD FailuresSinceLockFree;
DWORD LastFreeLockTime;
DWORD Index;
LOCK_ENTRY OffenderLock;
LOCK_ENTRY LockHistory[ LOCK_HISTORY_SIZE ];
}
LOCK_TABLE, * PLOCK_TABLE;
//
// Protos for exported functions
//
DECLARE_DUMPFUNCTION( Dump_DNS_MSGINFO );
DECLARE_DUMPFUNCTION( Dump_DS_SEARCH );
DECLARE_DUMPFUNCTION( Dump_Help );
DECLARE_DUMPFUNCTION( Dump_SockAddr );
DECLARE_DUMPFUNCTION( Dump_DB_NODE );
DECLARE_DUMPFUNCTION( Dump_COUNT_NAME );
DECLARE_DUMPFUNCTION( Dump_ZONE_INFO );
DECLARE_DUMPFUNCTION( Dump_DB_RECORD );
DECLARE_DUMPFUNCTION( Dump_IP_ARRAY );
DECLARE_DUMPFUNCTION( Dump_LOCK_TABLE );
DECLARE_DUMPFUNCTION( Dump_LOCK_ENTRY );
DECLARE_DUMPFUNCTION( Dump_UPDATE );
DECLARE_DUMPFUNCTION( Dump_UPDATE_LIST );
DECLARE_DUMPFUNCTION( Dump_DNS_WIRE_QUESTION );
DECLARE_DUMPFUNCTION( Dump_LOOKUP_NAME );
DECLARE_DUMPFUNCTION( Dump_DNS_HEADER );
DECLARE_DUMPFUNCTION( Dump_HEAP_HEADER );
//
// Private protos
//
DECLARE_DUMPFUNCTION( Dump_ADDITIONAL_INFO );
DECLARE_DUMPFUNCTION( Dump_COMPRESSION_INFO );
DECLARE_DUMPFUNCTION( Dump_Record_SOA );
DECLARE_DUMPFUNCTION( Dump_SID );
VOID
DumpBuffer(
PVOID Buffer,
DWORD BufferSize );
//
// Dispatch table
//
DUMPENTRY gfDumpTable[] =
{
"COUNT_NAME" , Dump_COUNT_NAME,
"DB_NODE" , Dump_DB_NODE,
"DB_RECORD" , Dump_DB_RECORD,
"DNS_HEADER" , Dump_DNS_HEADER,
"DNS_WIRE_QUESTION" , Dump_DNS_WIRE_QUESTION,
"DS_SEARCH" , Dump_DS_SEARCH,
"HEAP_HEADER" , Dump_HEAP_HEADER,
"HELP" , Dump_Help,
"IP_ARRAY" , Dump_IP_ARRAY,
"LOCK_TABLE" , Dump_LOCK_TABLE,
"LOCK_ENTRY" , Dump_LOCK_ENTRY,
"LOOKUP_NAME" , Dump_LOOKUP_NAME,
"MSGINFO" , Dump_DNS_MSGINFO,
"SOCKADDR" , Dump_SockAddr,
"UPDATE" , Dump_UPDATE,
"UPDATE_LIST" , Dump_UPDATE_LIST,
"ZONE_INFO" , Dump_ZONE_INFO,
"SID" , Dump_SID
};
const INT gcbDumpTable = (sizeof(gfDumpTable) / sizeof(DUMPENTRY) );
// functions //
/*+++
Function : Dump_Help
Description: print out dump usage
Parameters : none.
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_Help)
{
Printf( "dnsexts.dump <DATATYPE> <ADDRESS>\n <ADDRESS> := any hex debugger valid address\n" );
Printf( " <DATATYPE> :=\n" );
Printf( "\tCOUNT_NAME: Counted name definition.\n" );
Printf( "\tDB_NODE: Tree node definition.\n" );
Printf( "\tDB_RECORD: RR structure.\n" );
Printf( "\tDNS_HEADER: DNS Header.\n" );
Printf( "\tDNS_WIRE_QUESTION: DNS Question.\n" );
Printf( "\tHEAP_HEADER: DNS heap header.\n" );
Printf( "\tHELP: print this screen.\n" );
Printf( "\tIP_ARRAY: IP Address Array type.\n" );
Printf( "\tLOCK_TABLE: Debug lock tracking table.\n" );
Printf( "\tLOCK_ENTRY: Debug lock tracking entry.\n" );
Printf( "\tLOOKUP_NAME: Lookup name definition.\n" );
Printf( "\tMSGINFO: DNS Server Message Info structure.\n" );
Printf( "\tSOCKADDR: Winsock address.\n" );
Printf( "\tUPDATE: Update list entry.\n" );
Printf( "\tUPDATE_LIST: Update list table.\n" );
Printf( "\tZONE_INFO: Zone information type.\n" );
Printf( "\tSID: Dump given SID.\n" );
Printf( "---\n" );
return TRUE;
}
/*+++
Function : Dump_DNS_MSGINFO
Description: dumps out message info
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_DNS_MSGINFO )
{
Printf( "DNS_MSGINFO(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// DNS_MSGINFO header
//
PDNS_MSGINFO pMsg = (PDNS_MSGINFO) PushMemory( lpVoid, sizeof(DNS_MSGINFO) );;
Printf( " ListEntry = {Flink=0x%p, Blink=0x%p}\n", pMsg->ListEntry.Flink, pMsg->ListEntry.Blink );
Printf( " Socket = 0x%x\n", (DWORD)pMsg->Socket );
Printf( " RemoteAddressLength = 0x%x (%d)\n", pMsg->RemoteAddressLength, pMsg->RemoteAddressLength );
Printf( " RemoteAddress -- " );
Dump_SockAddr((LPVOID)&(pMsg->RemoteAddress) );
Printf( " BufferLength = 0x%x\n", pMsg->BufferLength );
Printf( " pBufferEnd = 0x%p\n", pMsg->pBufferEnd );
Printf( " pCurrent = 0x%p\n", pMsg->pCurrent );
Printf( " pnodeCurrent = 0x%p\n", pMsg->pnodeCurrent );
Printf( " pzoneCurrent = 0x%p\n", pMsg->pzoneCurrent );
Printf( " pnodeDelegation = 0x%p\n", pMsg->pnodeDelegation );
Printf( " wTypeCurrent = 0x%x\n", pMsg->wTypeCurrent );
Printf( " wOffsetCurrent = 0x%x\n", pMsg->wOffsetCurrent );
Printf( " pNodeQuestion = 0x%p\n", pMsg->pNodeQuestion );
Printf( " pNodeNodeQuestionClosest = 0x%p\n", pMsg->pNodeQuestionClosest );
Printf( " pQuestion = 0x%p\n", pMsg->pQuestion );
Printf( " wQuestionType = 0x%x\n", pMsg->wQuestionType );
Printf( " wQueuingXid = 0x%x\n", pMsg->wQueuingXid );
Printf( " dwQueryTime = 0x%x\n", pMsg->dwQueryTime );
Printf( " dwQueuingTime = 0x%x\n", pMsg->dwQueuingTime );
Printf( " dwExpireTime = 0x%x\n", pMsg->dwExpireTime );
Printf( " pRecurseMsg = 0x%p\n", pMsg->pRecurseMsg );
Printf( " pnodeRecurseRetry = 0x%p\n", pMsg->pnodeRecurseRetry );
Printf( " pNsList = 0x%p\n", pMsg->pNsList );
Printf( " pConnection = 0x%p\n", pMsg->pConnection );
Printf( " pchRecv = 0x%p\n", pMsg->pchRecv );
Printf( " UnionMarker = 0x%x\n", pMsg->UnionMarker );
//
// Union -- should get a union tag
//
{
//
// For now, print both Nbstat & Xfr images
//
Printf( " Union:\n" );
//
// WINS info
//
{
Printf( " (U.Wins):\n" );
Printf( " pWinsRR = 0x%x\n", pMsg->U.Wins.pWinsRR );
Printf( " WinsNameBuffer = 0x%x\n", RELATIVE_ADDRESS(lpVoid, pMsg, pMsg->U.Wins.pWinsRR) );
Printf( " cchWinsName = %d\n", pMsg->U.Wins.cchWinsName );
}
//
// Nbstat info
//
{
Printf( " (U.Nbstat):\n" );
Printf( " pRR = 0x%p\n", pMsg->U.Nbstat.pRR );
Printf( " pNbstat = 0x%p\n", pMsg->U.Nbstat.pNbstat );
Printf( " ipNbstat = 0x%x\n", pMsg->U.Nbstat.ipNbstat );
Printf( " dwNbtInterfaceMask = 0x%x\n", pMsg->U.Nbstat.dwNbtInterfaceMask );
Printf( " fNbstatResponded = %s\n", pMsg->U.Nbstat.fNbstatResponded? "TRUE" : "FALSE" );
}
//
// Xfr
//
{
Printf( " (U.Xfr):\n" );
Printf( " dwMessageNumber = 0x%x\n", pMsg->U.Xfr.dwMessageNumber );
Printf( " dwSecondaryVersion = 0x%x\n", pMsg->U.Xfr.dwSecondaryVersion );
Printf( " dwMasterVersion = 0x%x\n", pMsg->U.Xfr.dwMasterVersion );
Printf( " dwLastSoaVersion = 0x%x\n", pMsg->U.Xfr.dwLastSoaVersion );
Printf( " fReceivedStartSoa = %s\n", pMsg->U.Xfr.fReceivedStartSoa?"TRUE":"FALSE" );
Printf( " fBindTransfer = %s\n", pMsg->U.Xfr.fBindTransfer?"TRUE":"FALSE" );
Printf( " fMsTransfer = %s\n", pMsg->U.Xfr.fMsTransfer?"TRUE":"FALSE" );
Printf( " fLastPassAdd = %s\n", pMsg->U.Xfr.fLastPassAdd?"TRUE":"FALSE" );
}
//
// Forward
//
{
Printf( " (U.Forward):\n" );
Printf( " OriginalSocket = 0x%x\n", pMsg->U.Forward.OriginalSocket );
Printf( " ipOriginal = 0x%x\n", pMsg->U.Forward.ipOriginal );
Printf( " wOriginalPort = 0x%x\n", pMsg->U.Forward.wOriginalPort );
Printf( " wOriginalXid = 0x%x\n", pMsg->U.Forward.wOriginalXid );
}
}
Printf( " pLooknameQuestion = 0x%p\n",pMsg->pLooknameQuestion );
Printf( " FlagMarker = 0x%x\n", pMsg->FlagMarker );
Printf( " fDelete = 0x%x\n", pMsg->fDelete );
Printf( " fTcp = 0x%x\n", pMsg->fTcp );
Printf( " fMessageComplete = 0x%x\n", pMsg->fMessageComplete );
Printf( " Section = %d\n", pMsg->Section );
Printf( " fDoAdditional = 0x%x\n", pMsg->fDoAdditional );
Printf( " fRecurseIfNecessary = 0x%x\n", pMsg->fRecurseIfNecessary );
Printf( " fRecursePacket = 0x%x\n", pMsg->fRecursePacket );
Printf( " fQuestionRecursed = 0x%x\n", pMsg->fQuestionRecursed );
Printf( " fQuestionCompleted = 0x%x\n", pMsg->fQuestionCompleted );
Printf( " fRecurseQuestionSent = 0x%x\n", pMsg->fRecurseQuestionSent );
Printf( " fRecurseTimeoutWait = 0x%x\n", pMsg->fRecurseTimeoutWait );
Printf( " nForwarder = 0x%x\n", pMsg->nForwarder );
Printf( " fReplaceCname = 0x%x\n", pMsg->fReplaceCname );
Printf( " cCnameAnswerCount = %d\n", pMsg->cCnameAnswerCount );
Printf( " fNoCompressionWrite = 0x%x\n", pMsg->fNoCompressionWrite );
Printf( " fWins = 0x%x\n", pMsg->fWins );
Printf( " fQuestionWildcard = 0x%x\n", pMsg->fQuestionWildcard );
Printf( " Additional --\n" );
Dump_ADDITIONAL_INFO( (LPVOID)&pMsg->Additional );
Printf( " Compression --\n" );
Dump_COMPRESSION_INFO( (LPVOID)&pMsg->Compression );
#if DBG
Printf( " DbgListEntry = {Flink=0x%p; Blink=0x%p}\n", pMsg->DbgListEntry.Flink, pMsg->DbgListEntry.Blink );
#endif
Printf( " dwForceAlignment = 0x%x\n", pMsg->dwForceAlignment );
Printf( " BytesToReceive = 0x%x\n", pMsg->BytesToReceive );
Printf( " MessageLength = 0x%x\n", pMsg->MessageLength );
Printf( " Head --\n" );
Dump_DNS_HEADER((LPVOID)&pMsg->Head );
Printf( " MessageBody -- " );
DumpBuffer((LPVOID)RELATIVE_ADDRESS(lpVoid, pMsg, pMsg->MessageBody), pMsg->MessageLength );
PopMemory( (PVOID)pMsg );
return TRUE;
}
/*+++
Function : DumpSockAddr
Description: dumps sockaddr structure
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_SockAddr)
{
Printf( "SockAddr(0x%p):\n", lpVoid );
if( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print sockaddr structure
//
PSOCKADDR_IN paddr = (PSOCKADDR_IN) PushMemory( lpVoid, sizeof(SOCKADDR_IN) );;
Printf(
" family = %d, port = %d, address = [%d:%d:%d:%d]\n",
paddr->sin_family, paddr->sin_port,
paddr->sin_addr.S_un.S_un_b.s_b1,
paddr->sin_addr.S_un.S_un_b.s_b2,
paddr->sin_addr.S_un.S_un_b.s_b3,
paddr->sin_addr.S_un.S_un_b.s_b4 );
PopMemory( (PVOID)paddr );
return TRUE;
}
/*+++
Function : Dump_DB_NODE
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_DB_NODE)
{
Printf( "DB_NODE(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print node structure
//
PDB_NODE pnode = (PDB_NODE) PushMemory( lpVoid, sizeof(DB_NODE) );;
Printf( " pParent = 0x%p\n", pnode->pParent );
Printf( " pSibUp = 0x%p\n", pnode->pSibUp );
Printf( " pSibLeft = 0x%p\n", pnode->pSibLeft );
Printf( " pSibRight = 0x%p\n", pnode->pSibRight );
Printf( " cChildren = %lu\n", pnode->cChildren );
Printf( " pChildren = 0x%p\n", pnode->pChildren );
Printf( " pZone = 0x%p\n", pnode->pZone );
Printf( " pRRList = 0x%p\n", pnode->pRRList );
Printf( " dwCompare = 0x%x\n", pnode->dwCompare );
Printf( " cReferenceCount = %lu\n", pnode->cReferenceCount );
Printf( " wNodeFlags = 0x%x\n", pnode->wNodeFlags );
Printf( " uchAuthority = 0x%x\n", pnode->uchAuthority );
Printf( " uchAccessbin = %d\n", (INT)pnode->uchAccessBin );
Printf( " cchLabelLength = %d\n", (INT)pnode->cchLabelLength );
Printf( " szLabel -- \n" );
// JBUGBUG: this looks dubious if node bad\broken
DumpBuffer(
(LPVOID)RELATIVE_ADDRESS( lpVoid, pnode, pnode->szLabel ),
((INT)pnode->cchLabelLength < DNS_MAX_LABEL_LENGTH)
? (INT)pnode->cchLabelLength
: DNS_MAX_LABEL_LENGTH );
PopMemory( (PVOID)pnode );
return TRUE;
}
/*+++
Function : Dump_COUNT_NAME
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_COUNT_NAME)
{
Printf( "COUNT_NAME(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print count name
//
PCOUNT_NAME pname = (PCOUNT_NAME) PushMemory( lpVoid, sizeof(COUNT_NAME) );
Printf( " Length = %d\n", pname->Length );
Printf( " LabelCount = %d\n", pname->LabelCount );
Printf( " RawName -- \n" );
DumpBuffer(
(LPVOID)RELATIVE_ADDRESS(lpVoid, pname, pname->RawName),
pname->Length > DNS_MAX_NAME_LENGTH
? DNS_MAX_NAME_LENGTH
: pname->Length );
PopMemory( (PVOID)pname );
return TRUE;
}
/*+++
Function : Dump_ZONE_INFO
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_ZONE_INFO )
{
Printf( "ZONE_INFO(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
PZONE_INFO pzone = (PZONE_INFO) PushMemory( lpVoid, sizeof(ZONE_INFO) );
Printf( " ListEntry = [Flink=%p, Blink=%p]\n",
pzone->ListEntry.Flink,
pzone->ListEntry.Blink );
Printf( " pszZoneName = %p\n", pzone->pszZoneName );
Printf( " pwsZoneName = %p\n", pzone->pwsZoneName );
Printf( " pCountName = %p\n", pzone->pCountName );
Printf( " pZoneRoot = %p\n", pzone->pZoneRoot );
Printf( " pTreeRoot = %p\n", pzone->pTreeRoot );
Printf( " pZoneTreeLink = %p\n", pzone->pZoneTreeLink );
Printf( " pLoadZoneRoot = %p\n", pzone->pLoadZoneRoot );
Printf( " pLoadTreeRoot = %p\n", pzone->pLoadTreeRoot );
Printf( " pLoadOrigin = %p\n", pzone->pLoadOrigin );
Printf( " pOldTree = %p\n", pzone->pOldTree );
Printf( " ---\n" );
Printf( " pszDataFile = %p\n", pzone->pszDataFile );
Printf( " pwzDataFile = %p\n", pzone->pwsDataFile );
Printf( " pDelayedUpdateList = %p\n", pzone->pDelayedUpdateList );
Printf( " pLockTable = %p\n", pzone->pLockTable );
Printf( " pSoaRR = %p\n", pzone->pSoaRR );
Printf( " pWinsRR = %p\n", pzone->pWinsRR );
Printf( " pLocalWInsRR = %p\n", pzone->pLocalWinsRR );
Printf( " pSD = %p\n", pzone->pSD );
Printf( " ---\n" );
Printf( " fZoneType = %d\n", pzone->fZoneType );
Printf( " fDsIntegrated = %s\n", pzone->fDsIntegrated ? "TRUE" : "FALSE" );
Printf( " fAllowUpdate = %d\n", pzone->fAllowUpdate );
Printf( " iRRCount = %d\n", pzone->iRRCount );
Printf( " ---\n" );
Printf( " ipReverse = 0x%x\n", pzone->ipReverse );
Printf( " ipReverseMask = 0x%x\n", pzone->ipReverseMask );
Printf( " dwSerialNo = %lu\n", pzone->dwSerialNo );
Printf( " dwLoadSerialNo = %lu\n", pzone->dwLoadSerialNo );
Printf( " dwLastXfrSerialNo = %lu\n", pzone->dwLastXfrSerialNo );
Printf( " dwNewSerialNo = %lu\n", pzone->dwNewSerialNo );
Printf( " dwDefaultTtl = 0x%x\n", pzone->dwDefaultTtl );
Printf( " dwDefTtlHostOrder = %lu\n", pzone->dwDefaultTtlHostOrder );
Printf( " ---\n" );
Printf( " Master Info:\n" );
Printf( " aipSecondaries = %p\n", pzone->aipSecondaries );
Printf( " aipNotify = %p\n", pzone->aipNotify );
Printf( " aipNameServers = %p\n", pzone->aipNameServers );
Printf( " ---\n" );
Printf( " Primary Info:\n" );
Printf( " pwzLogFile = %p\n", pzone->pwsLogFile );
Printf( " hfileUpdateLog = 0x%x\n", pzone->hfileUpdateLog );
Printf( " iUpdateLogCount = %d\n", pzone->iUpdateLogCount );
Printf( " bAging = %s\n", pzone->bAging ? "TRUE" : "FALSE" );
Printf( " dwNoRefreshInterval = %lu\n", pzone->dwNoRefreshInterval );
Printf( " dwRefreshInterval = %lu\n", pzone->dwRefreshInterval );
Printf( " dwRefreshTime = %lu\n", pzone->dwRefreshTime );
Printf( " dwAgingEnabledTime = %lu\n", pzone->dwAgingEnabledTime );
Printf( " aipScavengeServers = %p\n", pzone->aipScavengeServers );
Printf( " DS Primary Info:\n" );
Printf( " pwsZoneDN = %p\n", pzone->pwszZoneDN );
// FIXME
Printf( " llSecureUpdateTime = %p\n", pzone->llSecureUpdateTime );
Printf( " fDsRelaod = %s\n", pzone->fDsReload ? "TRUE" : "FALSE" );
Printf( " fInDsWrite = %s\n", pzone->fInDsWrite ? "TRUE" : "FALSE" );
Printf( " ucDsRecordVersion = %d\n", pzone->ucDsRecordVersion );
Printf( " fLogUpdates = %d\n", pzone->fLogUpdates ? "TRUE" : "FALSE" );
Printf( " szLastUsn = %p\n", RELATIVE_ADDRESS(lpVoid, pzone, pzone->szLastUsn) );
Printf( " ---\n" );
Printf( " Secondary Info:\n" );
Printf( " aipMasters = %p\n", pzone->aipMasters );
// Printf( " MasterInfoArray = %p\n", pzone->MasterInfoArray );
Printf( " pszMasterIpString = %p\n", pzone->pszMasterIpString );
Printf( " ipPrimary = 0x%x\n", pzone->ipPrimary );
Printf( " ipNotifier = 0x%x\n", pzone->ipNotifier );
Printf( " ipFreshMaster = 0x%x\n", pzone->ipFreshMaster );
Printf( " ipXfrBind = 0x%x\n", pzone->ipXfrBind );
Printf( " ipLastAxfrMaster = 0x%x\n", pzone->ipLastAxfrMaster );
Printf( " dwLastSoaCheckTime = %d\n", pzone->dwLastSoaCheckTime );
Printf( " dwNextSoaCheckTime = %d\n", pzone->dwNextSoaCheckTime );
Printf( " dwExpireTime = %d\n", pzone->dwExpireTime );
Printf( " dwZoneRecvStartTime = %d\n", pzone->dwZoneRecvStartTime );
Printf( " dwBadMasterCount = %d\n", pzone->dwBadMasterCount );
Printf( " dwNextTranserTime = %d\n", pzone->dwNextTransferTime );
Printf( " fStale = %s\n", pzone->fStale ? "TRUE" : "FALSE" );
Printf( " fNotified = %s\n", pzone->fNotified ? "TRUE" : "FALSE" );
Printf( " fNeedAxfr = %s\n", pzone->fNeedAxfr ? "TRUE" : "FALSE" );
Printf( " fSkipIxfr = %s\n", pzone->fSkipIxfr ? "TRUE" : "FALSE" );
Printf( " fSlowRetry = %s\n", pzone->fSlowRetry ? "TRUE" : "FALSE" );
Printf( " cIxfrAttempts = %d\n", (INT)pzone->cIxfrAttempts );
Printf( " fEmpty = %s\n", pzone->fEmpty ? "TRUE" : "FALSE" );
Printf( " ---\n" );
Printf( " Locking:\n" );
Printf( " dwLockingThreadId = 0x%x\n", pzone->dwLockingThreadId );
Printf( " fLocked = %d\n", (INT)pzone->fLocked );
Printf( " fUpdateLock = %d\n", pzone->fUpdateLock );
Printf( " fXfrRecvLock = %d\n", pzone->fXfrRecvLock );
Printf( " fFileWriteLock = %d\n", pzone->fFileWriteLock );
Printf( " ---\n" );
Printf( " Flags:\n" );
Printf( " cZoneNameLabelCount = %d\n", (INT)pzone->cZoneNameLabelCount );
Printf( " fReverse = %s\n", pzone->fReverse ? "TRUE" : "FALSE" );
Printf( " fAutoCreated = %s\n", pzone->fAutoCreated ? "TRUE" : "FALSE" );
Printf( " fSecureSecondaries = %d\n", pzone->fSecureSecondaries );
Printf( " fNotifyLevel = %d\n", pzone->fNotifyLevel );
Printf( " fPaused = %s\n", pzone->fPaused ? "TRUE" : "FALSE" );
Printf( " fShutdown = %s\n", pzone->fShutdown ? "TRUE" : "FALSE" );
Printf( " fDirty = %s\n", pzone->fDirty ? "TRUE" : "FALSE" );
Printf( " fRootDirty = %s\n", pzone->fRootDirty ? "TRUE" : "FALSE" );
Printf( " fLocalWins = %s\n", pzone->fLocalWins ? "TRUE" : "FALSE" );
Printf( " ---\n" );
Printf( " UpdateList = %p\n", pzone->UpdateList );
PopMemory( (PVOID)pzone );
return TRUE;
}
/*+++
Function : Dump_DB_RECORD
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_DB_RECORD)
{
Printf( "DB_RECORD(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print record
//
PDB_RECORD prr = (PDB_RECORD) PushMemory( lpVoid, sizeof(DB_RECORD) );
Printf( " pRRNext = 0x%p\n", prr->pRRNext );
Printf( " RecordRank = %d\n", prr->RecordRank );
Printf( " Reserved = 0x%x\n", (BYTE)( prr->Reserved.Source|
prr->Reserved.Reserved|
prr->Reserved.StandardAlloc) );
Printf( " wRRFlags = 0x%x\n", prr->wRRFlags );
Printf( " wType = 0x%x\n", prr->wType );
Printf( " wDataLength = 0x%x\n", prr->wDataLength );
Printf( " dwTtlSeconds = 0x%x\n", prr->dwTtlSeconds );
Printf( " dwTimeStamp = %lu\n", prr->dwTimeStamp );
Printf( " Data ---" );
switch (prr->wType) {
case DNS_TYPE_A:
Printf( " (DNS_TYPE_A):\n" );
Printf( " IpAddr = 0x%x\n", (DWORD)prr->Data.A.ipAddress );
break;
case DNS_TYPE_AAAA:
Printf( " (DNS_TYPE_AAAA):\n" );
Printf( " IP6Addr = [%x:%x:%x:%x;%x;%x;%x;%x]\n",
prr->Data.AAAA.Ip6Addr.IP6Word[0],
prr->Data.AAAA.Ip6Addr.IP6Word[1],
prr->Data.AAAA.Ip6Addr.IP6Word[2],
prr->Data.AAAA.Ip6Addr.IP6Word[3],
prr->Data.AAAA.Ip6Addr.IP6Word[4],
prr->Data.AAAA.Ip6Addr.IP6Word[5],
prr->Data.AAAA.Ip6Addr.IP6Word[6],
prr->Data.AAAA.Ip6Addr.IP6Word[7] );
break;
case DNS_TYPE_SOA:
Printf( " (DNS_TYPE_SOA):\n" );
Dump_Record_SOA( (LPVOID)&(prr->Data.SOA) );
break;
case DNS_TYPE_PTR:
Printf( " (DNS_TYPE_PTR):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.PTR.nameTarget) );
break;
case DNS_TYPE_NS:
Printf( " (DNS_TYPE_NS):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.NS.nameTarget) );
break;
case DNS_TYPE_CNAME:
Printf( " (DNS_TYPE_CNAME):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.CNAME.nameTarget) );
break;
case DNS_TYPE_MB:
Printf( " (DNS_TYPE_MB):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MB.nameTarget) );
break;
case DNS_TYPE_MD:
Printf( " (DNS_TYPE_MD):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MD.nameTarget) );
break;
case DNS_TYPE_MF:
Printf( " (DNS_TYPE_MF):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MF.nameTarget) );
break;
case DNS_TYPE_MG:
Printf( " (DNS_TYPE_MG):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MG.nameTarget) );
break;
case DNS_TYPE_MR:
Printf( " (DNS_TYPE_MR):\n" );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MR.nameTarget) );
break;
case DNS_TYPE_MINFO:
Printf( " (DNS_TYPE_MINFO):\n" );
Printf( " nameMailbox = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MINFO.nameMailbox) );
break;
case DNS_TYPE_RP:
Printf( " (DNS_TYPE_RP):\n" );
Printf( " nameMailbox = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.RP.nameMailbox) );
break;
case DNS_TYPE_MX:
Printf( " (DNS_TYPE_MX):\n" );
Printf( " wPreference = 0x%x\n", prr->Data.MX.wPreference );
Printf( " nameExchange = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.MX.nameExchange) );
break;
case DNS_TYPE_AFSDB:
Printf( " (DNS_TYPE_AFSDB):\n" );
Printf( " wPreference = 0x%x\n", prr->Data.AFSDB.wPreference );
Printf( " nameExchange = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.AFSDB.nameExchange) );
break;
case DNS_TYPE_RT:
Printf( " (DNS_TYPE_RT):\n" );
Printf( " wPreference = 0x%x\n", prr->Data.RT.wPreference );
Printf( " nameExchange = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.RT.nameExchange) );
break;
case DNS_TYPE_HINFO:
Printf( " (DNS_TYPE_HINFO):\n" );
Printf( " chData = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, prr->Data.HINFO.chData) );
break;
case DNS_TYPE_ISDN:
Printf( " (DNS_TYPE_ISDN):\n" );
Printf( " chData = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, prr->Data.ISDN.chData) );
break;
case DNS_TYPE_TEXT:
Printf( " (DNS_TYPE_TEXT):\n" );
Printf( " chData = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, prr->Data.TXT.chData) );
break;
case DNS_TYPE_NULL:
Printf( " (DNS_TYPE_NULL):\n" );
Printf( " chData = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, prr->Data.Null.chData) );
break;
case DNS_TYPE_WKS:
Printf( " (DNS_TYPE_WKS):\n" );
Printf( " ipAddress = 0x%x\n", prr->Data.WKS.ipAddress );
Printf( " chProtocol = 0x%x\n", prr->Data.WKS.chProtocol );
Printf( " bBitMask = @ 0x%p\n", RELATIVE_ADDRESS(lpVoid, prr, prr->Data.WKS.bBitMask) );
break;
case DNS_TYPE_SIG:
Printf( " (DNS_TYPE_SIG):\n" );
Printf( " nameSigner = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.SIG.nameSigner) );
Printf( " wTypeCovered = 0x%x\n", prr->Data.SIG.wTypeCovered );
Printf( " chAlgorithm = 0x%x\n", prr->Data.SIG.chAlgorithm );
Printf( " chLabelCount = 0x%x\n", prr->Data.SIG.chLabelCount );
Printf( " dwOriginalTtl = 0x%x\n", prr->Data.SIG.dwOriginalTtl );
Printf( " dwSigExpiration = 0x%x\n", prr->Data.SIG.dwSigExpiration );
Printf( " dwSigInception = 0x%x\n", prr->Data.SIG.dwSigInception );
Printf( " wKeyTag = 0x%x\n", prr->Data.SIG.wKeyTag );
Printf( " Signature = 0x%p\n", RELATIVE_ADDRESS(lpVoid, prr,
( PBYTE ) &prr->Data.SIG.nameSigner +
DBASE_NAME_SIZE( &prr->Data.SIG.nameSigner ) ) );
break;
case DNS_TYPE_KEY:
Printf( " (DNS_TYPE_KEY):\n" );
Printf( " wFlags = 0x%x\n", prr->Data.KEY.wFlags );
Printf( " chProtocol = 0x%x\n", prr->Data.KEY.chProtocol );
Printf( " chAlgorithm = 0x%x\n", prr->Data.KEY.chAlgorithm );
Printf( " Key = 0x%p\n", RELATIVE_ADDRESS(lpVoid, prr, prr->Data.KEY.Key) );
break;
case DNS_TYPE_LOC:
Printf( " (DNS_TYPE_LOC):\n" );
Printf( " wVersion = 0x%x\n", prr->Data.LOC.wVersion );
Printf( " wSize = 0x%x\n", prr->Data.LOC.wSize );
Printf( " wHorPrec = 0x%x\n", prr->Data.LOC.wHorPrec );
Printf( " wVerPrec = 0x%x\n", prr->Data.LOC.wVerPrec );
Printf( " dwLatitude = 0x%x\n", prr->Data.LOC.dwLatitude );
Printf( " dwLongitude = 0x%x\n", prr->Data.LOC.dwLongitude );
Printf( " dwAltitude = 0x%x\n", prr->Data.LOC.dwAltitude );
break;
case DNS_TYPE_NXT:
Printf( " (DNS_TYPE_NXT):\n" );
Printf( " nameNext = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.NXT.nameNext) );
Printf( " bTypeBitMap = @ 0x%p\n", RELATIVE_ADDRESS(lpVoid, prr, prr->Data.NXT.bTypeBitMap) );
break;
case DNS_TYPE_SRV:
Printf( " (DNS_TYPE_SRV):\n" );
Printf( " wPriority = 0x%x\n", prr->Data.SRV.wPriority );
Printf( " wWeight = 0x%x\n", prr->Data.SRV.wWeight );
Printf( " wPort = 0x%x\n", prr->Data.SRV.wPort );
Printf( " nameTarget = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.SRV.nameTarget) );
break;
case DNS_TYPE_TSIG:
Printf( " (DNS_TYPE_TSIG):\n" );
Printf( " dwTimeSigned = 0x%x\n", prr->Data.TSIG.dwTimeSigned );
Printf( " dwTimeExpire = 0x%x\n", prr->Data.TSIG.dwTimeExpire );
Printf( " wSigLength = 0x%x\n", prr->Data.TSIG.wSigLength );
Printf( " bSignature = @ 0x%x\n", RELATIVE_ADDRESS(lpVoid, prr, prr->Data.TSIG.bSignature) );
Printf( " nameAlgorithm = @ 0x%p\n", RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.TSIG.nameAlgorithm) );
break;
case DNS_TYPE_TKEY:
Printf( " (DNS_TYPE_TKEY):\n" );
Printf( " wKeyLength = 0x%x\n", prr->Data.TKEY.wKeyLength );
Printf( " bKey = @ 0x%p\n", RELATIVE_ADDRESS(lpVoid, prr, prr->Data.TKEY.bKey) );
break;
case DNS_TYPE_WINS:
Printf( " (DNS_TYPE_WINS):\n" );
Printf( " dwMappingFlag = 0x%x\n", prr->Data.WINS.dwMappingFlag );
Printf( " dwLookupTimeout = 0x%x\n", prr->Data.WINS.dwLookupTimeout );
Printf( " dwCacheTimeout = 0x%x\n", prr->Data.WINS.dwCacheTimeout );
Printf( " cWinsServerCount = 0x%x\n", prr->Data.WINS.cWinsServerCount );
Printf( " aipWinsServers = 0x%x\n", prr->Data.WINS.aipWinsServers );
break;
case DNS_TYPE_WINSR:
Printf( " (DNS_TYPE_WINSR):\n" );
Printf( " dwMappingFlag = 0x%x\n", prr->Data.WINSR.dwMappingFlag );
Printf( " dwLookupTimeout = 0x%x\n", prr->Data.WINSR.dwLookupTimeout );
Printf( " dwCacheTimeout = 0x%x\n", prr->Data.WINSR.dwCacheTimeout );
Printf( " nameResultDomain = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, prr, &prr->Data.WINSR.nameResultDomain) );
break;
default:
Printf( "\n Error: Unknown wType value (0x%x).\n", prr->wType );
}
PopMemory( (PVOID)prr );
return TRUE;
}
/*+++
Function : Dump_IP_ARRAY
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_IP_ARRAY)
{
Printf( "IP_ARRAY(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
PIP_ARRAY pIp = (PIP_ARRAY) PushMemory( lpVoid, sizeof(IP_ARRAY) );
INT iMax= pIp->AddrCount > MAX_TINY_LIST ? MAX_TINY_LIST : (INT)pIp->AddrCount;
Printf( " AddrCount = 0x%x\n", pIp->AddrCount );
PIP_ADDRESS addr = (PIP_ADDRESS) PushMemory( (LPVOID)RELATIVE_ADDRESS(lpVoid, pIp, pIp->AddrArray), sizeof(IP_ADDRESS)*iMax );
for(INT i=0; i< iMax; i++){
Printf( " AddrArray[%2d] = 0x%x\n", addr[i] );
}
PopMemory( (PVOID)addr );
if(pIp->AddrCount > MAX_TINY_LIST){
Printf( " (truncated)...\n" );
}
PopMemory( (PVOID)pIp );
return TRUE;
}
/*+++
Function : Dump_LOCK_TABLE
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_LOCK_TABLE)
{
Printf( "LOCK_TABLE(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
PLOCK_TABLE ptab = (PLOCK_TABLE) PushMemory( lpVoid, sizeof(LOCK_TABLE) );;
Printf( " pszName = 0x%p\n", ptab );
Printf( " FailuresSinceLockFree = 0x%x\n", ptab->FailuresSinceLockFree );
Printf( " LastFreeLockTime = 0x%x\n", ptab->LastFreeLockTime );
Printf( " Index = 0x%x\n", ptab->Index );
Printf( " OffenderLock = 0x%p\n", ptab->OffenderLock );
Printf( " LockHistory = 0x%p\n", (LPVOID)RELATIVE_ADDRESS(lpVoid, ptab, ptab->LockHistory) );
PopMemory( (PVOID)ptab );
return TRUE;
}
/*+++
Function : Dump_LOCK_ENTRY
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_LOCK_ENTRY)
{
Printf( "LOCK_ENTRY(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
PLOCK_ENTRY pe = (PLOCK_ENTRY) PushMemory( lpVoid, sizeof(LOCK_ENTRY) );
Printf( " Count = %ld\n", pe->Count );
Printf( " ThreadId = 0x%x\n", pe->ThreadId );
Printf( " File = 0x%p\n", pe );
Printf( " Line = %lu\n", pe->Line );
PopMemory( (PVOID)pe );
return TRUE;
}
/*+++
Function : Dump_UPDATE
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_UPDATE)
{
Printf( "UPDATE(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
PUPDATE p = (PUPDATE) PushMemory( lpVoid, sizeof(UPDATE) );
Printf( " pNext = 0x%x\n", p->pNext );
Printf( " pNode = 0x%p\n", p->pNode );
Printf( " pAddRR = 0x%p\n", p->pAddRR );
Printf( " pDeleteRR =0x%p\n", p->pDeleteRR );
Printf( " dwVersion = 0x%x\n", p->dwVersion );
Printf( " wDeleteType = 0x%x\n", p->wDeleteType );
Printf( " wAddType = 0x%x\n", p->wAddType );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_UPDATE_LIST
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_UPDATE_LIST)
{
Printf( "UPDATE_LIST(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
PUPDATE_LIST p = (PUPDATE_LIST) PushMemory( lpVoid, sizeof(UPDATE_LIST) );
Printf( " pListHead = 0x%p\n", p->pListHead );
Printf( " pCurrent = 0x%p\n", p->pCurrent );
Printf( " pTempNodeList = 0x%p\n", p->pTempNodeList );
Printf( " pNodeFailed = 0x%p\n", p->pNodeFailed );
Printf( " pMsg = 0x%x\n", p->pMsg );
Printf( " Flag = 0x%x\n", p->Flag );
Printf( " dwCount = 0x%x\n", p->dwCount );
Printf( " dwStartVersion = 0x%x\n", p->dwStartVersion );
Printf( " dwHighDsVersion = 0x%x\n", p->dwHighDsVersion );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_DNS_WIRE_QUESTION
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_DNS_WIRE_QUESTION)
{
Printf( "DNS_WIRE_QUESTION(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
PDNS_WIRE_QUESTION p = (PDNS_WIRE_QUESTION) PushMemory( lpVoid, sizeof(DNS_WIRE_QUESTION) );
Printf( " QuestionType = 0x%x\n", p->QuestionType );
Printf( " QuestionClass = 0x%x\n", p->QuestionClass );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_DNS_HEADER
Description: dumps sockaddr structure
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_DNS_HEADER)
{
Printf( "DNS_HEADER(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
PDNS_HEADER p = (PDNS_HEADER) PushMemory( lpVoid, sizeof(DNS_HEADER) );
Printf( " Xid = 0x%x\n", p->Xid );
Printf( " RecursionDesired = 0x%x\n", p->RecursionDesired );
Printf( " Truncation = 0x%x\n", p->Truncation );
Printf( " Authoritative = 0x%x\n", p->Authoritative );
Printf( " Opcode = 0x%x\n", p->Opcode );
Printf( " IsResponse = 0x%x\n", p->IsResponse );
Printf( " ResponseCode = 0x%x\n", p->ResponseCode );
Printf( " Reserved = 0x%x\n", p->Reserved );
Printf( " RecursionAvailable = 0x%x\n", p->RecursionAvailable );
Printf( " QuestionCount = 0x%x\n", p->QuestionCount );
Printf( " AnswerCount = 0x%x\n", p->AnswerCount );
Printf( " NameServerCount = 0x%x\n", p->NameServerCount );
Printf( " AdditionalCount = 0x%x\n", p->AdditionalCount );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : HEAP_HEADER
Description: dumps out additional message info
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_HEAP_HEADER)
{
// from heapdbg.h
#define HEAP_HEADER_FILE_SIZE (16)
struct _HEAP_HEADER
{
//
// Note, if move or add fields, MUST update list entry offset below
//
ULONG HeapCodeBegin;
ULONG AllocCount;
ULONG RequestSize;
ULONG AllocSize;
//
// Put LIST_ENTRY in middle of header
// - keep begin code at front
// - less likely to be corrupted
//
LIST_ENTRY ListEntry;
DWORD AllocTime;
DWORD LineNo;
CHAR FileName[ HEAP_HEADER_FILE_SIZE ];
ULONG TotalAlloc;
ULONG CurrentAlloc;
ULONG FreeCount;
ULONG CurrentAllocCount;
ULONG HeapCodeEnd;
};
Printf( "HEAP_HEADER(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
_HEAP_HEADER *p = (_HEAP_HEADER*) PushMemory( lpVoid, sizeof(_HEAP_HEADER) );
Printf( " HeapCodeBegin = 0x%x\n", p->HeapCodeBegin );
Printf( " AllocCount = 0x%x\n", p->AllocCount );
Printf( " RequestSize = 0x%x\n", p->RequestSize );
Printf( " AllocSize = 0x%x\n", p->AllocSize );
//
// Put LIST_ENTRY in middle of header
// - keep begin code at front
// - less likely to be corrupted
//
Printf( " ListEntry = 0x%x\n", p->ListEntry );
Printf( " AllocTime = 0x%x\n", p->AllocTime );
Printf( " LineNo = %lu\n", p->LineNo );
Printf( " FileName -- \n", p->FileName );
DumpBuffer((LPVOID)RELATIVE_ADDRESS(lpVoid, p, p->FileName), HEAP_HEADER_FILE_SIZE );
Printf( " TotalAlloc = 0x%x\n", p->TotalAlloc );
Printf( " CurrentAlloc = 0x%x\n", p->CurrentAlloc );
Printf( " FreeCount = 0x%x\n", p->FreeCount );
Printf( " CurrentAllocCount = 0x%x\n", p->CurrentAllocCount );
Printf( " HeapCodeEnd = 0x%x\n", p->HeapCodeEnd );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_Record_SOA
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_LOOKUP_NAME){
Printf( "LOOKUP_NAME(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
PLOOKUP_NAME p = (PLOOKUP_NAME) PushMemory( lpVoid, sizeof(LOOKUP_NAME) );
Printf( " cLabelCount = %d\n", p->cLabelCount );
Printf( " cchNameLength = %d\n", p->cchNameLength );
Printf( " pchLabelArray --\n" );
// if cLableCountis bad, forget about it.
INT iMax;
iMax = p->cLabelCount < DNS_MAX_NAME_LABELS ? p->cLabelCount : 0;
INT i;
for(i=0;i<iMax;i++)
{
Printf( " [%d] 0x%p\n", i, p->pchLabelArray[i] );
}
Printf( " cchLabelArray -- \n" );
iMax = p->cchNameLength < DNS_MAX_NAME_LABELS ? p->cchNameLength : DNS_MAX_NAME_LABELS;
DumpBuffer((LPVOID)RELATIVE_ADDRESS(lpVoid, p, p->cchLabelArray), iMax );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_SID
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_SID)
{
#define MAX_SID_STR_LENGTH 1024
Printf( "SID(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
PSID pSid = (PSID) PushMemory( lpVoid, sizeof(SID) );
CHAR szSid [ MAX_SID_STR_LENGTH ];
DWORD cbSid = GetLengthSid(pSid );
if ( !cbSid ||
!IsValidSid(pSid) )
{
Printf( "Formatting aborted. Invalid SID\n" );
}
else
{
CHAR buffer[ 1024 ];
UCHAR authCount = *GetSidSubAuthorityCount(pSid );
strcpy ( szSid, "S-" );
for (INT i=0; i<(INT)authCount; i++)
{
DWORD dwAuth = *GetSidSubAuthority(pSid,
i );
sprintf( buffer, "%X", dwAuth );
if ( strlen(szSid) + strlen(buffer) > MAX_SID_STR_LENGTH - 5 )
{
strcat ( szSid, "..." );
break;
}
strcat ( szSid, buffer );
if (i < (INT)authCount-1)
{
strcat ( szSid, "-" );
}
}
}
Printf ( "SID = %s\n", szSid );
PopMemory( (PVOID)pSid );
return TRUE;
#undef MAX_SID_STR_LENGTH
}
/*+++
Function : Dump_ADDITIONAL_INFO
Description: dumps out additional message info
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_ADDITIONAL_INFO)
{
Printf( "ADDITIONAL_INFO(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
if(!lpVoid){
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
PADDITIONAL_INFO p = (PADDITIONAL_INFO) PushMemory( lpVoid, sizeof(ADDITIONAL_INFO) );
INT i=0, iMax=0;
Printf( " cMaxCount = 0x%x\n", p->cMaxCount );
Printf( " cCount = 0x%x\n", p->cCount );
Printf( " iIndex = 0x%x\n", p->iIndex );
iMax = p->cCount <= MAX_ADDITIONAL_RECORD_COUNT? p->cCount : MAX_ADDITIONAL_RECORD_COUNT;
PDB_NAME* pnames = (PDB_NAME*) PushMemory(
(LPVOID) RELATIVE_ADDRESS(lpVoid, p, p->pNameArray),
sizeof(PDB_NAME)*iMax );
for(i=0; i<iMax; i++){
Printf( " pNameArray[%d] = 0x%p\n", i, pnames[i] );
}
PopMemory( (PVOID)pnames );
if(i > MAX_TINY_LIST){
Printf( " (truncated)...\n" );
}
WORD* poffsets = (WORD*) PushMemory(
(LPVOID)RELATIVE_ADDRESS(lpVoid, p, p->wOffsetArray),
sizeof(WORD)*iMax );
for(i=0; i<iMax; i++){
Printf( " wOffsetArray[%d] = 0x%x\n", i, poffsets[i] );
}
PopMemory( (PVOID)poffsets );
if(i > MAX_ADDITIONAL_RECORD_COUNT){
Printf( " (truncated)...\n" );
}
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_COMPRESSION_INFO
Description: dumps out additional message info
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_COMPRESSION_INFO)
{
Printf( "COMPRESSION_INFO(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
if(!lpVoid){
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
PCOMPRESSION_INFO p = (PCOMPRESSION_INFO) PushMemory( lpVoid, sizeof(COMPRESSION_INFO) );
INT i=0, iMax=0;
Printf( " cCount = 0x%x\n", p->cCount );
PDB_NODE* pnodes = (PDB_NODE*) PushMemory( (LPVOID)RELATIVE_ADDRESS(lpVoid, p, p->pNodeArray), sizeof(PDB_NODE)*iMax );
iMax = p->cCount <= MAX_COMPRESSION_COUNT? p->cCount : MAX_COMPRESSION_COUNT;
for(i=0; i<iMax; i++){
Printf( " pNodeArray[%d] = 0x%p\n", i, pnodes[i] );
}
PopMemory( (PVOID)pnodes );
if(i > MAX_COMPRESSION_COUNT){
Printf( " (truncated)...\n" );
}
WORD* poffsets = (WORD*) PushMemory( (LPVOID)RELATIVE_ADDRESS(lpVoid, p, p->wOffsetArray), sizeof(WORD)*iMax );
for(i=0; i<iMax; i++){
Printf( " wOffsetArray[%d] = 0x%p\n", i, poffsets[i] );
}
PopMemory( (PVOID)poffsets );
if(i > MAX_COMPRESSION_COUNT){
Printf( " (truncated)...\n" );
}
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_DS_SEARCH
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_DS_SEARCH)
{
// from DS.c
struct _DnsDsEnum
{
PLDAPSearch pSearchBlock; // ldap search result on zone
PLDAPMessage pResultMessage; // current page of message
PLDAPMessage pNodeMessage; // message for current node
PZONE_INFO pZone;
LONGLONG SearchTime;
LONGLONG TombstoneExpireTime;
DWORD dwSearchFlag;
DWORD dwLookupFlag;
DWORD dwHighestVersion;
DWORD dwTotalNodes;
DWORD dwTotalTombstones;
DWORD dwTotalRecords;
#if 0
DWORD dwHighUsnLength;
CHAR szHighUsn[ MAX_USN_LENGTH ]; // largest USN in enum
#endif
CHAR szStartUsn[ MAX_USN_LENGTH ]; // USN at search start
// node record data
PLDAP_BERVAL * ppBerval; // the values in the array
PDB_RECORD pRecords;
DWORD dwRecordCount;
DWORD dwNodeVersion;
DWORD dwTombstoneVersion;
};
Printf( "DS_SEARCH(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
//
// print structure
//
struct _DnsDsEnum *p = (struct _DnsDsEnum*) PushMemory( lpVoid, sizeof(struct _DnsDsEnum) );
Printf( " pSearchBlock = 0x%p\n", p->pSearchBlock );
Printf( " pResultMessage = 0x%p\n", p->pResultMessage );
Printf( " pNodeMessage = 0x%p\n", p->pNodeMessage );
Printf( " pZone = 0x%p\n", p->pZone );
Printf( " SearchTime = 0x%x:0x%x\n", (DWORD)(p->SearchTime>>32), (DWORD)(p->SearchTime & 0x00000000ffffffff) );
Printf( " TombstoneExpireTime = 0x%x:0x%x\n", (DWORD)(p->TombstoneExpireTime>>32),(DWORD)(p->TombstoneExpireTime & 0x00000000ffffffff) );
Printf( " dwSearchFlag = 0x%x\n", p->dwSearchFlag );
Printf( " dwLookupFlag = 0x%x\n", p->dwLookupFlag );
Printf( " dwHighestVersion = 0x%x\n", p->dwHighestVersion );
Printf( " dwTotalNodes = 0x%x\n", p->dwTotalNodes );
Printf( " dwTotalTombstones = 0x%x\n", p->dwTotalTombstones );
Printf( " dwTotalRecords = 0x%x\n", p->dwTotalRecords );
#if 0
Printf( " dwHighUsnLength = 0x%x\n", p->dwHighUsnLength );
Printf( " szHighUsn = 0x%p\n", RELATIVE_ADDRESS(lpVoid, p, p->szHighUsn) );
#endif
Printf( " szStartUsn = 0x%p\n", RELATIVE_ADDRESS(lpVoid, p, p->szStartUsn) );
// node record data
Printf( " ppBerval = 0x%p\n", p->ppBerval );
Printf( " pRecords = 0x%p\n", p->pRecords );
Printf( " dwRecordCount = 0x%x\n", p->dwRecordCount );
Printf( " dwNodeVersion = 0x%x\n", p->dwNodeVersion );
Printf( " dwTombstoneVersion = 0x%x\n", p->dwTombstoneVersion );
PopMemory( (PVOID)p );
return TRUE;
}
/*+++
Function : Dump_Record_SOA
Description:
Parameters :
Return :
Remarks : none.
---*/
DECLARE_DUMPFUNCTION( Dump_Record_SOA)
{
struct SOA
{
PDB_NODE pnodePrimaryServer;
PDB_NODE pnodeZoneAdmin;
DWORD dwSerialNo;
DWORD dwRefresh;
DWORD dwRetry;
DWORD dwExpire;
DWORD dwMinimumTtl;
};
Printf( "DB_RECORD.SOA(0x%p):\n", lpVoid );
if ( !lpVoid )
{
Printf( "Cannot process [%p] pointer\n", lpVoid );
return FALSE;
}
struct SOA *psoa = (struct SOA*) PushMemory( lpVoid, sizeof(struct SOA) );
Printf( " pnodePrimaryServer = 0x%p\n", psoa->pnodePrimaryServer );
Printf( " pnodeZoneAdmin = 0x%p\n", psoa->pnodeZoneAdmin );
Printf( " dwSerialNo = 0x%x\n", psoa->dwSerialNo );
Printf( " dwRefresh = 0x%x\n", psoa->dwRefresh );
Printf( " dwRetry = 0x%x\n", psoa->dwRetry );
Printf( " dwExpire = 0x%x\n", psoa->dwExpire );
Printf( " dwMinimumTtl = 0x%x\n", psoa->dwMinimumTtl );
PopMemory( (PVOID)psoa );
return TRUE;
}
/*++
Routine Description: Dumps the buffer content on to the debugger output.
Arguments:
Buffer: buffer pointer.
BufferSize: size of the buffer.
Return Value: none
Author: borrowed from MikeSw
--*/
VOID DumpBuffer(PVOID Buffer, DWORD BufferSize){
#define DUMPBUFFER_NUM_CHARS 16
DWORD i, limit;
CHAR TextBuffer[DUMPBUFFER_NUM_CHARS + 1];
LPBYTE BufferPtr = (LPBYTE) PushMemory( Buffer, BufferSize );
Printf( "----------------(0x%p)--------------\n", Buffer );
//
// Hex dump of the bytes
//
limit = ((BufferSize - 1) / DUMPBUFFER_NUM_CHARS + 1) * DUMPBUFFER_NUM_CHARS;
for (i = 0; i < limit; i++) {
if (i < BufferSize) {
Printf( "%02x ", BufferPtr[i] );
if (BufferPtr[i] < 31 ) {
TextBuffer[i % DUMPBUFFER_NUM_CHARS] = '.';
} else if (BufferPtr[i] == '\0') {
TextBuffer[i % DUMPBUFFER_NUM_CHARS] = ' ';
} else {
TextBuffer[i % DUMPBUFFER_NUM_CHARS] = (CHAR) BufferPtr[i];
}
} else {
Printf( " " );
TextBuffer[i % DUMPBUFFER_NUM_CHARS] = ' ';
}
if ((i + 1) % DUMPBUFFER_NUM_CHARS == 0) {
TextBuffer[DUMPBUFFER_NUM_CHARS] = 0;
Printf( " %s\n", TextBuffer );
}
}
Printf( "------------------------------------\n" );
PopMemory( (PVOID)BufferPtr );
#define DUMPBUFFER_NUM_CHARS 16
}
#endif // DUMP_CXX