www.pudn.com > HEC-win32.zip > dosdbg.c
#include/*global variables-------------------------------------------------*/ char INT1_STR[]="->SINGLED-STEP<-\n"; char INT3_STR[]="->BREAKPOINT<-\n"; unsigned short rCS,rSS,rDS; short rAX,rBX,rCX,rDX; unsigned short rIP; unsigned char traceOn=0; /*prototypes-------------------------------------------------------*/ void procCmd(int *lptr); /*definitions------------------------------------------------------*/ void main() { unsigned short oldInt1Seg; unsigned short oldInt1Offset; unsigned short oldInt3Seg; unsigned short oldInt3Offset; goto past_interrupts; /* Handle INT 1 -----------------------------------------------*/ int1: __asm { STI MOV rCS,CS MOV rSS,SS MOV rDS,DS MOV rAX,AX MOV rBX,BX MOV rCX,CX MOV rDX,DX POP CX MOV rIP,CX POP DX POP AX AND AX,65279 PUSH AX PUSH DX PUSH CX } printf("%s",INT1_STR); printf("next instruction at IP=%u\n",rIP); { int loop = 1; while(loop) { procCmd(&loop); } } if(traceOn) { __asm { POP CX POP DX POP AX OR AX,256 PUSH AX PUSH DX PUSH CX } } __asm { MOV AX,rAX MOV BX,rBX MOV CX,rCX MOV DX,rDX IRET } /* Handle INT 3 -----------------------------------------------*/ int3: __asm { STI MOV rCS,CS MOV rSS,SS MOV rDS,DS MOV rAX,AX MOV rBX,BX MOV rCX,CX MOV rDX,DX POP CX POP DX POP AX AND AX,65279 PUSH AX PUSH DX PUSH CX } printf("%s",INT3_STR); { int loop = 1; while(loop) { procCmd(&loop); } } if(traceOn) { __asm { POP CX POP DX POP AX OR AX,256 PUSH AX PUSH DX PUSH CX } } __asm { MOV AX,rAX MOV BX,rBX MOV CX,rCX MOV DX,rDX IRET } /* Execution path begins here --------------------------------*/ past_interrupts: printf("Save old interrupts SEG:OFF\n"); __asm { MOV AH,0x35 MOV AL,0x1 INT 0x21 MOV oldInt1Seg,ES MOV oldInt1Offset,BX MOV AH,0x35 MOV AL,0x3 INT 0x21 MOV oldInt3Seg,ES MOV oldInt3Offset,BX } printf("Load new interrupts SEG:OFF\n"); __asm { MOV AH,0x25 MOV AL,0x1 PUSH DS MOV CX,CS MOV DS,CX MOV DX,OFFSET int1 INT 0x21 POP DS MOV AH,0x25 MOV AL,0x3 PUSH DS MOV CX,CS MOV DS,CX MOV DX,OFFSET int3 INT 0x21 POP DS } /* actually do something here to provoke debugger -------------*/ __asm { INT 3 MOV DX,20 INC DX NOP MOV DX,3501 MOV DX,72 DEC DX } printf("Re-loading old interrupts SEG:OFF\n"); __asm { PUSH DS MOV AH,0x25 MOV AL,0x1 MOV DS,oldInt1Seg MOV DX,oldInt1Offset INT 0x21 POP DS PUSH DS MOV AH,0x25 MOV AL,0x3 MOV DS,oldInt3Seg MOV DX,oldInt3Offset INT 0x21 POP DS } return; }/*end main*/ void procCmd(int *lptr) { char ch; traceOn=0; printf("dbg>"); scanf("%c",&ch); fflush(stdin); switch(ch) { case 'a': { printf("INT1_STR address=%u\n",INT1_STR); }break; case 'd': { printf("CS=%u\n",rCS); printf("SS=%u\n",rSS); printf("DS=%u\n",rDS); printf("AX=%d\n",rAX); printf("BX=%d\n",rBX); printf("CX=%d\n",rCX); printf("DX=%d\n",rDX); }break; case 'i': { rAX++; printf("AX=%d\n",rAX); }break; case 'm': { int i; unsigned long address; unsigned long limit = rCS+65535; unsigned char *sptr; printf("memory address>"); scanf("%lu",&address); fflush(stdin); sptr = (unsigned char*)address; printf("address=%u\n",sptr); if(address > limit) { printf("address is beyond .COM segment\n"); } else { for(i=0;i<16;i++) { if((sptr[i]>0x20)&&(sptr[i]<0x7F)) { printf("byte[%lu]=%c\n",address+i,sptr[i]); } else { printf("byte[%lu]=%X\n",address+i,sptr[i]); } } } }break; case 'q': { *lptr=0; }break; case 't': { traceOn=1; printf("trace flag set\n"); *lptr=0; }break; default: { printf("not valid command\n"); } } return; }/*end procCmd*/