📄 e100kd.c
字号:
/*
NOTE: Debugger extensions should be compiled with the headers that match the debugger
you will use.
You can install the latest debugger package from http://www.microsoft.com/ddk/debugging
and the debugger has more up to date samples of various debugger extensions to which you
can refer when you write debugger extensions.
*/
// This is a 64 bit aware debugger extension
#define KDEXT_64BIT
#include <windows.h>
#include <wdbgexts.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "e100_equ.h"
#include "e100_557.h"
#include "mp_cmn.h"
#include "e100kd.h"
WINDBG_EXTENSION_APIS ExtensionApis;
EXT_API_VERSION ApiVersion = { 5, 0, EXT_API_VERSION_NUMBER64, 0};
USHORT SavedMajorVersion;
USHORT SavedMinorVersion;
BOOL ChkTarget; // is debuggee a CHK build?
typedef struct
{
char Name[16];
unsigned int Val;
} DBG_LEVEL;
DBG_LEVEL DbgLevel[] = {
{"ERROR", MP_ERROR},
{"WARN", MP_WARN},
{"TRACE", MP_TRACE},
{"INFO", MP_INFO},
{"LOUD", MP_LOUD}
};
typedef struct
{
char Name[32];
unsigned int Val;
} DBG_ADAPTER_FLAGS, DBG_FILTER;
DBG_ADAPTER_FLAGS DbgAdapterFlags[] = {
{"SCATTER_GATHER", fMP_ADAPTER_SCATTER_GATHER},
{"RECV_LOOKASIDE", fMP_ADAPTER_RECV_LOOKASIDE},
{"INTERRUPT_IN_USE", fMP_ADAPTER_INTERRUPT_IN_USE},
{"RESET_IN_PROGRESS", fMP_ADAPTER_RESET_IN_PROGRESS},
{"NO_CABLE", fMP_ADAPTER_NO_CABLE},
{"HARDWARE_ERROR", fMP_ADAPTER_HARDWARE_ERROR}
};
//
// Ndis Packet Filter Bits (OID_GEN_CURRENT_PACKET_FILTER).
//
#define NDIS_PACKET_TYPE_DIRECTED 0x00000001
#define NDIS_PACKET_TYPE_MULTICAST 0x00000002
#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004
#define NDIS_PACKET_TYPE_BROADCAST 0x00000008
#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010
#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020
#define NDIS_PACKET_TYPE_SMT 0x00000040
#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080
#define NDIS_PACKET_TYPE_GROUP 0x00001000
#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000
#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00004000
#define NDIS_PACKET_TYPE_MAC_FRAME 0x00008000
DBG_FILTER DbgFilterTable[] = {
{"DIRECTED", NDIS_PACKET_TYPE_DIRECTED},
{"MULTICAST", NDIS_PACKET_TYPE_MULTICAST},
{"ALL_MULTICAST", NDIS_PACKET_TYPE_ALL_MULTICAST},
{"BROADCAST", NDIS_PACKET_TYPE_BROADCAST},
{"SOURCE_ROUTING", NDIS_PACKET_TYPE_SOURCE_ROUTING},
{"PROMISCUOUS", NDIS_PACKET_TYPE_PROMISCUOUS},
{"SMT", NDIS_PACKET_TYPE_SMT},
{"ALL_LOCAL", NDIS_PACKET_TYPE_ALL_LOCAL},
{"GROUP", NDIS_PACKET_TYPE_GROUP},
{"ALL_FUNCTIONAL", NDIS_PACKET_TYPE_ALL_FUNCTIONAL},
{"FUNCTIONAL", NDIS_PACKET_TYPE_FUNCTIONAL},
{"MAC_FRAME", NDIS_PACKET_TYPE_MAC_FRAME}
};
typedef struct
{
char Name[32];
USHORT Val;
} DBG_RFD_STATUS, DBG_RFD_COMMAND, DBG_USHORT_BITS, DBG_USHORT_VALUE;
typedef struct
{
char Name[32];
UCHAR Val;
} DBG_UCHAR_BITS, DBG_UCHAR_VALUE;
DBG_RFD_STATUS DbgRfdStatus[] = {
{"COMPLETE", RFD_STATUS_COMPLETE},
{"OK", RFD_STATUS_OK},
{"CRC_ERROR", RFD_CRC_ERROR},
{"ALIGNMENT_ERROR", RFD_ALIGNMENT_ERROR},
{"NO_RESOURCES", RFD_NO_RESOURCES},
{"DMA_OVERRUN", RFD_DMA_OVERRUN},
{"FRAME_TOO_SHORT", RFD_FRAME_TOO_SHORT},
{"RX_ERR", RFD_RX_ERR},
{"IA_MATCH", RFD_IA_MATCH},
{"RECEIVE_COLLISION", RFD_RECEIVE_COLLISION},
};
DBG_RFD_COMMAND DbgRfdCommand[] = {
{"EL", RFD_EL_BIT},
{"S", RFD_S_BIT},
{"H", RFD_H_BIT},
{"SF", RFD_SF_BIT}
};
DBG_USHORT_BITS DbgCbCommandBits[] = {
{"EL", CB_EL_BIT},
{"S", CB_S_BIT},
{"I", CB_I_BIT},
{"TX_SF", CB_TX_SF_BIT}
};
DBG_USHORT_VALUE DbgCbCommands[] = {
{"CB_NOP", CB_NOP},
{"CB_IA_ADDRESS", CB_IA_ADDRESS},
{"CB_CONFIGURE", CB_CONFIGURE},
{"CB_MULTICAST", CB_MULTICAST},
{"CB_TRANSMIT", CB_TRANSMIT},
{"CB_LOAD_MICROCODE", CB_LOAD_MICROCODE},
{"CB_DUMP", CB_DUMP},
{"CB_DIAGNOSE", CB_DIAGNOSE}
};
DBG_USHORT_VALUE DbgScbStatusRus[] = {
{"IDLE", SCB_RUS_IDLE},
{"SUSPEND", SCB_RUS_SUSPEND},
{"NO_RESOURCES", SCB_RUS_NO_RESOURCES},
{"READY", SCB_RUS_READY},
{"SUSP_NO_RBDS", SCB_RUS_SUSP_NO_RBDS},
{"NO_RBDS", SCB_RUS_NO_RBDS},
{"READY_NO_RBDS", SCB_RUS_READY_NO_RBDS},
};
DBG_USHORT_BITS DbgScbStatusBits[] = {
{"CX", SCB_STATUS_CX},
{"FR", SCB_STATUS_FR},
{"CNA", SCB_STATUS_CNA},
{"RNR", SCB_STATUS_RNR},
{"MDI", SCB_STATUS_MDI},
{"SWI", SCB_STATUS_SWI}
};
DBG_UCHAR_VALUE DbgScbCommandCuc[] = {
{"START", SCB_CUC_START},
{"RESUME", SCB_CUC_RESUME},
{"DUMP_ADDR", SCB_CUC_DUMP_ADDR},
{"DUMP_STAT", SCB_CUC_DUMP_STAT},
{"LOAD_BASE", SCB_CUC_LOAD_BASE},
{"DUMP_RST_STAT", SCB_CUC_DUMP_RST_STAT},
{"STATIC_RESUME", SCB_CUC_STATIC_RESUME}
};
DBG_UCHAR_VALUE DbgScbCommandRuc[] = {
{"START", SCB_RUC_START},
{"RESUME", SCB_RUC_RESUME},
{"ABORT", SCB_RUC_ABORT},
{"LOAD_HDS", SCB_RUC_LOAD_HDS},
{"LOAD_BASE", SCB_RUC_LOAD_BASE},
{"RBD_RESUME", SCB_RUC_RBD_RESUME}
};
VOID WinDbgExtensionDllInit(
PWINDBG_EXTENSION_APIS64 lpExtensionApis,
USHORT MajorVersion,
USHORT MinorVersion
)
{
ExtensionApis = *lpExtensionApis;
SavedMajorVersion = MajorVersion;
SavedMinorVersion = MinorVersion;
ChkTarget = SavedMajorVersion == 0x0c ? TRUE : FALSE;
}
LPEXT_API_VERSION ExtensionApiVersion(VOID)
{
return &ApiVersion;
}
VOID CheckVersion(VOID)
{
//
// for now don't bother to version check
//
return;
}
DECLARE_API( help )
{
int i;
dprintf("E100 extensions:\n");
dprintf(" dbglevel dump debug level\n");
dprintf(" mpadapter <MP_ADAPTER> <verbosity>> dump MP_ADAPTER block\n");
dprintf(" csr <CSRAddress> dump CSR block\n");
dprintf(" sendlist <CurrSendHead> <verbosity> dump send list\n");
dprintf(" mptcb <MP_TCB> dump MP_TCB block\n");
dprintf(" hwtcb <HW_TCB> dump HW_TCB block\n");
dprintf(" sendqueue <SendWaitQueue> dump queued send packets\n");
dprintf(" recvlist <RecvList> <verbosity> dump receive list\n");
dprintf(" mprfd <MP_RFD> dump MP_RFD block\n");
dprintf(" hwrfd <HW_RFD> dump HW_RFD block\n");
dprintf(" recvpendlist <RecvPendList> dump pending indicated rx packets\n");
}
DECLARE_API(dbglevel)
{
ULONG64 debugLevelPtr;
ULONG debugLevel, NewLevel;
ULONG64 Val;
int i;
ULONG Bytes;
debugLevelPtr = GetExpression("e100bnt5!MPDebugLevel");
if(debugLevelPtr == 0)
{
dprintf("Error retrieving address of MPDebugLevel\n");
dprintf("Target is %s\n", ChkTarget ? "Checked" : "Free");
}
dprintf("MPDebugLevel @ %p\n", debugLevelPtr);
debugLevel = GetUlongFromAddress(debugLevelPtr);
dprintf("Current MPDebugLevel = %d", debugLevel);
for(i = 0; i < sizeof(DbgLevel)/sizeof(DBG_LEVEL); i++)
{
if(debugLevel == DbgLevel[i].Val)
{
dprintf(" - %s", DbgLevel[i].Name);
break;
}
}
dprintf("\n");
dprintf("Available settings: ");
for(i = 0; i < sizeof(DbgLevel)/sizeof(DBG_LEVEL); i++)
{
if(debugLevel != DbgLevel[i].Val)
{
dprintf("%d-%s ", DbgLevel[i].Val, DbgLevel[i].Name);
}
}
dprintf("\n");
if(!*args)
{
return;
}
i = sscanf(args, "%lx", &NewLevel);
if(i == 1)
{
for(i = 0; i < sizeof(DbgLevel)/sizeof(DBG_LEVEL); i++)
{
if(NewLevel == DbgLevel[i].Val)
{
if(NewLevel != debugLevel)
{
dprintf("New MPDebugLevel = %d\n", NewLevel);
WriteMemory(debugLevelPtr, &NewLevel, sizeof(ULONG), &Bytes);
}
break;
}
}
}
}
DECLARE_API(version)
{
#if DBG
PCSTR kind = "Checked";
#else
PCSTR kind = "Free";
#endif
dprintf("%s E100 Extension dll on a %s system\n",
kind, ChkTarget? "Checked" : "Free");
}
#define MAX_FLAGS_PER_LINE 4
#define MAC_ADDRESS_LENGTH 6
DECLARE_API(mpadapter)
{
ULONG64 pAdapter;
int ArgCount = 0;
ULONG i, j;
ULONG Flags;
ULONG PacketFilter;
ULONG Off;
UCHAR MacAddress[MAC_ADDRESS_LENGTH];
UINT MCAddressCount;
PUCHAR pBuffer;
if(*args)
{
ArgCount = sscanf(args,"%I64lx",&pAdapter);
}
//check for arguments
if(ArgCount < 1)
{
dprintf("Usage: mpadapter <pointer to MP_ADAPTER>\n");
return ;
}
dprintf(" pAdapter %p : \n", pAdapter);
InitTypeRead(pAdapter, MP_ADAPTER);
dprintf(" AdapterHandle : %p\n", ReadField(AdapterHandle));
Flags = (ULONG) ReadField(Flags);
dprintf(" Flags : 0x%08x\n", Flags);
j = 0;
for(i = 0; i < sizeof(DbgAdapterFlags)/sizeof(DBG_ADAPTER_FLAGS); i++)
{
if(Flags & DbgAdapterFlags[i].Val)
{
if(j == 0)
{
dprintf(" ");
}
dprintf("%s", DbgAdapterFlags[i].Name);
j++;
if(j != MAX_FLAGS_PER_LINE)
{
dprintf(", ");
}
else
{
dprintf("\n");
j = 0;
}
}
}
if(j != 0)
{
dprintf("\n");
}
if(!GetFieldOffset("MP_ADAPTER", "PermanentAddress", &Off))
{
if(GetData(MacAddress, pAdapter+Off, MAC_ADDRESS_LENGTH, "PermanentAddress[]"))
{
dprintf(" Permanent address : %02x-%02x-%02x-%02x-%02x-%02x\n",
MacAddress[0], MacAddress[1],
MacAddress[2], MacAddress[3],
MacAddress[4], MacAddress[5]);
}
}
if((BOOLEAN) ReadField(OverrideAddress))
{
if(!GetFieldOffset("MP_ADAPTER", "CurrentAddress", &Off))
{
if(GetData(MacAddress, pAdapter+Off, MAC_ADDRESS_LENGTH, "CurrentAddress[]"))
{
dprintf(" Current address : %02x-%02x-%02x-%02x-%02x-%02x\n",
MacAddress[0], MacAddress[1],
MacAddress[2], MacAddress[3],
MacAddress[4], MacAddress[5]);
}
}
}
else
{
dprintf(" Current address : same as above\n");
}
dprintf("\n");
dprintf(" --- SEND ---\n");
dprintf(" CurrSendHead = %p , CurrSendTail = %p , nBusySend = %d\n",
ReadField(CurrSendHead), ReadField(CurrSendTail), (LONG)ReadField(nBusySend));
dprintf(" SendWaitQueue Head = %p, Tail = %p\n",
ReadField(SendWaitQueue.Head), ReadField(SendWaitQueue.Tail));
dprintf(" NumTcb = %d, RegNumTcb = %d, NumBuffers = %d\n",
(LONG)ReadField(NumTcb), (LONG)ReadField(RegNumTcb), (LONG)ReadField(NumBuffers));
dprintf(" MpTcbMem = %p\n", ReadField(MpTcbMem));
dprintf(" TransmitIdle = %s, ResumeWait = %s\n",
(BOOLEAN)ReadField(TransmitIdle) ? "TRUE" : "FALSE",
(BOOLEAN)ReadField(ResumeWait) ? "TRUE" : "FALSE");
dprintf(" SendBufferPool = %p\n", ReadField(SendBufferPool));
dprintf("\n");
dprintf(" --- RECV ---\n");
if(!GetFieldOffset("MP_ADAPTER", "RecvList", &Off))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -