From 9b19bc94b3a2d74134458f718f7bc2522d2fa1ce Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Thu, 26 Mar 2026 23:10:00 +0100 Subject: [PATCH] Replace manual IDT manipulation with SetIdtGate function call --- xtoskrnl/includes/ar/amd64/procsup.hh | 14 +++++++------- xtoskrnl/includes/ar/i686/procsup.hh | 14 +++++++------- xtoskrnl/ke/amd64/irq.cc | 10 +++++++--- xtoskrnl/ke/i686/irq.cc | 9 +++++++-- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/xtoskrnl/includes/ar/amd64/procsup.hh b/xtoskrnl/includes/ar/amd64/procsup.hh index 949e8c2..4cad247 100644 --- a/xtoskrnl/includes/ar/amd64/procsup.hh +++ b/xtoskrnl/includes/ar/amd64/procsup.hh @@ -31,6 +31,13 @@ namespace AR OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize); STATIC XTAPI VOID InitializeProcessor(IN PVOID ProcessorStructures); + STATIC XTAPI VOID SetIdtGate(IN PKIDTENTRY Idt, + IN USHORT Vector, + IN PVOID Handler, + IN USHORT Selector, + IN USHORT Ist, + IN USHORT Dpl, + IN USHORT Type); private: STATIC XTAPI VOID IdentifyProcessor(VOID); @@ -62,13 +69,6 @@ namespace AR STATIC XTAPI VOID SetGdtEntryBase(IN PKGDTENTRY Gdt, IN USHORT Selector, IN ULONG_PTR Base); - STATIC XTAPI VOID SetIdtGate(IN PKIDTENTRY Idt, - IN USHORT Vector, - IN PVOID Handler, - IN USHORT Selector, - IN USHORT Ist, - IN USHORT Dpl, - IN USHORT Type); }; } diff --git a/xtoskrnl/includes/ar/i686/procsup.hh b/xtoskrnl/includes/ar/i686/procsup.hh index 14122cb..2b4931f 100644 --- a/xtoskrnl/includes/ar/i686/procsup.hh +++ b/xtoskrnl/includes/ar/i686/procsup.hh @@ -34,6 +34,13 @@ namespace AR OUT PVOID *TrampolineCode, OUT PULONG_PTR TrampolineSize); STATIC XTAPI VOID InitializeProcessor(IN PVOID ProcessorStructures); + STATIC XTAPI VOID SetIdtGate(IN PKIDTENTRY Idt, + IN USHORT Vector, + IN PVOID Handler, + IN USHORT Selector, + IN USHORT Ist, + IN USHORT Dpl, + IN USHORT Type); private: STATIC XTAPI VOID IdentifyProcessor(VOID); @@ -67,13 +74,6 @@ namespace AR STATIC XTAPI VOID SetGdtEntryBase(IN PKGDTENTRY Gdt, IN USHORT Selector, IN ULONG_PTR Base); - STATIC XTAPI VOID SetIdtGate(IN PKIDTENTRY Idt, - IN USHORT Vector, - IN PVOID Handler, - IN USHORT Selector, - IN USHORT Ist, - IN USHORT Dpl, - IN USHORT Type); STATIC XTAPI VOID SetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock, IN PVOID KernelFaultStack); diff --git a/xtoskrnl/ke/amd64/irq.cc b/xtoskrnl/ke/amd64/irq.cc index 0d39623..209cd7c 100644 --- a/xtoskrnl/ke/amd64/irq.cc +++ b/xtoskrnl/ke/amd64/irq.cc @@ -33,7 +33,11 @@ KE::Irq::SetInterruptHandler(IN ULONG Vector, ProcessorBlock = KE::Processor::GetCurrentProcessorBlock(); /* Update interrupt handler */ - ProcessorBlock->IdtBase[(UCHAR) Vector].OffsetLow = ((ULONG_PTR)Handler & 0xFFFF); - ProcessorBlock->IdtBase[(UCHAR) Vector].OffsetMiddle = (((ULONG_PTR)Handler >> 16) & 0xFFFF); - ProcessorBlock->IdtBase[(UCHAR) Vector].OffsetHigh = (ULONG_PTR)Handler >> 32; + AR::ProcSup::SetIdtGate(ProcessorBlock->IdtBase, + Vector, + Handler, + KGDT_R0_CODE, + 0, + KIDT_ACCESS_RING0, + AMD64_INTERRUPT_GATE); } diff --git a/xtoskrnl/ke/i686/irq.cc b/xtoskrnl/ke/i686/irq.cc index 556d006..9e33c7c 100644 --- a/xtoskrnl/ke/i686/irq.cc +++ b/xtoskrnl/ke/i686/irq.cc @@ -33,6 +33,11 @@ KE::Irq::SetInterruptHandler(IN ULONG Vector, ProcessorBlock = KE::Processor::GetCurrentProcessorBlock(); /* Update interrupt handler */ - ProcessorBlock->IdtBase[(UCHAR) Vector].Offset = (USHORT)((ULONG)Handler & 0xFFFF); - ProcessorBlock->IdtBase[(UCHAR) Vector].ExtendedOffset = (USHORT)((ULONG)Handler >> 16); + AR::ProcSup::SetIdtGate(ProcessorBlock->IdtBase, + Vector, + Handler, + KGDT_R0_CODE, + 0, + KIDT_ACCESS_RING0, + I686_INTERRUPT_GATE); }