【问题标题】:Official way to get the Thread Information/Environment Block (TIB/TEB)获取线程信息/环境块(TIB/TEB)的官方方式
【发布时间】:2013-08-18 16:03:49
【问题描述】:

在 Windows 中,如果没有记录的话,很早就知道当前线程的线程信息块 (TIB) 可以在 FS:0 找到。但这仅适用于首先存在 FS 寄存器的 Intel CPU。现在我想在基于 ARM 的 Windows 系统(Windows Phone 和 Windows RT)上使用 TIB。请问有API吗?

编辑:我想获取线程堆栈库以用于崩溃报告。

关于 TIB/TEB 的信息:http://www.microsoft.com/msj/archive/S2CE.aspx

【问题讨论】:

  • 你想具体提取什么?可能有一个 API 适合您的需求,不需要像这样的 hack。
  • 栈顶,用于转储栈,用于崩溃报告。
  • 从异常指针中包含的上下文记录中获取堆栈指针。或者直接从 sp 寄存器中读取。
  • 陈雷蒙德?真的??哇哦。 hyperventilates 无论如何,我的措辞不好。堆栈底部,然后。堆栈的高地址端。堆栈增长的地方。 SP很容易抓住,我已经这样做了。

标签: windows winapi windows-runtime


【解决方案1】:

winnt.h 中的宏 NtCurrentTeb() 可用于所有受支持的架构,包括 ARM (Windows RT):

#if defined(_M_ARM) && !defined(__midl) && !defined(_M_CEE_PURE)

__forceinline
struct _TEB *
NtCurrentTeb (
    VOID
    )
{
    return (struct _TEB *)(ULONG_PTR)_MoveFromCoprocessor(CP15_TPIDRURW);
}

【讨论】:

    【解决方案2】:

    要回答您发布的问题,您可以使用NtQueryInformationThread() 检索THREAD_BASIC_INFORMATION 结构,该结构在其TebBaseAddress 成员中包含指向线程TIB 的指针。

    【讨论】:

    • 我更喜欢伊戈尔的回答 :)
    【解决方案3】:

    伊戈尔成功了。但仅供参考,在 ARM 汇编中是这样的:

    mrc p15, 0, r12, c13, c0, 2 ; r12 now points at TEB/TIB
    ldr r12, [r12, #4] ; r12 now holds stack base
    

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2015-10-29
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      相关资源
      最近更新 更多