|
|
1.1 ! root 1: #include "givit.h" ! 2: ! 3: #define NEWSTATE StateChange.NewState ! 4: #define EXCEPTION_CODE StateChange.u.Exception.ExceptionRecord.ExceptionCode ! 5: #define FIRST_CHANCE StateChange.u.Exception.FirstChance ! 6: #define EXCEPTIONPC (ULONG)StateChange.ProgramCounter ! 7: ! 8: #define EXCEPTIONREPORT StateChange.ControlReport ! 9: #ifdef i386 ! 10: #define EXCEPTIONDR7 StateChange.ControlReport.Dr7 ! 11: #endif ! 12: #define INSTRCOUNT StateChange.ControlReport.InstructionCount ! 13: #define INSTRSTREAM StateChange.ControlReport.InstructionStream ! 14: ! 15: USHORT NtsdCurrentProcessor; ! 16: USHORT DefaultProcessor; ! 17: DBGKD_WAIT_STATE_CHANGE StateChange; ! 18: char Buffer[256]; ! 19: USHORT ProcessorType; ! 20: ULONG NumberProcessors = 1; ! 21: ! 22: void _CRTAPI1 main (int Argc, PUCHAR *Argv) ! 23: { ! 24: DWORD st; ! 25: PUCHAR pszExceptCode; ! 26: PUCHAR Switch; ! 27: ! 28: int Index; ! 29: DBGKD_CONTROL_SET ControlSet; ! 30: BOOLEAN Connected; ! 31: ! 32: ConsoleInputHandle = GetStdHandle( STD_INPUT_HANDLE ); ! 33: ConsoleOutputHandle = GetStdHandle( STD_ERROR_HANDLE ); ! 34: ! 35: NtsdCurrentProcessor = DefaultProcessor = 0; ! 36: ! 37: st = DbgKdConnectAndInitialize(); ! 38: ! 39: if (st != ERROR_SUCCESS ) { ! 40: printf("kd: DbgKdConnectAndInitialize failed: %08lx\n", st); ! 41: exit(1); ! 42: } ! 43: ! 44: Connected = FALSE; ! 45: ! 46: while (TRUE) { ! 47: ! 48: st = DbgKdWaitStateChange(&StateChange, Buffer, 254); ! 49: if (!Connected) { ! 50: Connected = TRUE; ! 51: printf("KD: Kernel Debugger connection established.\n"); ! 52: } ! 53: ! 54: if (st != ERROR_SUCCESS) { ! 55: printf("kd: DbgKdWaitStateChange failed: %08lx\n", st); ! 56: exit(1); ! 57: } ! 58: ProcessorType = StateChange.ProcessorType; ! 59: NtsdCurrentProcessor = StateChange.Processor; ! 60: NumberProcessors = StateChange.NumberProcessors; ! 61: if (StateChange.NewState == DbgKdExceptionStateChange) { ! 62: ! 63: if (EXCEPTION_CODE == EXCEPTION_BREAKPOINT ! 64: || EXCEPTION_CODE == EXCEPTION_SINGLE_STEP) ! 65: pszExceptCode = "BreakPoint"; ! 66: else if (EXCEPTION_CODE == EXCEPTION_DATATYPE_MISALIGNMENT) ! 67: pszExceptCode = "Data Misaligned"; ! 68: else if (EXCEPTION_CODE == EXCEPTION_INT_OVERFLOW) ! 69: pszExceptCode = "Integer Overflow"; ! 70: else if (EXCEPTION_CODE == EXCEPTION_ACCESS_VIOLATION) ! 71: pszExceptCode = "Access Violation"; ! 72: else ! 73: pszExceptCode = "Unknown Exception"; ! 74: ! 75: if (!pszExceptCode) { ! 76: st = DBG_EXCEPTION_HANDLED; ! 77: } else { ! 78: printf("%s - code: %08lx (", pszExceptCode, EXCEPTION_CODE); ! 79: st = DBG_EXCEPTION_HANDLED; ! 80: if (FIRST_CHANCE) ! 81: printf("first"); ! 82: else ! 83: printf("second"); ! 84: printf(" chance)\n"); ! 85: } ! 86: ! 87: #ifdef i386 ! 88: if (EXCEPTION_CODE == EXCEPTION_BREAKPOINT) { ! 89: CONTEXT Registers; ! 90: KSPECIAL_REGISTERS SpecialRegisters; ! 91: if ( DbgKdGetContext(NtsdCurrentProcessor,&Registers) == ERROR_SUCCESS ) { ! 92: printf("Breakpoint Occured at:\n"); ! 93: printf("eip = 0x%08x\n",Registers.Eip); ! 94: printf("ebp = 0x%08x\n",Registers.Ebp); ! 95: printf("esp = 0x%08x\n",Registers.Esp); ! 96: Registers.Eip++; ! 97: DbgKdSetContext(NtsdCurrentProcessor,&Registers); ! 98: } ! 99: if ( DbgKdReadControlSpace( ! 100: NtsdCurrentProcessor, ! 101: (PVOID)sizeof(CONTEXT), ! 102: (PVOID)&SpecialRegisters, ! 103: sizeof(KSPECIAL_REGISTERS), ! 104: NULL) == ERROR_SUCCESS ) { ! 105: printf("cr3 = 0x%08x\n",SpecialRegisters.Cr3); ! 106: printf("cr0 = 0x%08x\n",SpecialRegisters.Cr0); ! 107: } ! 108: } ! 109: ControlSet.TraceFlag = FALSE; ! 110: ControlSet.Dr7 = EXCEPTIONDR7; ! 111: #endif ! 112: } ! 113: else ! 114: if (StateChange.NewState == DbgKdLoadSymbolsStateChange) { ! 115: if (StateChange.u.LoadSymbols.UnloadSymbols) { ! 116: if (StateChange.u.LoadSymbols.PathNameLength == 0 && ! 117: StateChange.u.LoadSymbols.BaseOfDll == (PVOID)-1 && ! 118: StateChange.u.LoadSymbols.ProcessId == 0 ! 119: ) { ! 120: ; ! 121: } ! 122: else { ! 123: printf("Unloading %s\n",Buffer); ! 124: } ! 125: } ! 126: else { ! 127: printf("Loading Image %s at 0x%lx\n", ! 128: Buffer, ! 129: StateChange.u.LoadSymbols.BaseOfDll ! 130: ); ! 131: } ! 132: #ifdef i386 ! 133: ControlSet.TraceFlag = FALSE; ! 134: ControlSet.Dr7 = EXCEPTIONDR7; ! 135: #endif ! 136: st = DBG_CONTINUE; ! 137: } ! 138: else { ! 139: // ! 140: // BUG, BUG - invalid NewState in state change record. ! 141: // ! 142: #ifdef i386 ! 143: ControlSet.TraceFlag = FALSE; ! 144: ControlSet.Dr7 = EXCEPTIONDR7; ! 145: #endif ! 146: st = DBG_CONTINUE; ! 147: } ! 148: ! 149: ! 150: st = DbgKdContinue2(st, ControlSet); ! 151: if (st != ERROR_SUCCESS) { ! 152: printf("kd: DbgKdContinue failed: %08lx\n", st); ! 153: exit(1); ! 154: } ! 155: } ! 156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.