- Call KiDispatchInterrupt through an interrupt gate instead of directly.

svn path=/trunk/; revision=23657
This commit is contained in:
Alex Ionescu 2006-08-23 00:49:35 +00:00
parent bbd5e3237f
commit 44804d565e
2 changed files with 5 additions and 3 deletions

View file

@ -626,14 +626,15 @@ _HalpEndSoftwareInterrupt@4:
SoftwareInt: SoftwareInt:
/* Check if there are pending software interrupts */ /* Check if there are pending software interrupts */
mov [fs:KPCR_IRQL], cl mov [fs:KPCR_IRQL], cl
#if 0
mov eax, [fs:KPCR_IDR] mov eax, [fs:KPCR_IDR]
mov al, SoftIntByteTable[eax] mov al, SoftIntByteTable[eax]
cmp al, cl cmp al, cl
ja DoCall2 ja DoCall2
#endif
ret 4 ret 4
DoCall2: DoCall2:
/* There are pending softwate interrupts, call their handlers */ /* There are pending softwate interrupts, call their handlers */
add esp, 8 add esp, 8
jmp SoftIntHandlerTable2[eax*4] jmp SoftIntHandlerTable2[eax*4]

View file

@ -23,6 +23,8 @@ UCHAR Table[8] =
2, 2, 2, 2 2, 2, 2, 2
}; };
VOID HalpDispatchInterrupt(VOID);
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
extern ULONG KiI8259MaskTable[]; extern ULONG KiI8259MaskTable[];
@ -55,8 +57,7 @@ HalpLowerIrql(KIRQL NewIrql)
{ {
if (Table[KeGetPcr()->IRR] == DISPATCH_LEVEL) if (Table[KeGetPcr()->IRR] == DISPATCH_LEVEL)
{ {
KeGetPcr()->IRR &= ~4; HalpDispatchInterrupt();
KiDispatchInterrupt();
} }
} }
KeGetPcr()->Irql = APC_LEVEL; KeGetPcr()->Irql = APC_LEVEL;