From d9d963a62fd3dcea3879d5fc0cc612bbedc2e6bd Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 18 Nov 2013 17:23:04 +0000 Subject: [PATCH] [NTOSKRNK] Implement KiCallbackReturnHandler svn path=/trunk/; revision=61040 --- reactos/ntoskrnl/ke/i386/traphdlr.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) 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);