From: Timo Kreuzer Date: Fri, 4 Jun 2010 10:51:44 +0000 (+0000) Subject: [NTOSKRNL] X-Git-Tag: backups/header-work@57446~11^2~73 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=a95f10c4760181cc1e80fb053902192b1561d6d4 [NTOSKRNL] Implement KeRegisterInterruptHandler and KeQueryInterruptHandler for amd64 svn path=/trunk/; revision=47564 --- diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index 2e43edc248d..482f614754a 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -157,6 +157,52 @@ KiRundownThread(IN PKTHREAD Thread) #endif } +/* Registers an interrupt handler with an IDT vector */ +FORCEINLINE +VOID +KeRegisterInterruptHandler(IN ULONG Vector, + IN PVOID Handler) +{ + UCHAR Entry; + PKIDTENTRY64 Idt; + + /* Get the entry from the HAL */ + Entry = HalVectorToIDTEntry(Vector); + + /* Now set the data */ + Idt = &KeGetPcr()->IdtBase[Entry]; + Idt->OffsetLow = (ULONG_PTR)Handler & 0xffff; + Idt->OffsetMiddle = ((ULONG_PTR)Handler >> 16) & 0xffff; + Idt->OffsetHigh = (ULONG_PTR)Handler >> 32; + Idt->Selector = KGDT64_R0_CODE; + Idt->IstIndex = 0; + Idt->Type = 0x0e; + Idt->Dpl = 0; + Idt->Present = 1; + Idt->Reserved0 = 0; + Idt->Reserved1 = 0; +} + +/* Returns the registered interrupt handler for a given IDT vector */ +FORCEINLINE +PVOID +KeQueryInterruptHandler(IN ULONG Vector) +{ + UCHAR Entry; + PKIDTENTRY64 Idt; + + /* Get the entry from the HAL */ + Entry = HalVectorToIDTEntry(Vector); + + /* Get the IDT entry */ + Idt = &KeGetPcr()->IdtBase[Entry]; + + /* Return the address */ + return (PVOID)((ULONG64)Idt->OffsetHigh << 32 | + (ULONG64)Idt->OffsetMiddle << 16 | + (ULONG64)Idt->OffsetLow); +} + VOID FORCEINLINE KiEndInterrupt(IN KIRQL Irql,