· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Перхват прерывания

Посл.отвђт Сообщенiе


Дата: Июн 21, 2004 02:21:22

Мне нужно перехвать 6 прерывание, поставить новый обработчик, отработать и вернуть старый. Как сделать мне это. Если можно пример. Спасибо.


Дата: Июн 21, 2004 02:56:31

Про ud я немного писал в своей статье (2-ой) про защиту с хасп.

А чем оно отличается от других ? Можно править idt, можно в теле обработчика jmp/jnz..и т.п.


Дата: Июн 21, 2004 03:43:39

А где статья ?
Если можно то пример, как править idt?


Дата: Июн 21, 2004 13:37:11

ВОт есть проседура.
FDCInterrupt PROC
; Разрешить прерывания
sti
push DS
push AX
; Установить флаг прерывания
mov [FDD_IntFlag],1
; Послать команду EOI контроллеру прерываний
mov AL,20h
out 20h,AL
pop AX
pop DS
ret
FDCInterrupt ENDP
Теперь адреес этой процедуры надо повесить на вектор 6 прерывания.
Как вычислить где находиться этот вектор, та ячейка куда надо загрузить ?


Дата: Июн 21, 2004 17:15:41 · Поправил: Безпощадный даос

примерно так
void SetInterruptHandler (DWORD InterruptNumber,DWORD oldhandler,DWORD newhandler)
  { 
	  UCHAR idtbase[6]; 
	  _asm
	 
	  {   pushad
		  sidt fword ptr idtbase
		  cli
	          mov     eax,cr0
                  push    eax
		  pop     esi
		  and     eax,0xFFFEFFFF  // clear WP
		  mov     cr0,eax

	          mov     ebx,dword ptr [idtbase+2]
		  mov     eax,8
		  mov     ecx,InterruptNumber
        	  imul    ecx
		  add     ebx,eax         // ebx - vector offset
	          mov     dx,word ptr [ebx+6]
	          shl     edx,0x10
	          mov     dx,word ptr [ebx]
		  mov     edi, oldhandler
		  mov     [edi],edx
		 
	          mov	  edi,newhandler
		  mov     edx,[edi]
	          mov     word ptr [ebx],dx
	          shr     edx,0x10
	          mov     word ptr [ebx+6],dx
	          mov     byte ptr [ebx+5],0x8e // adjust DPL
		  mov     cr0,esi               // restore WP
                 sti 
		 popad
	  }
  }

void RestoreInterruptHandler(DWORD InterruptNumber,DWORD restoredhandler)
 {
     UCHAR idtbase[6];
	 
 _asm{    pushad
		sidt fword ptr idtbase
		cli
                mov     eax,cr0                // clear WP         
        	  push    eax
		  pop     esi
		  and     eax,0xFFFEFFFF
		  mov     cr0,eax
				  

		  mov     ebx,dword ptr [idtbase+2]
		  mov     eax,8
		  mov     ecx,InterruptNumber
		  imul    ecx
		  add     ebx,eax               // ebx - vector offset				  
		               
		  mov     edi,restoredhandler
		  mov     edx,[edi]
		  mov     word ptr [ebx],dx
		  shr     edx,0x10
		  mov     word ptr [ebx+6],dx
                  mov     byte ptr [ebx+5],0x8e // adjust DPL

		  mov     cr0,esi               // restore WP bit
	   sti

       popad		   

	 }
 }


Дата: Июн 22, 2004 17:11:01

Что то не получается
пишу вместо InterruptNumber -6;
а вместо newhandler FDCInterrupt


Дата: Июн 22, 2004 23:23:55

и не перехватывается :(


Дата: Июн 23, 2004 14:47:53

не знаю, может я с типами данных нетрадиционно намутил, но, мне так удобнее и понятно всё, как божий день. Только ты знаешь, чего такое int6 ? так вот это то самое #UD. Открой интелловские мануалы и почитай хорошенько, где говорится , что 20h первых интов используются для внутренних нужд процессора , либо зарезервированы(в защищенном режиме). А, если ты хочешь сделать перехват инта от флопика, то базовый вектор в NT = 30h, в 9X=50h/ оттуда и считай.

void HandlersController(DWORD status)
{
PVOID NewPS2Handler; // новый обработчик мыши
PVOID NewTimerHandler; // новый обработчик таймера


_asm lea eax,_NewPS2MouseHandler
_asm mov dword ptr NewPS2Handler,eax
_asm lea eax,_NewSystemTimerHandler
_asm mov dword ptr NewTimerHandler,eax

if (status == SetUserHandlers)
{
SetInterruptHandler(BaseIntOnIrq+InPS2MouseIRQ,&MouseIRQ12OldHandler,& NewPS2Handler); // мышь
SetInterruptHandler(BaseIntOnIrq+TimerClockIRQ,&TimerIRQ0OldHandler,&N ewTimerHandler); // таймер
}
if (status == SetSystemHandlers)
{
RestoreInterruptHandler(BaseIntOnIrq+InPS2MouseIRQ,&MouseIRQ12OldHandl er); // мышь
RestoreInterruptHandler(BaseIntOnIrq+TimerClockIRQ,&TimerIRQ0OldHandle r); // таймер
}


return;

_NewPS2MouseHandler: // мышь


_asm pushfd
_asm mov dword ptr testflag,1
_asm mov dword ptr Timer,0
_asm popfd
_asm jmp dword ptr [MouseIRQ12OldHandler]


_NewSystemTimerHandler: // системный таймер


_asm pushfd
_asm inc dword ptr Timer
_asm popfd
_asm jmp dword ptr [TimerIRQ0OldHandler]

}


Дата: Июл 2, 2004 17:15:07 · Поправил: rsrc

„... если ты хочешь сделать перехват инта от флопика, то базовый вектор в NT = 30h, в 9X=50h/ оттуда и считай.


Чтобы получить правильный вектор прерывания надо юзать HalGetInterruptVector(), а эти базы у меня в XP не катят!


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.051