1

我目前正在努力理解 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 列表条目。

我可能在这里搞错了,但如果有人能指出我正确的方向,我将不胜感激。

谢谢

4

1 回答 1

1

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

于 2013-07-31T17:37:58.273 回答