哪个 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
.
中
但是有两件事要记住:
StartAddress
与另一个成员在 union
中,在执行部分代码后可能无效。
StartAddress
是一个结构的一部分,它在版本之间变化很大,它的偏移量不稳定,所以你不应该在驱动程序中使用它,只能在调试时使用它。
真正的产品应该使用类似 PsSetCreateThreadNotifyRoutine
的东西,而不是从不稳定的系统结构中读取。
谁能告诉我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
.
但是有两件事要记住:
StartAddress
与另一个成员在union
中,在执行部分代码后可能无效。StartAddress
是一个结构的一部分,它在版本之间变化很大,它的偏移量不稳定,所以你不应该在驱动程序中使用它,只能在调试时使用它。
真正的产品应该使用类似 PsSetCreateThreadNotifyRoutine
的东西,而不是从不稳定的系统结构中读取。