diff --git a/ntoskrnl/ke/i386/irqobj.c b/ntoskrnl/ke/i386/irqobj.c index 8fb51f76b1..3a3476a622 100644 --- a/ntoskrnl/ke/i386/irqobj.c +++ b/ntoskrnl/ke/i386/irqobj.c @@ -207,6 +207,56 @@ KiInterruptDispatch(IN PKTRAP_FRAME TrapFrame, Interrupt->Vector, &OldIrql)) { + ULONG_PTR stackLow, stackHigh; + ULONG_PTR stackRemaining; + IoGetStackLimits(&stackLow, &stackHigh); + stackRemaining = (ULONG_PTR)&stackRemaining - stackLow; + if (stackRemaining < PAGE_SIZE / 2) + { + ULONG i; + PVOID *p = (PVOID *)&stackRemaining; + DPRINT1("KiInterruptDispatch: called with only 0x%Ix bytes of stack remaining\n", stackRemaining); + DPRINT1("KiInterruptDispatch: Stack is %p-%p, we are now at %p\n", stackLow, stackHigh, &stackRemaining); + { + PLIST_ENTRY ListEntry; + PLDR_DATA_TABLE_ENTRY LdrEntry; + + DPRINT1("PsLoadedModuleList:\n"); + ListEntry = PsLoadedModuleList.Flink; + while (ListEntry != &PsLoadedModuleList) + { + CHAR Buffer[64]; + LdrEntry = CONTAINING_RECORD(ListEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + ListEntry = ListEntry->Flink; + for (i = 0; i < LdrEntry->BaseDllName.Length / sizeof(WCHAR); i++) + { + Buffer[i] = LdrEntry->BaseDllName.Buffer[i]; + } + Buffer[i] = 0; + DPRINT1("%p-%p %s\n", + LdrEntry->DllBase, + (PUCHAR)LdrEntry->DllBase + LdrEntry->SizeOfImage, + Buffer); + } + } + DPRINT1("Stack dump (current frame %p):\n", _AddressOfReturnAddress()); + for (i = 0; i < 4 * PAGE_SIZE / sizeof(PVOID); i += 8) + { + if (&p[i+8] > (PVOID*)stackHigh || + ((ULONG_PTR)p <= stackLow && (ULONG_PTR)&p[i+8] % PAGE_SIZE != (ULONG_PTR)&p[i] % PAGE_SIZE)) + { + break; + } + DPRINT1("%p: %p %p %p %p %p %p %p %p\n", + &p[i], + p[i], p[i+1], p[i+2], p[i+3], + p[i+4], p[i+5], p[i+6], p[i+7]); + } + __debugbreak(); + } + /* Acquire interrupt lock */ KxAcquireSpinLock(Interrupt->ActualLock); @@ -303,16 +353,16 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, } } -VOID +PKI_INTERRUPT_DISPATCH FASTCALL -KiInterruptTemplateHandler(IN PKTRAP_FRAME TrapFrame, - IN PKINTERRUPT Interrupt) +KiInterruptTemplateHandler2(IN PKTRAP_FRAME TrapFrame, + IN PKINTERRUPT Interrupt) { /* Enter interrupt frame */ KiEnterInterruptTrap(TrapFrame); - /* Call the correct dispatcher */ - ((PKI_INTERRUPT_DISPATCH)Interrupt->DispatchAddress)(TrapFrame, Interrupt); + /* Return the correct dispatcher */ + return (PKI_INTERRUPT_DISPATCH)Interrupt->DispatchAddress; } diff --git a/ntoskrnl/ke/i386/trap.s b/ntoskrnl/ke/i386/trap.s index 01d130e7e6..8b25e463e3 100644 --- a/ntoskrnl/ke/i386/trap.s +++ b/ntoskrnl/ke/i386/trap.s @@ -123,7 +123,18 @@ TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE TRAP_ENTRY KiUnexpectedInterruptTail, 0 ALIGN 4 -EXTERN @KiInterruptTemplateHandler@8:PROC +EXTERN @KiInterruptTemplateHandler2@8:PROC +PUBLIC @KiInterruptTemplateHandler@8 +.PROC @KiInterruptTemplateHandler@8 + push ecx + push edx + call @KiInterruptTemplateHandler2@8 + pop edx + pop ecx + jmp eax +.ENDP + +ALIGN 4 PUBLIC _KiInterruptTemplate _KiInterruptTemplate: KiEnterTrap KI_PUSH_FAKE_ERROR_CODE diff --git a/ntoskrnl/ke/i386/traphdlr.c b/ntoskrnl/ke/i386/traphdlr.c index 27ae26c805..156d2c5c0a 100644 --- a/ntoskrnl/ke/i386/traphdlr.c +++ b/ntoskrnl/ke/i386/traphdlr.c @@ -138,10 +138,10 @@ KiEoiHelper(IN PKTRAP_FRAME TrapFrame) if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame); /* Check if we have single stepping enabled */ - if (TrapFrame->EFlags & EFLAGS_TF) KiTrapReturnNoSegments(TrapFrame); + //if (TrapFrame->EFlags & EFLAGS_TF) KiTrapReturnNoSegments(TrapFrame); /* Exit the trap to kernel mode */ - KiTrapReturnNoSegmentsRet8(TrapFrame); + KiTrapReturnNoSegments(TrapFrame); } DECLSPEC_NORETURN