mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 09:03:25 +00:00
[NTOSKRNL]
Add support for debug pre/post syscall hooks, that can be registered from win32k. They only exist on DBG versions. svn path=/trunk/; revision=50823
This commit is contained in:
parent
7d2277a1ea
commit
ea5522e1d8
3 changed files with 59 additions and 1 deletions
|
@ -363,3 +363,12 @@ extern KD_CONTEXT KdpContext;
|
||||||
extern ULONG Kd_WIN2000_Mask;
|
extern ULONG Kd_WIN2000_Mask;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if DBG
|
||||||
|
#define ID_Win32PreServiceHook 'WSH0'
|
||||||
|
#define ID_Win32PostServiceHook 'WSH1'
|
||||||
|
typedef void (NTAPI *PKDBG_PRESERVICEHOOK)(ULONG, PULONG_PTR);
|
||||||
|
typedef ULONG_PTR (NTAPI *PKDBG_POSTSERVICEHOOK)(ULONG, ULONG_PTR);
|
||||||
|
extern PKDBG_PRESERVICEHOOK KeWin32PreServiceHook;
|
||||||
|
extern PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook;
|
||||||
|
#endif
|
||||||
|
|
|
@ -82,6 +82,23 @@ KdpServiceDispatcher(ULONG Service,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Register a debug callback */
|
||||||
|
case 'CsoR':
|
||||||
|
{
|
||||||
|
switch (Buffer1Length)
|
||||||
|
{
|
||||||
|
case ID_Win32PreServiceHook:
|
||||||
|
KeWin32PreServiceHook = Buffer1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_Win32PostServiceHook:
|
||||||
|
KeWin32PostServiceHook = Buffer1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Special case for stack frame dumps */
|
/* Special case for stack frame dumps */
|
||||||
case 'DsoR':
|
case 'DsoR':
|
||||||
{
|
{
|
||||||
|
|
|
@ -46,6 +46,10 @@ UCHAR KiTrapIoTable[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
|
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
|
||||||
|
#if DBG
|
||||||
|
PKDBG_PRESERVICEHOOK KeWin32PreServiceHook = NULL;
|
||||||
|
PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* TRAP EXIT CODE *************************************************************/
|
/* TRAP EXIT CODE *************************************************************/
|
||||||
|
@ -1443,6 +1447,28 @@ KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame)
|
||||||
KiDebugHandler(TrapFrame, TrapFrame->Eax, TrapFrame->Ecx, TrapFrame->Edx);
|
KiDebugHandler(TrapFrame, TrapFrame->Eax, TrapFrame->Ecx, TrapFrame->Edx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
VOID
|
||||||
|
KiDbgPreServiceHook(ULONG SystemCallNumber, PULONG_PTR Arguments)
|
||||||
|
{
|
||||||
|
#if DBG
|
||||||
|
if (SystemCallNumber >= 0x1000 && KeWin32PreServiceHook)
|
||||||
|
KeWin32PreServiceHook(SystemCallNumber, Arguments);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
ULONG_PTR
|
||||||
|
KiDbgPostServiceHook(ULONG SystemCallNumber, ULONG_PTR Result)
|
||||||
|
{
|
||||||
|
#if DBG
|
||||||
|
if (SystemCallNumber >= 0x1000 && KeWin32PostServiceHook)
|
||||||
|
return KeWin32PostServiceHook(SystemCallNumber, Result);
|
||||||
|
#endif
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
DECLSPEC_NORETURN
|
DECLSPEC_NORETURN
|
||||||
VOID
|
VOID
|
||||||
FORCEINLINE
|
FORCEINLINE
|
||||||
|
@ -1553,10 +1579,16 @@ KiSystemCall(IN PKTRAP_FRAME TrapFrame,
|
||||||
while (TRUE);
|
while (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Call pre-service debug hook */
|
||||||
|
KiDbgPreServiceHook(SystemCallNumber, Arguments);
|
||||||
|
|
||||||
/* Get the handler and make the system call */
|
/* Get the handler and make the system call */
|
||||||
Handler = (PVOID)DescriptorTable->Base[Id];
|
Handler = (PVOID)DescriptorTable->Base[Id];
|
||||||
Result = KiSystemCallTrampoline(Handler, Arguments, StackBytes);
|
Result = KiSystemCallTrampoline(Handler, Arguments, StackBytes);
|
||||||
|
|
||||||
|
/* Call post-service debug hook */
|
||||||
|
Result = KiDbgPostServiceHook(SystemCallNumber, Result);
|
||||||
|
|
||||||
/* Make sure we're exiting correctly */
|
/* Make sure we're exiting correctly */
|
||||||
KiExitSystemCallDebugChecks(Id, TrapFrame);
|
KiExitSystemCallDebugChecks(Id, TrapFrame);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue