mirror of https://github.com/lianthony/NT4.0
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.
154 lines
5.2 KiB
154 lines
5.2 KiB
#include "givit.h"
|
|
|
|
#define NEWSTATE StateChange.NewState
|
|
#define EXCEPTION_CODE StateChange.u.Exception.ExceptionRecord.ExceptionCode
|
|
#define FIRST_CHANCE StateChange.u.Exception.FirstChance
|
|
#define EXCEPTIONPC (ULONG)StateChange.ProgramCounter
|
|
|
|
#define EXCEPTIONREPORT StateChange.ControlReport
|
|
#ifdef i386
|
|
#define EXCEPTIONDR7 StateChange.ControlReport.Dr7
|
|
#endif
|
|
#define INSTRCOUNT StateChange.ControlReport.InstructionCount
|
|
#define INSTRSTREAM StateChange.ControlReport.InstructionStream
|
|
|
|
USHORT NtsdCurrentProcessor;
|
|
USHORT DefaultProcessor;
|
|
DBGKD_WAIT_STATE_CHANGE StateChange;
|
|
char Buffer[256];
|
|
ULONG NumberProcessors = 1;
|
|
|
|
void _CRTAPI1 main (int Argc, PUCHAR *Argv)
|
|
{
|
|
DWORD st;
|
|
PUCHAR pszExceptCode;
|
|
PUCHAR Switch;
|
|
|
|
int Index;
|
|
DBGKD_CONTROL_SET ControlSet;
|
|
BOOLEAN Connected;
|
|
|
|
ConsoleInputHandle = GetStdHandle( STD_INPUT_HANDLE );
|
|
ConsoleOutputHandle = GetStdHandle( STD_ERROR_HANDLE );
|
|
|
|
NtsdCurrentProcessor = DefaultProcessor = 0;
|
|
|
|
st = DbgKdConnectAndInitialize();
|
|
|
|
if (st != ERROR_SUCCESS ) {
|
|
printf("kd: DbgKdConnectAndInitialize failed: %08lx\n", st);
|
|
exit(1);
|
|
}
|
|
|
|
Connected = FALSE;
|
|
|
|
while (TRUE) {
|
|
|
|
st = DbgKdWaitStateChange(&StateChange, Buffer, 254);
|
|
if (!Connected) {
|
|
Connected = TRUE;
|
|
printf("KD: Kernel Debugger connection established.\n");
|
|
}
|
|
|
|
if (st != ERROR_SUCCESS) {
|
|
printf("kd: DbgKdWaitStateChange failed: %08lx\n", st);
|
|
exit(1);
|
|
}
|
|
NtsdCurrentProcessor = StateChange.Processor;
|
|
NumberProcessors = StateChange.NumberProcessors;
|
|
if (StateChange.NewState == DbgKdExceptionStateChange) {
|
|
|
|
if (EXCEPTION_CODE == EXCEPTION_BREAKPOINT
|
|
|| EXCEPTION_CODE == EXCEPTION_SINGLE_STEP)
|
|
pszExceptCode = "BreakPoint";
|
|
else if (EXCEPTION_CODE == EXCEPTION_DATATYPE_MISALIGNMENT)
|
|
pszExceptCode = "Data Misaligned";
|
|
else if (EXCEPTION_CODE == EXCEPTION_INT_OVERFLOW)
|
|
pszExceptCode = "Integer Overflow";
|
|
else if (EXCEPTION_CODE == EXCEPTION_ACCESS_VIOLATION)
|
|
pszExceptCode = "Access Violation";
|
|
else
|
|
pszExceptCode = "Unknown Exception";
|
|
|
|
if (!pszExceptCode) {
|
|
st = DBG_EXCEPTION_HANDLED;
|
|
} else {
|
|
printf("%s - code: %08lx (", pszExceptCode, EXCEPTION_CODE);
|
|
st = DBG_EXCEPTION_HANDLED;
|
|
if (FIRST_CHANCE)
|
|
printf("first");
|
|
else
|
|
printf("second");
|
|
printf(" chance)\n");
|
|
}
|
|
|
|
#ifdef i386
|
|
if (EXCEPTION_CODE == EXCEPTION_BREAKPOINT) {
|
|
CONTEXT Registers;
|
|
KSPECIAL_REGISTERS SpecialRegisters;
|
|
if ( DbgKdGetContext(NtsdCurrentProcessor,&Registers) == ERROR_SUCCESS ) {
|
|
printf("Breakpoint Occured at:\n");
|
|
printf("eip = 0x%08x\n",Registers.Eip);
|
|
printf("ebp = 0x%08x\n",Registers.Ebp);
|
|
printf("esp = 0x%08x\n",Registers.Esp);
|
|
Registers.Eip++;
|
|
DbgKdSetContext(NtsdCurrentProcessor,&Registers);
|
|
}
|
|
if ( DbgKdReadControlSpace(
|
|
NtsdCurrentProcessor,
|
|
(PVOID)sizeof(CONTEXT),
|
|
(PVOID)&SpecialRegisters,
|
|
sizeof(KSPECIAL_REGISTERS),
|
|
NULL) == ERROR_SUCCESS ) {
|
|
printf("cr3 = 0x%08x\n",SpecialRegisters.Cr3);
|
|
printf("cr0 = 0x%08x\n",SpecialRegisters.Cr0);
|
|
}
|
|
}
|
|
ControlSet.TraceFlag = FALSE;
|
|
ControlSet.Dr7 = EXCEPTIONDR7;
|
|
#endif
|
|
}
|
|
else
|
|
if (StateChange.NewState == DbgKdLoadSymbolsStateChange) {
|
|
if (StateChange.u.LoadSymbols.UnloadSymbols) {
|
|
if (StateChange.u.LoadSymbols.PathNameLength == 0 &&
|
|
StateChange.u.LoadSymbols.BaseOfDll == (PVOID)-1 &&
|
|
StateChange.u.LoadSymbols.ProcessId == 0
|
|
) {
|
|
;
|
|
}
|
|
else {
|
|
printf("Unloading %s\n",Buffer);
|
|
}
|
|
}
|
|
else {
|
|
printf("Loading Image %s at 0x%lx\n",
|
|
Buffer,
|
|
StateChange.u.LoadSymbols.BaseOfDll
|
|
);
|
|
}
|
|
#ifdef i386
|
|
ControlSet.TraceFlag = FALSE;
|
|
ControlSet.Dr7 = EXCEPTIONDR7;
|
|
#endif
|
|
st = DBG_CONTINUE;
|
|
}
|
|
else {
|
|
//
|
|
// BUG, BUG - invalid NewState in state change record.
|
|
//
|
|
#ifdef i386
|
|
ControlSet.TraceFlag = FALSE;
|
|
ControlSet.Dr7 = EXCEPTIONDR7;
|
|
#endif
|
|
st = DBG_CONTINUE;
|
|
}
|
|
|
|
|
|
st = DbgKdContinue2(st, ControlSet);
|
|
if (st != ERROR_SUCCESS) {
|
|
printf("kd: DbgKdContinue failed: %08lx\n", st);
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|