diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index 70fe0cd80dc..42422838a58 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -236,7 +236,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, IN PFX_SAVE_AREA SaveArea) { ULONG Cr0, Mask, Error, ErrorOffset, DataOffset; - + /* Check for VDM trap */ ASSERT((KiVdmTrap(TrapFrame)) == FALSE); @@ -245,7 +245,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, { /* Kernel might've tripped a delayed error */ SaveArea->Cr0NpxState |= CR0_TS; - + /* Only valid if it happened during a restore */ //if ((PVOID)TrapFrame->Eip == FrRestore) { @@ -1455,7 +1455,16 @@ VOID FASTCALL KiCallbackReturnHandler(IN PKTRAP_FRAME TrapFrame) { - UNIMPLEMENTED_DBGBREAK(); + NTSTATUS Status; + + /* Pass the register parameters to NtCallbackReturn. + Result pointer is in ecx, result length in edx, status in eax */ + Status = NtCallbackReturn((PVOID)TrapFrame->Ecx, + TrapFrame->Edx, + TrapFrame->Eax); + + /* If we got here, something went wrong. Return an error to the caller */ + KiServiceExit(TrapFrame, Status); } DECLSPEC_NORETURN @@ -1567,7 +1576,7 @@ KiSystemCall(IN PKTRAP_FRAME TrapFrame, /* Decode the system call number */ Offset = (SystemCallNumber >> SERVICE_TABLE_SHIFT) & SERVICE_TABLE_MASK; Id = SystemCallNumber & SERVICE_NUMBER_MASK; - + /* Get descriptor table */ DescriptorTable = (PVOID)((ULONG_PTR)Thread->ServiceTable + Offset);