Прерывание перехватывается изменением IDT, KeGetCurrentIrql всегда возвращает 0, даже после KeRaiseIrql.
Опробовал у себя в драйвере:
__asm
{
pushad
sidt [idtr]
lea ebx, [idtr]
mov ebx,[ebx+2] //adddress if IDT
add ebx,8 //address of INT 1 descriptor
lea eax,[irq1]
mov edi,[ebx]
mov esi,[ebx+4]
mov [eax],edi
mov [eax+4], esi
//setup new idt entry
lea eax, __int1
mov [ebx],ax
shr eax,16
mov [ebx+6],ax
push cs
pop eax
mov [ebx+2],ax
mov byte ptr[ebx+4],0
mov byte ptr[ebx+5],10001111b
pushfd
or dword ptr ss:[esp],100h //TF set
popfd
nop //int1
jmp __over
///int1 handler begin
__int1:
nop
}
KeRaiseIrql(DISPATCH_LEVEL, &irql_old);
irql_now = KeGetCurrentIrql();
__asm{
cmp [irql_now], PASSIVE_LEVEL
je _endbeep
//Do beep begin
mov al, 7
out 61h, al
mov eax, 0FFFFFFFh
_lp: dec eax
nop
nop
nop
jnz _lp
out 61h, al
//do beep end
_endbeep:
nop
}
KeLowerIrql(irql_old);
__asm{
mov eax,[esp+8]
and ah,0FEh //tf clear
mov [esp+8], eax
iretd
///int1 handler end
nop
__over: //restore old vector
lea eax, [irq1]
mov esi,[eax]
mov edi,[eax+4]
mov [ebx],esi
mov [ebx+4],edi
popad
};
Бип слышу всегда..
Irql при возникновении прерывания устанавливается аппаратно процессором, так как к памяти обратиться не удается.
Не знаю, не знаю.. Вот я проверил и точно установил, что по крайней мере у меня IRQL внутри обработчика будет такой же какой в момент возникновения прерывания. Так-что если оно генерится под юзермодом то кроме PASSIVE_LEVEL ничего и не будет, это проверено (немного видоизменил код: DPL=3+елемент IDT не восстанавливается)..
А как ты вообще смотрел что возвращает KeGetCurrentIrql (уж не отладчиком ли?)? Может тут какая ошибка затесалась?