typedef struct _KERNEL_STACK_SEGMENT
{
ULONG_PTR StackBase;
ULONG_PTR StackLimit;
ULONG_PTR KernelStack;
ULONG_PTR InitialStack;
ULONG_PTR ActualLimit;
} KERNEL_STACK_SEGMENT, *PKERNEL_STACK_SEGMENT;
typedef struct _KERNEL_STACK_CONTROL
{
union {
XMM_SAVE_AREA32 XmmSaveArea;
struct {
UCHAR Fill[sizeof(XMM_SAVE_AREA32) - 2 * sizeof(KERNEL_STACK_SEGMENT)];
KERNEL_STACK_SEGMENT Current;
KERNEL_STACK_SEGMENT Previous;
};
};
} KERNEL_STACK_CONTROL, *PKERNEL_STACK_CONTROL;
typedef struct _KTHREAD {
DISPATCHER_HEADER Header;
LIST_ENTRY MutantListHead;
PVOID InitialStack;
PVOID StackLimit;
PVOID KernelStack;
} KTHREAD, *PKTHREAD, *PRKTHREAD;
typedef struct _ETHREAD {
KTHREAD Tcb;
} ETHREAD, *PETHREAD;
#define KERNEL_STACK_CONTROL_LENGTH sizeof(KERNEL_STACK_CONTROL)
#define KTRAP_FRAME_LENGTH sizeof(KTRAP_FRAME)
FORCEINLINE PKTRAP_FRAME PspGetBaseTrapFrame(PETHREAD Thread)
{
ULONG64 InitialStack;
PKERNEL_STACK_CONTROL StackControl;
InitialStack = (ULONG64)Thread->Tcb.InitialStack;
StackControl = (PKERNEL_STACK_CONTROL)InitialStack;
while (StackControl->Previous.StackBase != 0)
{
InitialStack = StackControl->Previous.InitialStack;
StackControl = (PKERNEL_STACK_CONTROL)InitialStack;
}
return (PKTRAP_FRAME)(InitialStack - KTRAP_FRAME_LENGTH);
}
PspGetBaseTrapFrame(x64)
于 2014-04-05 22:26:49 首次发布