mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
177 lines
3.8 KiB
C
177 lines
3.8 KiB
C
/*++
|
|
|
|
Copyright (c) 1998-2001 Klaus P. Gerlicher
|
|
|
|
Module Name:
|
|
|
|
hooks.c
|
|
|
|
Abstract:
|
|
|
|
hooking of interrupts
|
|
|
|
Environment:
|
|
|
|
Kernel mode only
|
|
|
|
Author:
|
|
|
|
Klaus P. Gerlicher
|
|
|
|
Revision History:
|
|
|
|
16-Jul-1998: created
|
|
15-Nov-2000: general cleanup of source files
|
|
|
|
Copyright notice:
|
|
|
|
This file may be distributed under the terms of the GNU Public License.
|
|
|
|
--*/
|
|
|
|
////////////////////////////////////////////////////
|
|
// INCLUDES
|
|
////
|
|
#include "remods.h"
|
|
#include "precomp.h"
|
|
|
|
////////////////////////////////////////////////////
|
|
// PROTOTYPES
|
|
////
|
|
void DeinstallHooks(void);
|
|
|
|
////////////////////////////////////////////////////
|
|
// DEFINES
|
|
////
|
|
|
|
////////////////////////////////////////////////////
|
|
// GLOBALS
|
|
////
|
|
|
|
// IDT entries
|
|
//PIDTENTRY pidt[256];
|
|
IDTENTRY oldidt[256]={{0},};
|
|
|
|
IDTENTRY idt_snapshot[256]={{0},};
|
|
|
|
// processor flag for interrupt suspension
|
|
ULONG ulOldFlags;
|
|
|
|
////////////////////////////////////////////////////
|
|
// PROCEDURES
|
|
////
|
|
|
|
//*************************************************************************
|
|
// MaskIrqs()
|
|
//
|
|
//*************************************************************************
|
|
void MaskIrqs(void)
|
|
{
|
|
ENTER_FUNC();
|
|
|
|
save_flags(ulOldFlags);
|
|
cli();
|
|
|
|
LEAVE_FUNC();
|
|
}
|
|
|
|
//*************************************************************************
|
|
// UnmaskIrqs()
|
|
//
|
|
//*************************************************************************
|
|
void UnmaskIrqs(void)
|
|
{
|
|
ENTER_FUNC();
|
|
|
|
restore_flags(ulOldFlags);
|
|
|
|
LEAVE_FUNC();
|
|
}
|
|
|
|
//*************************************************************************
|
|
// SetGlobalInt()
|
|
//
|
|
//*************************************************************************
|
|
ULONG SetGlobalInt(ULONG dwInt,ULONG NewIntHandler)
|
|
{
|
|
ULONG idt[2];
|
|
ULONG OldIntHandler;
|
|
struct IdtEntry* pidt;
|
|
struct IdtEntry oldidt;
|
|
|
|
ENTER_FUNC();
|
|
|
|
// get linear location of IDT
|
|
__asm__("sidt %0":"=m" (idt));
|
|
|
|
// get pointer to idte for int 3
|
|
pidt=((struct IdtEntry*)((idt[1]<<16)|((idt[0]>>16)&0x0000FFFF)))+dwInt;
|
|
|
|
oldidt=*pidt;
|
|
|
|
// set new handler address
|
|
pidt->HiOffset=(USHORT)(((ULONG)NewIntHandler)>>16);
|
|
pidt->LoOffset=(USHORT)(((ULONG)NewIntHandler)&0x0000FFFF);
|
|
|
|
DPRINT((0,"new INT(%0.2x) handler = %0.4x:%x\n",dwInt,pidt->SegSel,(pidt->HiOffset<<16)|(pidt->LoOffset&0x0000FFFF)));
|
|
|
|
OldIntHandler=(oldidt.HiOffset<<16)|(oldidt.LoOffset&0x0000FFFF);
|
|
|
|
DPRINT((0,"old INT(%0.2x) handler = %0.4x:%x\n",dwInt,pidt->SegSel,OldIntHandler));
|
|
|
|
LEAVE_FUNC();
|
|
|
|
return OldIntHandler;
|
|
}
|
|
|
|
//*************************************************************************
|
|
// TakeIdtSnapshot()
|
|
//
|
|
//*************************************************************************
|
|
void TakeIdtSnapshot(void)
|
|
{
|
|
ULONG idt[2],i;
|
|
struct IdtEntry* pidt;
|
|
|
|
__asm__("sidt %0":"=m" (idt));
|
|
|
|
// get pointer to idte for int 3
|
|
pidt=((struct IdtEntry*)((idt[1]<<16)|((idt[0]>>16)&0x0000FFFF)));
|
|
|
|
for(i=0;i<256;i++)
|
|
{
|
|
DPRINT((11,"TakeIdtSnapShot(): saving vector %u\n",i));
|
|
if(IsRangeValid((ULONG)pidt,sizeof(*pidt)) )
|
|
{
|
|
DPRINT((11,"TakeIdtSnapShot(): vector %u valid\n",i));
|
|
idt_snapshot[i] = *pidt++;
|
|
}
|
|
}
|
|
}
|
|
|
|
//*************************************************************************
|
|
// RestoreIdt()
|
|
//
|
|
//*************************************************************************
|
|
void RestoreIdt(void)
|
|
{
|
|
ULONG idt[2],i;
|
|
struct IdtEntry* pidt;
|
|
|
|
__asm__("sidt %0":"=m" (idt));
|
|
|
|
// get pointer to idte for int 3
|
|
pidt=((struct IdtEntry*)((idt[1]<<16)|((idt[0]>>16)&0x0000FFFF)));
|
|
|
|
for(i=0;i<256;i++)
|
|
{
|
|
DPRINT((11,"TakeIdtSnapShot(): restoring vector %u\n",i));
|
|
if(IsRangeValid((ULONG)pidt,sizeof(*pidt)) )
|
|
{
|
|
DPRINT((11,"TakeIdtSnapShot(): vector %u valid\n",i));
|
|
*pidt++ = idt_snapshot[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
// EOF
|