【问题标题】:Where is a usermode thread context stored, and is it possible to modify?用户模式线程上下文存储在哪里,是否可以修改?
【发布时间】:2017-06-03 17:54:14
【问题描述】:

我想知道是否有人知道在用户模式下运行的线程的上下文存储在内核中的什么位置?以及是否有任何 API 用于处理获取和设置用户模式线程上下文?我知道你不应该出于任何原因这样做,所以请不要绕道。这只是为了研究,除了我自己的本地项目之外,不会被其他任何东西使用。

在用户模式下,我们有 GetThreadContext 和 SetThreadContext,但我需要从内核中的设备驱动程序执行此操作,我希望我有更多的东西要写,但我根本找不到关于这个主题的任何信息,所以我希望有人更多比我受过良好教育的人可以在这里启发我手头的一些 Windows 内部结构。

问候帕兹。

【问题讨论】:

    标签: windows kernel driver device-driver internals


    【解决方案1】:

    当线程进入内核模式时,它的上下文存储在它的内核堆栈中,在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

    【讨论】:

    • 是的,当线程处于内核模式时,但是在用户模式下运行的线程呢?这同样适用于用户模式线程吗?
    • @Paze - 你完全理解我写的东西吗?你有知识窗口内部吗?!你问什么?
    • 老兄,你不必对此无礼。是的,我确实了解 Windows 内部结构。我不是专家,我还在学习。您说当线程进入内核模式时,其上下文存储在内核堆栈中,在 _KTRAP_FRAME 结构中,我的问题是当线程进入用户模式时上下文是否仍存储在同一结构中?或者上下文存储在哪里?
    • @Paze - 当线程返回用户模式时,它的上下文不需要存储。为了什么 ?这是毫无意义的 - 线程正在运行 - 所以上下文一直在变化。再次 - 为了获取线程的上下文 - 我们将 apc 注入他。当线程下次进入内核模式时(真的线程只有很短的时间可以在用户模式下连续执行) - 他弹出并执行这个apc。并从KTRAP_FRAME 填充上下文
    • @Paze,只有两种情况会保存上下文:当线程转换到内核模式但继续运行时,或者当线程被换出时。 AFAIK,无论哪种情况,它的工作原理都是一样的,并且可以按照 RbMm 描述的方式恢复上下文。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2022-12-24
    • 2019-03-16
    相关资源
    最近更新 更多