Windows 用户模式线程上下文存储在哪里,是否可以修改?

Windows 用户模式线程上下文存储在哪里,是否可以修改?,windows,kernel,driver,device-driver,internals,Windows,Kernel,Driver,Device Driver,Internals,我想知道是否有人知道在用户模式下运行的线程的上下文存储在内核中的什么位置?如果有任何API用于获取和设置用户模式线程上下文?我知道你不应该出于任何原因这样做,所以请不要偏离正题。这仅仅是为了研究,除了我自己的本地项目之外,不会被其他任何东西使用 在usermode中,我们有GetThreadContext和SetThreadContext,但我需要从内核中的设备驱动程序执行此操作,我希望我有更多的内容要写,但我找不到关于此主题的任何信息,因此我希望比我受过更多教育的人能够在这里向我介绍一些win

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

在usermode中,我们有GetThreadContext和SetThreadContext,但我需要从内核中的设备驱动程序执行此操作,我希望我有更多的内容要写,但我找不到关于此主题的任何信息,因此我希望比我受过更多教育的人能够在这里向我介绍一些windows内部结构


关于Paze。

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

NTKERNELAPI
NTSTATUS
NTAPI
PsGetContextThread(
    __in PETHREAD Thread,
    __inout PCONTEXT ThreadContext,
    __in KPROCESSOR_MODE Mode
    );
您可以将其用于获取线程上下文(以及设置线程上下文)


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

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

NTKERNELAPI
NTSTATUS
NTAPI
PsGetContextThread(
    __in PETHREAD Thread,
    __inout PCONTEXT ThreadContext,
    __in KPROCESSOR_MODE Mode
    );
您可以将其用于获取线程上下文(以及设置线程上下文)


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

是的,当线程处于内核模式时,但是在用户模式下运行的线程如何?这同样适用于usermode线程吗?@Paze-你完全理解我写的东西吗?你有windows内部的知识吗?!关于你问什么?老兄,你不必太粗鲁。。是的,我确实了解windows内部结构。。我不是专家,我还在学习。您说过当线程进入内核模式时,其上下文存储在内核堆栈中,在_KTRAP_FRAME结构中,我的问题是当线程进入usermode时,上下文是否仍然存储在相同的结构中?或者上下文存储在哪里?@Paze-当线程返回到用户模式时,上下文不需要存储。为什么?这是毫无意义的——线程正在运行——所以上下文一直在变化。同样,为了获取线程的上下文,我们向他注入了apc。当线程下一次进入内核模式时(实际上线程只有很短的时间才能在用户模式下连续执行),他弹出并执行这个apc。从
KTRAP\u FRAME
@Paze填充上下文,只有两种情况下会保存上下文:当线程转换到内核模式但继续运行时,或者当线程被调出时。好吧,这两种情况下都是一样的,上下文可以按照RbMm所描述的那样恢复。是的,当线程处于内核模式时,那么线程在用户模式下运行呢?这同样适用于usermode线程吗?@Paze-你完全理解我写的东西吗?你有windows内部的知识吗?!关于你问什么?老兄,你不必太粗鲁。。是的,我确实了解windows内部结构。。我不是专家,我还在学习。您说过当线程进入内核模式时,其上下文存储在内核堆栈中,在_KTRAP_FRAME结构中,我的问题是当线程进入usermode时,上下文是否仍然存储在相同的结构中?或者上下文存储在哪里?@Paze-当线程返回到用户模式时,上下文不需要存储。为什么?这是毫无意义的——线程正在运行——所以上下文一直在变化。同样,为了获取线程的上下文,我们向他注入了apc。当线程下一次进入内核模式时(实际上线程只有很短的时间才能在用户模式下连续执行),他弹出并执行这个apc。从
KTRAP\u FRAME
@Paze填充上下文,只有两种情况下会保存上下文:当线程转换到内核模式但继续运行时,或者当线程被调出时。好吧,这两种情况下都是一样的,上下文可以按照RbMm所描述的方式恢复。