Windows NT 4.0 source code leak
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

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