Windbg ethread - IrpList位置

时间:2013-07-31 15:07:13

标签: windows debugging memory windbg

我目前正在努力理解Windbg的输出。

我要做的是找出在特定线程中有多少个IRP(中断请求数据包)排队,所以这就是我目前所拥有的:

lkd> !thread
THREAD fffffa8001fce270
IRP List:
fffffa8001cf3b60
...

所以这告诉我当前线程的列表中有一个IRP,它是地址。

但是,下一个命令让我感到困惑:

lkd> ??@$thread->IrpList
struct _LIST_ENTRY
[ 0xfffffa8001cf3b80 - 0xfffffa8001cf3b80 ]
+0x000 Flink   0xfffffa8001cf3b80 _LIST_ENTRY [ 0xfffffa8001fce658 -     0xfffffa8001fce658]
+0x000 Blink   0xfffffa8001cf3b80 _LIST_ENTRY [ 0xfffffa8001fce658 -     0xfffffa8001fce658]

所有这些信息都来自_ETHREAD结构,根据windbg,结构中'IrpList'元素的偏移量为0x3e8。

因此,如果线程(_ETHREAD)从偏移量0xfffffa8001fce270开始,则IrpList元素应该在偏移量0xfffffa8001fce658(0xfffffa8001fce270 + 0x3e8)

但是,我不完全理解为什么windbg报告偏移量为0xfffffa8001cf3b80的IRP List条目。

我可能在这里得到了错误的结局,但如果有人能指出我正确的方向,我会非常感激。

由于

1 个答案:

答案 0 :(得分:1)

列表地址不是0xfffffa8001cf3b80。这是IRP中列表条目的地址,位于IRP + 0x20(0xfffffa8001cf3b60 + 0x20 = 0xfffffa8001cf3b80)。 ETHREAD中的列表条目地址是0xfffffa8001fce658(0xfffffa8001fce658 - fffffa8001fce270 = 0x3e8)。