windows-nt/Source/XPSP1/NT/net/tcpip/driver/kdext2/lib/util.c
2020-09-26 16:20:57 +08:00

558 lines
13 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
util.c
Abstract:
Utility dumping functions.
Author:
Scott Holden (sholden) 24-Apr-1999
Revision History:
--*/
#include "tcpipxp.h"
int _Indent = 0;
char IndentBuf[80];
FLAG_INFO FlagsMDL[] =
{
{ MDL_MAPPED_TO_SYSTEM_VA, "MAPPED_TO_SYSTEM_VA" },
{ MDL_PAGES_LOCKED, "PAGES_LOCKED" },
{ MDL_SOURCE_IS_NONPAGED_POOL, "SOURCE_IS_NONPAGED_POOL" },
{ MDL_ALLOCATED_FIXED_SIZE, "ALLOCATED_FIXED_SIZE" },
{ MDL_PARTIAL, "PARTIAL" },
{ MDL_PARTIAL_HAS_BEEN_MAPPED, "PARTIAL_HAS_BEEN_MAPPED" },
{ MDL_IO_PAGE_READ, "IO_PAGE_READ" },
{ MDL_WRITE_OPERATION, "WRITE_OPERATION" },
{ MDL_PARENT_MAPPED_SYSTEM_VA, "PARENT_MAPPED_SYSTEM_VA" },
{ MDL_IO_SPACE, "IO_SPACE" },
{ MDL_NETWORK_HEADER, "NETWORK_HEADER" },
{ MDL_MAPPING_CAN_FAIL, "MAPPING_CAN_FAIL" },
{ MDL_ALLOCATED_MUST_SUCCEED, "ALLOCATED_MUST_SUCCEED" },
{ 0, NULL }
};
FLAG_INFO FlagsTCPConn[] =
{
{ CONN_CLOSING, "CONN_CLOSING" },
{ CONN_DISACC, "CONN_DISACC" },
{ CONN_WINSET, "CONN_WINSET" },
{ CONN_INVALID, "CONN_INVALID" },
{ 0, NULL }
};
FLAG_INFO FlagsLLIPBindInfo[] =
{
{ LIP_COPY_FLAG, "LIP_COPY_FLAG" },
{ LIP_P2P_FLAG, "LIP_P2P_FLAG" },
{ LIP_NOIPADDR_FLAG, "LIP_NOIPADDR_FLAG" },
{ LIP_P2MP_FLAG, "LIP_P2MP_FLAG" },
{ LIP_NOLINKBCST_FLAG, "LIP_NOLINKBCST_FLAG" },
{ 0, NULL }
};
FLAG_INFO FlagsTsr[] =
{
{ TSR_FLAG_URG, "TSR_FLAG_URG" },
{ TSR_FLAG_SEND_AND_DISC, "TSR_FLAG_SEND_AND_DISC" },
{ 0, NULL }
};
FLAG_INFO FlagsNTE[] =
{
{ NTE_VALID, "NTE_Valid" },
{ NTE_COPY, "NTE_Copy" },
{ NTE_PRIMARY, "NTE_Primary" },
{ NTE_ACTIVE, "NTE_Active" },
{ NTE_DYNAMIC, "NTE_Dynamic" },
{ NTE_DHCP, "NTE_DHCP" },
{ NTE_DISCONNECTED, "NTE_Disconnected" },
{ NTE_TIMER_STARTED, "NTE_TimerStarted" },
{ NTE_IF_DELETING, "NTE_IF_Deleting" },
{ 0, NULL }
};
FLAG_INFO FlagsIF[] =
{
{ IF_FLAGS_P2P, "IF_P2P" },
{ IF_FLAGS_DELETING, "IF_DELETING" },
{ IF_FLAGS_NOIPADDR, "IF_NOIPADDR" },
{ IF_FLAGS_P2MP, "IF_P2MP" },
{ IF_FLAGS_REMOVING_POWER, "IF_REMOVING_POWER" },
{ IF_FLAGS_POWER_DOWN, "IF_POWER_DOWN" },
{ IF_FLAGS_REMOVING_DEVICE, "IF_REMOVING_DEVICE" },
{ IF_FLAGS_NOLINKBCST, "IF_NOLINKBCST" },
{ IF_FLAGS_UNI, "IF_UNI" },
{ IF_FLAGS_MEDIASENSE, "IF_MEDIASENSE" },
{ 0, NULL }
};
FLAG_INFO FlagsRCE[] =
{
{ RCE_VALID, "RCE_Valid" },
{ RCE_CONNECTED, "RCE_Connected" },
{ RCE_REFERENCED, "RCE_Referenced" },
{ RCE_DEADGW, "RCE_Deadgw" },
{ 0, NULL }
};
FLAG_INFO FlagsRTE[] =
{
{ RTE_VALID, "RTE_Valid" },
{ RTE_INCREASE, "RTE_Increase" },
{ RTE_IF_VALID, "RTE_If_Valid" },
{ RTE_DEADGW, "RTE_DeadGW" },
{ RTE_NEW, "RTE_New" },
{ 0, NULL }
};
FLAG_INFO FlagsTcb[] =
{
{ WINDOW_SET, "Window_Set" },
{ CLIENT_OPTIONS, "Client_Options" },
{ CONN_ACCEPTED, "Connection_Accepted" },
{ ACTIVE_OPEN, "Active_Open" },
{ DISC_NOTIFIED, "Disc_Notified" },
{ IN_DELAY_Q, "In_Delay_Q" },
{ RCV_CMPLTING, "Receives_Completing" },
{ IN_RCV_IND, "In_Receive_Indication" },
{ NEED_RCV_CMPLT, "Need_To_Have_Rcvs_Completed" },
{ NEED_ACK, "Need_To_Send_Ack" },
{ NEED_OUTPUT, "Need_To_Output" },
{ ACK_DELAYED, "Delayed_Ack" },
{ PMTU_BH_PROBE, "PMTU_BH_Probe" },
{ BSD_URGENT, "BSD_Urgent" },
{ IN_DELIV_URG, "In_Deliver_Urgent" },
{ URG_VALID, "Urgent_Valid" },
{ FIN_NEEDED, "Fin_Needed" },
{ NAGLING, "Nagling" },
{ IN_TCP_SEND, "In_Tcp_Send" },
{ FLOW_CNTLD, "Flow_Controlled" },
{ DISC_PENDING, "Disconnect_Pending" },
{ TW_PENDING, "Timed_Wait_Pending" },
{ FORCE_OUTPUT, "Force_Output" },
{ SEND_AFTER_RCV, "Send_After_Receive" },
{ GC_PENDING, "Graceful_Close_Pending" },
{ KEEPALIVE, "KeepAlive" },
{ URG_INLINE, "Urgent_Inline" },
{ FIN_OUTSTANDING, "Fin_Outstanding" },
{ FIN_SENT, "Fin_Sent" },
{ NEED_RST, "Need_Rst" },
{ IN_TCB_TABLE, "In_Tcb_Table" },
{ IN_TWTCB_TABLE, "IN_TWTCB_TABLE" },
{ IN_TWQUEUE, "IN_TWQUEUE" },
{ 0, NULL }
};
FLAG_INFO FlagsTCPHeader[] =
{
{ TCP_FLAG_FIN, "FIN" },
{ TCP_FLAG_SYN, "SYN" },
{ TCP_FLAG_RST, "RST" },
{ TCP_FLAG_PUSH, "PSH" },
{ TCP_FLAG_ACK, "ACK" },
{ TCP_FLAG_URG, "URG" },
{ 0, NULL }
};
FLAG_INFO FlagsFastChk[] =
{
{ TCP_FLAG_SLOW, "Need_Slow_Path" },
{ TCP_FLAG_IN_RCV, "In_Receive_Path" },
{ TCP_FLAG_FASTREC, "FastXmit_In_Progress" },
{ 0, NULL }
};
FLAG_INFO FlagsAO[] =
{
{ AO_RAW_FLAG, "Raw" },
{ AO_DHCP_FLAG, "DHCP" },
{ AO_VALID_FLAG, "Valid" },
{ AO_BUSY_FLAG, "Busy" },
{ AO_OOR_FLAG, "Out_of_Resources" },
{ AO_QUEUED_FLAG, "On_PendingQ" },
{ AO_XSUM_FLAG, "Use_Xsums" },
{ AO_SEND_FLAG, "Send_Pending" },
{ AO_OPTIONS_FLAG, "Option_Set_Pending" },
{ AO_DELETE_FLAG, "Delete_Pending" },
{ AO_BROADCAST_FLAG,"BCast_Enabled" },
{ AO_CONNUDP_FLAG, "Connected_UDP" },
{ 0, NULL }
};
ENUM_INFO StateTcb[] =
{
{ TCB_CLOSED, "Closed" },
{ TCB_LISTEN, "Listening" },
{ TCB_SYN_SENT, "Syn_Sent" },
{ TCB_SYN_RCVD, "Syn_Received" },
{ TCB_ESTAB, "Established" },
{ TCB_FIN_WAIT1, "Fin_Wait_1" },
{ TCB_FIN_WAIT2, "Fin_Wait_2" },
{ TCB_CLOSE_WAIT, "Close_Wait" },
{ TCB_CLOSING, "Closing" },
{ TCB_LAST_ACK, "Last_Ack" },
{ TCB_TIME_WAIT, "Time_Wait" },
{ 0, NULL }
};
ENUM_INFO CloseReason[] =
{
{ TCB_CLOSE_RST, "RST_Received" },
{ TCB_CLOSE_ABORTED, "Local_Abort" },
{ TCB_CLOSE_TIMEOUT, "Timed_Out" },
{ TCB_CLOSE_REFUSED, "Refused" },
{ TCB_CLOSE_UNREACH, "Dest_Unreachable" },
{ TCB_CLOSE_SUCCESS, "Sucessful_Close" },
{ 0, NULL }
};
ENUM_INFO FsContext2[] =
{
{ TDI_TRANSPORT_ADDRESS_FILE, "Transport_Address" },
{ TDI_CONNECTION_FILE, "Connection" },
{ TDI_CONTROL_CHANNEL_FILE, "Control_Channel" },
{ 0, NULL }
};
ENUM_INFO Prot[] =
{
{ PROTOCOL_UDP, "Udp" },
{ PROTOCOL_TCP, "Tcp" },
{ PROTOCOL_RAW, "Raw" },
{ 0, NULL }
};
ENUM_INFO NdisMediumsEnum[] =
{
{ NdisMedium802_3, "802.3" },
{ NdisMedium802_5, "802.5" },
{ NdisMediumFddi, "Fddi" },
{ NdisMediumWan, "Wan" },
{ NdisMediumLocalTalk, "LocalTalk" },
{ NdisMediumDix, "Dix" },
{ NdisMediumArcnetRaw, "ArcnetRaw" },
{ NdisMediumArcnet878_2, "Arcnet878_2" },
{ NdisMediumAtm, "Atm" },
{ NdisMediumWirelessWan, "WirelessWan" },
{ NdisMediumIrda, "Irda" },
{ NdisMediumBpc, "Bpc" },
{ NdisMediumCoWan, "CoWan" },
{ NdisMedium1394, "1394" },
{ NdisMediumMax, "???" },
{ 0, NULL }
};
ENUM_INFO AteState[] =
{
{ ARP_RESOLVING_LOCAL, "ARP_RESOLVING_LOCAL"},
{ ARP_RESOLVING_GLOBAL, "ARP_RESOLVING_GLOBAL"},
{ ARP_GOOD, "ARP_GOOD"},
{ ARP_BAD, "ARP_BAD"},
{ 0, NULL }
};
VOID
DumpIPAddr(
IPAddr Address
)
{
uchar IPAddrBuffer[(sizeof(IPAddr) * 4)];
uint i;
uint IPAddrCharCount;
//
// Convert the IP address into a string.
//
IPAddrCharCount = 0;
for (i = 0; i < sizeof(IPAddr); i++) {
uint CurrentByte;
CurrentByte = Address & 0xff;
if (CurrentByte > 99) {
IPAddrBuffer[IPAddrCharCount++] = (CurrentByte / 100) + '0';
CurrentByte %= 100;
IPAddrBuffer[IPAddrCharCount++] = (CurrentByte / 10) + '0';
CurrentByte %= 10;
} else if (CurrentByte > 9) {
IPAddrBuffer[IPAddrCharCount++] = (CurrentByte / 10) + '0';
CurrentByte %= 10;
}
IPAddrBuffer[IPAddrCharCount++] = CurrentByte + '0';
if (i != (sizeof(IPAddr) - 1))
IPAddrBuffer[IPAddrCharCount++] = '.';
Address >>= 8;
}
IPAddrBuffer[IPAddrCharCount] = '\0';
printx("%-15s", IPAddrBuffer);
}
VOID
DumpPtrSymbol(
PVOID pvSymbol
)
{
UCHAR SymbolName[ 80 ];
ULONG Displacement = 0;
printx("%-10lx", pvSymbol );
#if !MILLENKD
GetSymbol(pvSymbol, SymbolName, &Displacement);
#endif // !MILLENKD
if (Displacement == 0)
{
#if MILLENKD
printx(" (%pS + 0x%pX)", pvSymbol, pvSymbol);
#else // MILLENKD
printx(" (%s)", SymbolName);
#endif // !MILLENKD
}
else
{
printx(" (%s + 0x%X)", SymbolName, Displacement);
}
}
VOID
DumpFlags(
ULONG flags,
PFLAG_INFO pFlagInfo
)
{
BOOL fFound = FALSE;
while (pFlagInfo->pszDescription != NULL)
{
if (pFlagInfo->Value & flags)
{
if (fFound)
{
printx(" | ");
}
fFound = TRUE;
dprintf("%.20s", pFlagInfo->pszDescription);
}
pFlagInfo++;
}
return;
}
VOID
DumpEnum(
ULONG Value,
PENUM_INFO pEnumInfo
)
{
while (pEnumInfo->pszDescription != NULL)
{
if (pEnumInfo->Value == Value)
{
dprintf("%.40s", pEnumInfo->pszDescription);
return;
}
pEnumInfo++;
}
dprintf( "Unknown enumeration value." );
return;
}
BOOL
DumpCTEEvent(
CTEEvent *pCe
)
{
PrintStartStruct();
Print_uint(pCe, ce_scheduled);
Print_CTELock(pCe, ce_lock);
Print_PtrSymbol(pCe, ce_handler);
Print_ptr(pCe, ce_arg);
Print_WORK_QUEUE_ITEM(pCe, ce_workitem);
PrintEndStruct();
return (TRUE);
}
BOOL
DumpKEVENT(
KEVENT *pKe
)
{
PrintStartStruct();
Print_uchar(pKe, Header.Type);
Print_uchar(pKe, Header.Absolute);
Print_uchar(pKe, Header.Size);
Print_uchar(pKe, Header.Inserted);
Print_ULONGhex(pKe, Header.SignalState);
Print_LL(pKe, Header.WaitListHead);
PrintEndStruct();
return (TRUE);
}
BOOL
DumpWORK_QUEUE_ITEM(
WORK_QUEUE_ITEM *pWqi
)
{
PrintStartStruct();
Print_LL(pWqi, List);
Print_PtrSymbol(pWqi, WorkerRoutine);
Print_ptr(pWqi, Parameter);
PrintEndStruct();
return (TRUE);
}
BOOL
DumpSHARE_ACCESS(
SHARE_ACCESS *pSa
)
{
PrintStartStruct();
Print_ULONG(pSa, OpenCount);
Print_ULONG(pSa, Readers);
Print_ULONG(pSa, Writers);
Print_ULONG(pSa, Deleters);
Print_ULONG(pSa, SharedRead);
Print_ULONG(pSa, SharedWrite);
Print_ULONG(pSa, SharedDelete);
PrintEndStruct();
return (TRUE);
}
BOOL
DumpCTETimer(
CTETimer *pCt
)
{
PrintStartStruct();
Print_uint(pCt, t_running);
Print_Lock(pCt, t_lock);
Print_PtrSymbol(pCt, t_handler);
Print_ptr(pCt, t_arg);
PrintEndStruct();
return (TRUE);
}
BOOL
DumpNDIS_STRING(
NDIS_STRING *pNs
)
{
PrintStartStruct();
Print_ushort(pNs, Length);
Print_ushort(pNs, MaximumLength);
Print_ptr(pNs, Buffer);
PrintEndStruct();
return (TRUE);
}
BOOL
DumpMDL(
MDL *pMdl,
ULONG_PTR MdlAddr,
VERB verb
)
{
if (verb == VERB_MAX)
{
PrintStartNamedStruct(MDL, MdlAddr);
Print_ptr(pMdl, Next);
Print_short(pMdl, Size);
//Print_ushorthex(pMdl, MdlFlags);
Print_flags(pMdl, MdlFlags, FlagsMDL);
Print_ptr(pMdl, Process);
Print_ptr(pMdl, MappedSystemVa);
Print_ptr(pMdl, StartVa);
Print_ULONG(pMdl, ByteCount);
Print_ULONG(pMdl, ByteOffset);
PrintEndStruct();
}
else if (verb == VERB_MED)
{
printx("MDL %x va %x cb %d (",
MdlAddr, pMdl->MappedSystemVa, pMdl->ByteCount);
DumpFlags(pMdl->MdlFlags, FlagsMDL);
printx(")" ENDL);
}
else
{
printx("MDL %x va %x cb %d" ENDL,
MdlAddr, pMdl->MappedSystemVa, pMdl->ByteCount);
}
return (TRUE);
}
BOOL
DumpNPAGED_LOOKASIDE_LIST(
PNPAGED_LOOKASIDE_LIST pPpl,
ULONG_PTR PplAddr,
VERB verb
)
{
PrintStartNamedStruct(PPL, PplAddr);
Print_ptr(pPpl, L.ListHead.Next.Next);
Print_USHORT(pPpl, L.ListHead.Depth);
Print_USHORT(pPpl, L.ListHead.Sequence);
Print_USHORT(pPpl, L.Depth);
Print_USHORT(pPpl, L.MaximumDepth);
Print_ULONG(pPpl, L.TotalAllocates);
Print_ULONG(pPpl, L.AllocateMisses);
Print_ULONG(pPpl, L.TotalFrees);
Print_ULONG(pPpl, L.FreeMisses);
Print_ULONG(pPpl, L.Type);
Print_Tag(pPpl, L.Tag);
Print_ULONG(pPpl, L.Size);
Print_PtrSymbol(pPpl, L.Allocate);
Print_PtrSymbol(pPpl, L.Free);
Print_LL(pPpl, L.ListEntry);
Print_ULONG(pPpl, L.LastTotalAllocates);
Print_ULONG(pPpl, L.LastAllocateMisses);
PrintEndStruct();
return (TRUE);
}