存储用户模式线程上下文的位置,是否可以修改?

时间:2017-01-19 06:09:18

标签: windows kernel driver device-driver internals

我想知道是否有人知道在usermode中运行的线程的上下文存储在内核中?如果有任何API用于处理获取和设置用户模式线程上下文?我知道你不应该出于任何原因这样做,所以请不要偏向于此。这仅仅是为了研究,除了我自己的本地项目之外别无其他用途。

在usermode中我们有GetThreadContext和SetThreadContext,但是我需要从内核中的设备驱动程序执行此操作,我希望我有更多的内容可以写,但我根本无法找到有关此主题的任何信息,所以我希望一个比我受过更多教育的人可以在这里的一些窗户内部启发我。

关心Paze。

1 个答案:

答案 0 :(得分:2)

当线程进入内核模式时,它将上下文存储在内核堆栈中struct _KTRAP_FRAME - 它在ntdkk.h中声明。在ntoskrnl.exe(从win2000到win10的所有版本)都存在导出的api

NTKERNELAPI
NTSTATUS
NTAPI
PsGetContextThread(
    __in PETHREAD Thread,
    __inout PCONTEXT ThreadContext,
    __in KPROCESSOR_MODE Mode
    );

你可以用它来获取线程上下文(和PsSetContextThread用于设置线程上下文)。

关于如何工作 - 查看wrk - 当您尝试从另一个线程获取/设置上下文时,特殊内核模式APC被插入到此线程中,并指向内部GETSETCONTEXT结构,在此请求者开始等待此结构的事件(OperationComplete)之后。当线程(我们查询上下文)下次开始在内核中执行时 - APC例程(PspGetSetContextSpecialApc)被执行 - 它填充来自_KTRAP_FRAME的上下文并设置事件(OperationComplete