|
|
| Посл.отвђт | Сообщен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 |