unit IntUnit;
interface
uses DrvUnit;
type
TReg = packed record
// POPAD - stored reg's
edi,esi,ebp,Resp:integer;
// UNION EBX
case byte of
1:(bl,bh:byte;__1:word);
2:(bx:word; __2:word);
3:(ebx:integer;
// UNION EDX
case byte of
1:(dl,dh:byte;__3:word);
2:(dx:word; __4:word);
3:(edx:integer;
// UNION ECX
case byte of
1:(cl,ch:byte;__5:word);
2:(cx:word; __6:word);
3:(ecx: integer;
// UNION EAX
case byte of
1:(al,ah:byte;__7:word);
2:(ax:word; __8:word);
3:(eax:integer;
// CPU self-stored reg's
eip,cs:integer;
case byte of
1:(flags:word;flagsMi,flagsHi:byte);
2:(efl,esp,ss,es,ds,fs,gs:integer)))));
end;
procedure HookIDT(DispHnd:pointer);
procedure UnHookIDT();
implementation
var
DispathHnd:pointer;
IDT :^TIDT64;
OldIDT : TIDT64;
procedure IDTHook; forward;
procedure rise;
asm cli
xchg eax,[esp] //store eax, get except num
push ecx
//
push edx // dump general reg's
push ebx
push esp
push ebp
push esi
push edi
//
mov edx, eax
mov eax, $CCCCCCCD
sub edx, offset IDTHook+5
mul edx
//
mov edx,esp
call DispathHnd
//
popad
iretd
end;
procedure risX;//excpt w/err code
asm cli //NUM <-STACK
mov [esp+4],eax //ERROR CODE
pop eax //EIP
xchg eax,[esp]
jmp rise
end;
procedure IDTHook;
begin
rise(*00*); // Divide Error
rise(*01*); // Debug Exception
rise(*02*); // NMI Interrupt
rise(*03*); // Breakpoint
rise(*04*); // INTO-detected Overflow
rise(*05*); // BOUND Range Exceeded
rise(*06*); // Invalid Opcode
rise(*07*); // Device Not Available
risX(*08*); // Double Fault
risX(*09*); // CoProcessor Segment Overrun (reserved)
risX(*0A*); // Invalid Task State Segment
risX(*0B*); // Segment Not Present
risX(*0C*); // Stack Fault
risX(*0D*); // General Protection
risX(*0E*); // Page Fault
rise(*0F*); // Intel reserved. Do not use
rise(*10*); // Floating-Point Error
risX(*11*); // Alignment Check
risX(*12*); // Machine Check
rise(*13*); // XMM
rise(*14*); rise(*15*); rise(*16*); rise(*17*);
rise(*18*); rise(*19*); rise(*1A*); rise(*1B*);
rise(*1C*); rise(*1D*); rise(*1E*); rise(*1F*);
rise(*20*); rise(*21*); rise(*22*); rise(*23*);
rise(*24*); rise(*25*); rise(*26*); rise(*27*);
rise(*28*); rise(*29*); rise(*2A*); rise(*2B*);
rise(*2C*); rise(*2D*); rise(*2E*); rise(*2F*);
rise(*30*); rise(*31*); rise(*32*); rise(*33*);
rise(*34*); rise(*35*); rise(*36*); rise(*37*);
rise(*38*); rise(*39*); rise(*3A*); rise(*3B*);
rise(*3C*); rise(*3D*); rise(*3E*); rise(*3F*);
rise(*40*); rise(*41*); rise(*42*); rise(*43*);
rise(*44*); rise(*45*); rise(*46*); rise(*47*);
rise(*48*); rise(*49*); rise(*4A*); rise(*4B*);
rise(*4C*); rise(*4D*); rise(*4E*); rise(*4F*);
rise(*50*); rise(*51*); rise(*52*); rise(*53*);
rise(*54*); rise(*55*); rise(*56*); rise(*57*);
rise(*58*); rise(*59*); rise(*5A*); rise(*5B*);
rise(*5C*); rise(*5D*); rise(*5E*); rise(*5F*);
rise(*60*); rise(*61*); rise(*62*); rise(*63*);
rise(*64*); rise(*65*); rise(*66*); rise(*67*);
rise(*68*); rise(*69*); rise(*6A*); rise(*6B*);
rise(*6C*); rise(*6D*); rise(*6E*); rise(*6F*);
rise(*70*); rise(*71*); rise(*72*); rise(*73*);
rise(*74*); rise(*75*); rise(*76*); rise(*77*);
rise(*78*); rise(*79*); rise(*7A*); rise(*7B*);
rise(*7C*); rise(*7D*); rise(*7E*); rise(*7F*);
rise(*80*); rise(*81*); rise(*82*); rise(*83*);
rise(*84*); rise(*85*); rise(*86*); rise(*87*);
rise(*88*); rise(*89*); rise(*8A*); rise(*8B*);
rise(*8C*); rise(*8D*); rise(*8E*); rise(*8F*);
rise(*90*); rise(*91*); rise(*92*); rise(*93*);
rise(*94*); rise(*95*); rise(*96*); rise(*97*);
rise(*98*); rise(*99*); rise(*9A*); rise(*9B*);
rise(*9C*); rise(*9D*); rise(*9E*); rise(*9F*);
rise(*A0*); rise(*A1*); rise(*A2*); rise(*A3*);
rise(*A4*); rise(*A5*); rise(*A6*); rise(*A7*);
rise(*A8*); rise(*A9*); rise(*AA*); rise(*AB*);
rise(*AC*); rise(*AD*); rise(*AE*); rise(*AF*);
rise(*B0*); rise(*B1*); rise(*B2*); rise(*B3*);
rise(*B4*); rise(*B5*); rise(*B6*); rise(*B7*);
rise(*B8*); rise(*B9*); rise(*BA*); rise(*BB*);
rise(*BC*); rise(*BD*); rise(*BE*); rise(*BF*);
rise(*C0*); rise(*C1*); rise(*C2*); rise(*C3*);
rise(*C4*); rise(*C5*); rise(*C6*); rise(*C7*);
rise(*C8*); rise(*C9*); rise(*CA*); rise(*CB*);
rise(*CC*); rise(*CD*); rise(*CE*); rise(*CF*);
rise(*D0*); rise(*D1*); rise(*D2*); rise(*D3*);
rise(*D4*); rise(*D5*); rise(*D6*); rise(*D7*);
rise(*D8*); rise(*D9*); rise(*DA*); rise(*DB*);
rise(*DC*); rise(*DD*); rise(*DE*); rise(*DF*);
rise(*E0*); rise(*E1*); rise(*E2*); rise(*E3*);
rise(*E4*); rise(*E5*); rise(*E6*); rise(*E7*);
rise(*E8*); rise(*E9*); rise(*EA*); rise(*EB*);
rise(*EC*); rise(*ED*); rise(*EE*); rise(*EF*);
rise(*F0*); rise(*F1*); rise(*F2*); rise(*F3*);
rise(*F4*); rise(*F5*); rise(*F6*); rise(*F7*);
rise(*F8*); rise(*F9*); rise(*FA*); rise(*FB*);
rise(*FC*); rise(*FD*); rise(*FE*); rise(*FF*);
end;
procedure HookIDT(DispHnd:pointer);
var
i:integer;
begin cli();
IDT := GetIDT();
for i:= 0 to $FF do begin
OldIDT[i] := IDT[i];
IDT[i] := A32ToV64(integer(@IDTHook)+i*5);
end;
DispathHnd := DispHnd;
end;
procedure UnHookIDT;
var
i:integer;
begin cli();
for i := 0 to $FF do
IDT[i] := OldIDT[i];
end;
end.