extern ULONG Kd_WIN2000_Mask;
#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
case EnterDebugger:
DbgBreakPoint();
break;
-
+
case KdSpare3:
MmDumpArmPfnDatabase(FALSE);
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 */
case 'DsoR':
{
};
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
+#if DBG
+PKDBG_PRESERVICEHOOK KeWin32PreServiceHook = NULL;
+PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook = NULL;
+#endif
/* TRAP EXIT CODE *************************************************************/
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
VOID
FORCEINLINE
while (TRUE);
}
+ /* Call pre-service debug hook */
+ KiDbgPreServiceHook(SystemCallNumber, Arguments);
+
/* Get the handler and make the system call */
Handler = (PVOID)DescriptorTable->Base[Id];
Result = KiSystemCallTrampoline(Handler, Arguments, StackBytes);
+ /* Call post-service debug hook */
+ Result = KiDbgPostServiceHook(SystemCallNumber, Result);
+
/* Make sure we're exiting correctly */
KiExitSystemCallDebugChecks(Id, TrapFrame);