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

#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);
}
}
}