📄 parse.c
字号:
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
parse.c
Abstract:
execution of debugger commands
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
19-Aug-1998: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
#include "pci_ids.h"
///////////////////////////////////////////////////
// GLOBALS
ULONG ValueTrue=1,ValueFalse=0;
ULONG ulLastDisassStartAddress=0,ulLastDisassEndAddress=0,ulLastInvertedAddress=0;
USHORT gCurrentSelector=0;
ULONG gCurrentOffset=0;
LONG ulCurrentlyDisplayedLineNumber=0;
USHORT usOldDisasmSegment = 0;
ULONG ulOldDisasmOffset = 0;
static ULONG ulCountForWaitKey = 0;
extern PDEBUG_MODULE pdebug_module_head;
extern PDEBUG_MODULE pdebug_module_tail;
//extern unsigned long sys_call_table[];
BOOLEAN (*DisplayMemory)(PARGS) = DisplayMemoryDword;
char szCurrentFile[256]="";
PDEBUG_MODULE pCurrentMod=NULL;
PICE_SYMBOLFILE_HEADER* pCurrentSymbols=NULL;
// suppresses passing on of function keys while stepping code
BOOLEAN bStepping = FALSE;
BOOLEAN bInt3Here = TRUE;
BOOLEAN bInt1Here = TRUE;
KEYWORDS RegKeyWords[]={
{"eax",&CurrentEAX,sizeof(ULONG)},
{"ebx",&CurrentEBX,sizeof(ULONG)},
{"ecx",&CurrentECX,sizeof(ULONG)},
{"edx",&CurrentEDX,sizeof(ULONG)},
{"edi",&CurrentEDI,sizeof(ULONG)},
{"esi",&CurrentESI,sizeof(ULONG)},
{"ebp",&CurrentEBP,sizeof(ULONG)},
{"esp",&CurrentESP,sizeof(ULONG)},
{"eip",&CurrentEIP,sizeof(ULONG)},
{NULL,0,0}
};
KEYWORDS SelectorRegKeyWords[]={
{"cs",&CurrentCS,sizeof(USHORT)},
{"ds",&CurrentDS,sizeof(USHORT)},
{"es",&CurrentES,sizeof(USHORT)},
{"fs",&CurrentFS,sizeof(USHORT)},
{"gs",&CurrentGS,sizeof(USHORT)},
{"ss",&CurrentSS,sizeof(USHORT)},
{NULL,0,0}
};
KEYWORDS OnOffKeyWords[]={
{"on",&ValueTrue,sizeof(ULONG)},
{"off",&ValueFalse,sizeof(ULONG)},
{NULL,0,0}
};
KEYWORDS SpecialKeyWords[]={
{"process",&CurrentProcess,sizeof(ULONG)},
{NULL,0,0}
};
LPSTR LocalVarRegs[]=
{
"EAX",
"ECX",
"EDX",
"EBX",
"ESP",
"EBP",
"ESI",
"EDI",
"EIP",
"EFL",
"CS",
"SS",
"DS",
"ES",
"FS",
"GS"
};
#define COMMAND_HAS_NO_PARAMS (0)
#define COMMAND_HAS_PARAMS (1<<0)
#define COMMAND_HAS_SWITCHES (1<<1)
//
#define PARAM_CAN_BE_SYMBOLIC (1<<0)
#define PARAM_CAN_BE_SEG_OFFSET (1<<1)
#define PARAM_CAN_BE_MODULE (1<<2)
#define PARAM_CAN_BE_PRNAME (1<<3)
#define PARAM_CAN_BE_PID (1<<4)
#define PARAM_CAN_BE_SRC_FILE (1<<5)
#define PARAM_CAN_BE_NUMERIC (1<<6)
#define PARAM_CAN_BE_REG_KEYWORD (1<<7)
#define PARAM_CAN_BE_ONOFF_KEYWORD (1<<8)
#define PARAM_CAN_BE_SPECIAL_KEYWORD (1<<9)
#define PARAM_CAN_BE_ASTERISK (1<<10)
#define PARAM_CAN_BE_ONOFF (1<<11)
#define PARAM_CAN_BE_VIRTUAL_SYMBOLIC (1<<12)
#define PARAM_CAN_BE_SRCLINE (1<<13)
#define PARAM_CAN_BE_PARTIAL_SYM_NAME (1<<14)
#define PARAM_CAN_BE_ANY_STRING (1<<15)
#define PARAM_CAN_BE_DECIMAL (1<<16)
#define PARAM_CAN_BE_SIZE_DESC (1<<17)
#define PARAM_CAN_BE_LETTER (1<<18)
//
#define COMMAND_GROUP_HELP (0)
#define COMMAND_GROUP_FLOW (1)
#define COMMAND_GROUP_STRUCT (2)
#define COMMAND_GROUP_OS (3)
#define COMMAND_GROUP_MEM (4)
#define COMMAND_GROUP_BREAKPOINT (5)
#define COMMAND_GROUP_WINDOW (6)
#define COMMAND_GROUP_DEBUG (7)
#define COMMAND_GROUP_INFO (8)
#define COMMAND_GROUP_STATE (9)
#define COMMAND_GROUP_HELP_ONLY (10)
#define COMMAND_GROUP_LAST (11)
LPSTR CommandGroups[]=
{
"HELP",
"FLOW CONTROL",
"STRUCTURES",
"OS SPECIFIC",
"MEMORY",
"BREAKPOINTS",
"WINDOW",
"DEBUGGING",
"INFORMATION",
"STATE",
"EDITOR",
NULL
};
// table of command handlers
CMDTABLE CmdTable[]={
{"gdt",ShowGdt,"display current global descriptor table" ,0,{0,0,0,0,0},"",COMMAND_GROUP_STRUCT},
{"idt",ShowIdt,"display current interrupt descriptor table" ,0,{0,0,0,0,0},"",COMMAND_GROUP_STRUCT},
{"x",LeaveIce,"return to Reactos" ,0,{0,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"t",SingleStep,"single step one instruction" ,0,{0,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"vma",ShowVirtualMemory,"displays VMAs" ,0,{0,0,0,0,0},"",COMMAND_GROUP_OS},
{"h",ShowHelp,"list help on commands" ,0,{0,0,0,0,0},"",COMMAND_GROUP_HELP},
{"page",ShowPageDirs,"dump page directories" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC|PARAM_CAN_BE_REG_KEYWORD,0,0,0,0},"",COMMAND_GROUP_STRUCT},
{"proc",ShowProcesses,"list all processes" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_PRNAME|PARAM_CAN_BE_PID,0,0,0,0},"",COMMAND_GROUP_OS},
{"dd",DisplayMemoryDword,"display dword memory" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC|PARAM_CAN_BE_SYMBOLIC|PARAM_CAN_BE_REG_KEYWORD,0,0,0,0},"",COMMAND_GROUP_MEM},
{"db",DisplayMemoryByte,"display byte memory " ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC|PARAM_CAN_BE_SYMBOLIC|PARAM_CAN_BE_REG_KEYWORD,0,0,0,0},"",COMMAND_GROUP_MEM},
{"dpd",DisplayPhysMemDword,"display dword physical memory" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC,0,0,0,0},"",COMMAND_GROUP_MEM},
{"u",Unassemble,"disassemble at address" ,COMMAND_HAS_PARAMS|COMMAND_HAS_SWITCHES,{PARAM_CAN_BE_NUMERIC|PARAM_CAN_BE_SYMBOLIC|PARAM_CAN_BE_REG_KEYWORD|PARAM_CAN_BE_SRCLINE,0,0,0,0},"f",COMMAND_GROUP_MEM},
{"mod",ShowModules,"displays all modules" ,0,{0,0,0,0,0},"",COMMAND_GROUP_OS},
{"bpx",SetBreakpoint,"set code breakpoint" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC|PARAM_CAN_BE_VIRTUAL_SYMBOLIC|PARAM_CAN_BE_SYMBOLIC|PARAM_CAN_BE_SRCLINE|PARAM_CAN_BE_REG_KEYWORD,0,0,0,0},"",COMMAND_GROUP_BREAKPOINT},
{"bl",ListBreakpoints,"list breakpoints" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC,0,0,0,0},"",COMMAND_GROUP_BREAKPOINT},
{"bc",ClearBreakpoints,"clear breakpoints" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC|PARAM_CAN_BE_ASTERISK,0,0,0,0},"",COMMAND_GROUP_BREAKPOINT},
{"ver",Ver,"display pICE version and state information" ,0,{0,0,0,0,0},"",COMMAND_GROUP_INFO},
{"hboot",Hboot,"hard boot the system" ,0,{0,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"code",SetCodeDisplay,"toggle code display" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_ONOFF,0,0,0,0},"",COMMAND_GROUP_STATE},
{"cpu",ShowCPU,"display CPU special registers" ,0,{0,0,0,0,0},"",COMMAND_GROUP_STRUCT},
{"stack",WalkStack,"display call stack" ,0,{0,0,0,0,0},"",COMMAND_GROUP_STRUCT},
{"peek",PeekMemory,"peek at physical memory" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_SIZE_DESC,PARAM_CAN_BE_NUMERIC,0,0,0},"",COMMAND_GROUP_MEM},
{"poke",PokeMemory,"poke to physical memory" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_SIZE_DESC,PARAM_CAN_BE_NUMERIC,PARAM_CAN_BE_NUMERIC,0,0},"",COMMAND_GROUP_MEM},
{".",UnassembleAtCurrentEip,"unassemble at current instruction" ,0,{0,0,0,0,0},"",COMMAND_GROUP_MEM},
{"p",StepOver,"single step over call" ,0,{0,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"i",StepInto,"single step into call" ,0,{0,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"locals",ShowLocals,"display local symbols" ,0,{0,0,0,0,0},"",COMMAND_GROUP_MEM},
{"table",SwitchTables,"display loaded symbol tables" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_MODULE,0,0,0,0},"",COMMAND_GROUP_DEBUG},
{"file",SwitchFiles,"display source files in symbol table" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_SRC_FILE,0,0,0,0},"",COMMAND_GROUP_DEBUG},
{"sym",ShowSymbols,"list known symbol information" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_PARTIAL_SYM_NAME,0,0,0,0},"",COMMAND_GROUP_DEBUG},
{"?",EvaluateExpression,"evaluate an expression" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_ANY_STRING,0,0,0,0},"",COMMAND_GROUP_DEBUG},
{"src",SetSrcDisplay,"sets disassembly mode" ,0,{0,0,0,0,0},"",COMMAND_GROUP_DEBUG},
{"wc",SizeCodeWindow,"change size of code window" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_DECIMAL,0,0,0,0},"",COMMAND_GROUP_WINDOW},
{"wd",SizeDataWindow,"change size of data window" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_DECIMAL,0,0,0,0},"",COMMAND_GROUP_WINDOW},
{"r",SetGetRegisters,"sets or displays registers" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_REG_KEYWORD,PARAM_CAN_BE_NUMERIC,0,0,0},"",COMMAND_GROUP_STRUCT},
{"cls",ClearScreen,"clear output window" ,0,{0,0,0,0,0},"",COMMAND_GROUP_WINDOW},
{"phys",ShowMappings,"show all mappings for linear address" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_NUMERIC,0,0,0,0},"",COMMAND_GROUP_MEM},
{"timers",ShowTimers,"show all active timers" ,0,{0,0,0,0,0},"",COMMAND_GROUP_OS},
{"pci",ShowPCI,"show PCI devices" ,COMMAND_HAS_PARAMS|COMMAND_HAS_SWITCHES,{PARAM_CAN_BE_DECIMAL,PARAM_CAN_BE_DECIMAL,0,0,0},"a",COMMAND_GROUP_INFO},
{"next",NextInstr,"advance EIP to next instruction" ,0,{0,0,0,0,0},""},
{"i3here",I3here,"catch INT 3s" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_ONOFF,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"layout",SetKeyboardLayout,"sets keyboard layout" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_ANY_STRING,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"syscall",ShowSysCallTable,"displays syscall (table)" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_DECIMAL,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"altkey",SetAltKey,"set alternate break key" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_LETTER,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"addr",ShowContext,"show/set address contexts" ,COMMAND_HAS_PARAMS,{PARAM_CAN_BE_PRNAME,0,0,0,0},"",COMMAND_GROUP_FLOW},
{"arrow up",NULL,"" ,0,{0,0,0,0,0},"",COMMAND_GROUP_HELP_ONLY},
{NULL,0,NULL}
};
char tempCmd[1024];
char HexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
CPUINFO CPUInfo[]={
{"DR0",&CurrentDR0},
{"DR1",&CurrentDR1},
{"DR2",&CurrentDR2},
{"DR3",&CurrentDR3},
{"DR6",&CurrentDR6},
{"DR7",&CurrentDR7},
{"EFLAGS",&CurrentEFL},
{"CR0",&CurrentCR0},
{"CR2",&CurrentCR2},
{"CR3",&CurrentCR3},
{"",NULL},
};
BP Bp[4]={
{0,0,0,FALSE,FALSE,FALSE,"",""},
{0,0,0,FALSE,FALSE,FALSE,"",""},
{0,0,0,FALSE,FALSE,FALSE,"",""},
{0,0,0,FALSE,FALSE,FALSE,"",""}
};
BOOLEAN bShowSrc = TRUE;
BOOLEAN bCodeOn = FALSE;
BOOLEAN bNeedToFillBuffer = TRUE;
char *NonSystemSegmentTypes[]=
{
"Data RO",
"Data RO accessed",
"Data RW",
"Data RW accessed",
"Data RO expand-dwon",
"Data RO expand-down, accessed",
"Data RW expand-dwon",
"Data RW expand-down, accessed",
"Code EO",
"Code EO accessed",
"Code ER",
"Code ER accessed",
"Code EO conforming",
"Code EO conforming, accessed",
"Code ER conforming",
"Code ER conforming, accessed"
};
char *SystemSegmentTypes[]=
{
"reserved0",
"16-bit TSS (available)",
"LDT",
"16-bit TSS (busy)",
"16-bit call gate",
"task gate",
"16-bit interrupt gate",
"16-bit trap gate",
"reserved1",
"32-bit TSS (available)",
"reserved2",
"32-bit TSS (busy)",
"32-bit call gate",
"reserved3",
"32-bit interrupt gate",
"32-bit trap gate"
};
////////////////////////////////////////////////////
// FUNCTIONS
////
//*************************************************************************
// RepaintSource()
//
//*************************************************************************
void RepaintSource(void)
{
ARGS Args;
ENTER_FUNC();
// disassembly from current address
PICE_memset(&Args,0,sizeof(ARGS));
// make unassembler refresh all again
ulLastDisassStartAddress=ulLastDisassEndAddress=0;
Args.Count=0;
Unassemble(&Args);
LEAVE_FUNC();
}
//*************************************************************************
// RepaintDesktop()
//
//*************************************************************************
void RepaintDesktop(void)
{
ARGS Args;
ENTER_FUNC();
PrintTemplate();
DisplayRegs();
// display data window
Args.Value[0]=OldSelector;
Args.Value[1]=OldOffset;
Args.Count=2;
DisplayMemory(&Args);
// disassembly from current address
PICE_memset(&Args,0,sizeof(ARGS));
// make unassembler refresh all again
ulLastDisassStartAddress=ulLastDisassEndAddress=0;
Args.Count=0;
Unassemble(&Args);
PrintRingBuffer(wWindow[OUTPUT_WINDOW].cy-1);
Print(OUTPUT_WINDOW,"");
ShowStoppedMsg();
ShowStatusLine();
LEAVE_FUNC();
}
//*************************************************************************
// PutStatusText()
//
//*************************************************************************
void PutStatusText(LPSTR p)
{
ENTER_FUNC();
ClrLine(wWindow[OUTPUT_WINDOW].y-1);
PutChar(p,1,wWindow[OUTPUT_WINDOW].y-1);
LEAVE_FUNC();
}
//*************************************************************************
// WaitForKey()
//
//*************************************************************************
BOOLEAN WaitForKey(void)
{
BOOLEAN result=TRUE;
if(ulCountForWaitKey == 0)
SuspendPrintRingBuffer(TRUE);
ulCountForWaitKey++;
if(ulCountForWaitKey == (wWindow[OUTPUT_WINDOW].cy-1))
{
SuspendPrintRingBuffer(FALSE);
PrintRingBuffer(wWindow[OUTPUT_WINDOW].cy-1);
ulCountForWaitKey = 0;
SetBackgroundColor(WHITE);
ClrLine(wWindow[OUTPUT_WINDOW].y+wWindow[OUTPUT_WINDOW].cy);
PutChar(" Press any key to continue listing or press ESC to stop... ",1,wWindow[OUTPUT_WINDOW].y+wWindow[OUTPUT_WINDOW].cy);
ucKeyPressedWhileIdle=0;
while(!(ucKeyPressedWhileIdle=GetKeyPolled()))
{
PrintCursor(FALSE);
}
SetBackgroundColor(BLACK);
// if ESCAPE then indicate retreat
if(ucKeyPressedWhileIdle==SCANCODE_ESC)
{
result=FALSE;
}
ucKeyPressedWhileIdle=0;
}
return result;
}
/////////////////////////////////////////////////////////////
// command handlers
/////////////////////////////////////////////////////////////
//*************************************************************************
// SingleStep()
//
//*************************************************************************
COMMAND_PROTOTYPE(SingleStep)
{
ULONG ulLineNumber;
LPSTR pSrcStart,pSrcEnd,pFilename;
ENTER_FUNC();
if(FindSourceLineForAddress(GetLinearAddress(CurrentCS,CurrentEIP),&ulLineNumber,&pSrcStart,&pSrcEnd,&pFilename))
{
DPRINT((0,"SingleStep(): stepping into source\n"));
StepInto(NULL);
}
else
{
// modify trace flag
CurrentEFL|=0x100; // set trace flag (TF)
bSingleStep=TRUE;
bNotifyToExit=TRUE;
}
bStepping = TRUE;
LEAVE_FUNC();
return TRUE;
}
//*************************************************************************
// StepOver()
//
// step over calls
//*************************************************************************
COMMAND_PROTOTYPE(StepOver)
{
char tempDisasm[256];
ULONG dwBreakAddress;
ULONG ulLineNumber;
LPSTR pSrcStart,pSrcEnd,pFilename;
ENTER_FUNC();
DPRINT((0,"StepOver():\n"));
// only no arguments supplied
// when we have source and current disassembly mod is SOURCE
// we have to analyse the code block for the source line
if(FindSourceLineForAddress(GetLinearAddress(CurrentCS,CurrentEIP),&ulLineNumber,&pSrcStart,&pSrcEnd,&pFilename))
{
DPRINT((0,"StepOver(): we have source here!\n"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -