哪个 ETHREAD 数据成员提供当前执行线程的起始地址(代码开始)?

Which ETHREAD data member provides starting address (start of code) of the current executing thread?

谁能告诉我ETHREAD结构的哪个数据成员提供了当前执行线程的起始地址?它会是以下转储中看到的 StartAddress 数据成员吗?我正在寻找给定 ETHREAD 数据对象的代码起始地址。我不确定 _ETHREAD 是否包含此详细信息。

    lkd> dt _ETHREAD
    nt!_ETHREAD
   +0x000 Tcb              : _KTHREAD
   +0x5d0 CreateTime       : _LARGE_INTEGER
   +0x5d8 ExitTime         : _LARGE_INTEGER
   +0x5d8 KeyedWaitChain   : _LIST_ENTRY
   +0x5e8 ChargeOnlySession : Ptr64 Void
   +0x5f0 PostBlockList    : _LIST_ENTRY
   +0x5f0 ForwardLinkShadow : Ptr64 Void
   +0x5f8 **StartAddress**     : Ptr64 Void
   +0x600 TerminationPort  : Ptr64 _TERMINATION_PORT
   +0x600 ReaperLink       : Ptr64 _ETHREAD
   ....

   +0x6bd SuppressSymbolLoad : Pos 3, 1 Bit
   +0x6bd Prefetching      : Pos 4, 1 Bit
   +0x6bd OwnsVadExclusive : Pos 5, 1 Bit
   +0x6bd OwnsChangeControlAreaExclusive : Pos 6, 1 Bit
   +0x6bd OwnsChangeControlAreaShared : Pos 7, 1 Bit
   +0x6be OwnsPagedPoolWorkingSetExclusive : Pos 0, 1 Bit
   +0x6be OwnsPagedPoolWorkingSetShared : Pos 1, 1 Bit
   +0x6be OwnsSystemPtesWorkingSetExclusive : Pos 2, 1 Bit
   +0x6be OwnsSystemPtesWorkingSetShared : Pos 3, 1 Bit
   +0x6be TrimTrigger      : Pos 4, 2 Bits
   +0x6be Spare2           : Pos 6, 2 Bits
   +0x6bf SystemPagePriorityActive : Pos 0, 1 Bit
   +0x6bf SystemPagePriority : Pos 1, 3 Bits
   +0x6bf Spare3           : Pos 4, 4 Bits
   +0x6c0 CacheManagerActive : UChar
   +0x6c1 DisablePageFaultClustering : UChar
   +0x6c2 ActiveFaultCount : UChar
   +0x6c3 LockOrderState   : UChar
   +0x6c8 AlpcMessageId    : Uint8B
   +0x6d0 AlpcMessage      : Ptr64 Void
   +0x6d0 AlpcReceiveAttributeSet : Uint4B
   +0x6d8 ExitStatus       : Int4B
   +0x6e0 AlpcWaitListEntry : _LIST_ENTRY
   +0x6f0 CacheManagerCount : Uint4B
   +0x6f4 IoBoostCount     : Uint4B
   +0x6f8 BoostList        : _LIST_ENTRY
   +0x708 DeboostList      : _LIST_ENTRY
   +0x718 BoostListLock    : Uint8B
   +0x720 IrpListLock      : Uint8B
   +0x728 ReservedForSynchTracking : Ptr64 Void
   +0x730 CmCallbackListHead : _SINGLE_LIST_ENTRY
   +0x738 ActivityId       : Ptr64 _GUID
   +0x740 SeLearningModeListHead : _SINGLE_LIST_ENTRY
   +0x748 VerifierContext  : Ptr64 Void
   +0x750 KernelStackReference : Uint4B
   +0x758 AdjustedClientToken : Ptr64 Void
   +0x760 UserFsBase       : Uint4B
   +0x768 UserGsBase       : Uint8B
   +0x770 PicoContext      : Ptr64 Void

从调试的角度来看,是的,初始函数存储在 StartAddress 中,更有用的“唯一”用户模式地址在 Win32StartAddress.

但是有两件事要记住:

  1. StartAddress 与另一个成员在 union 中,在执行部分代码后可能无效。
  2. StartAddress 是一个结构的一部分,它在版本之间变化很大,它的偏移量不稳定,所以你不应该在驱动程序中使用它,只能在调试时使用它。

真正的产品应该使用类似 PsSetCreateThreadNotifyRoutine 的东西,而不是从不稳定的系统结构中读取。