私は現在、いくつかの Windows ルックアサイド リストに頭を悩ませようとしていますが、混乱しているメモリ アドレスがいくつか見られます。
私が投稿した別の質問から、 sergmat(元の質問)のおかげでいくつかのコードが生成されました:
lkd> !lookaside iopsmallirplookasidelist
Lookaside "" @ 82d5ffc0 "Irps"
....
lkd> dt _SINGLE_LIST_ENTRY 82d5ffc0
nt!_SINGLE_LIST_ENTRY
+0x000 Next : 0x86737e30 _SINGLE_LIST_ENTRY
....
lkd> !pool 0x86737e30
Pool page 86737e30 region is Nonpaged pool
*86737e28 size: a0 previous size: 48 (Allocated) *Irp
Pooltag Irp : Io, IRP packets
基本的に、上記の WinDBG 出力からわかることは、アドレス 0x82d5ffc0 に単一リンク リストがあることです。この出力は、32 ビット Windows 7 システムで生成されました。
ただし、これは私が混乱する場所です.Windows 7 64ビットシステムで同じ操作を実行すると、これが出力されます(アドレスは明らかに異なります):
lkd> !lookaside iopsmallirplookasidelist
Lookaside "" @ fffff80002a14800 "Irps"
....
lkd> dt _SINGLE_LIST_ENTRY fffff80002a14800
ntdll!_SINGLE_LIST_ENTRY
+0x000 Next 0x00000000'01bf0003
....
!pool 0x0000000001bf0003
Pool page 000000001bf0003 region is unknown
...
のNext
値は0x0000000001bf0003
有効な仮想アドレスではないようです。また、仮想から物理への変換を実行しようとしましたが、失敗しました。
この値はページへの何らかのオフセットのように見えますが、アドレスをどのように計算する必要があるかは完全にはわかりません。
リスト ヘッダー内には追加のデータがあります。これは_SLIST_HEADER
構造であり、_SINGLE_LIST_ENTRY
. 次のデータが含まれています。
Alignment: 0x1bf0003
Region: 0xfffffa8001df5b01
最初のヘッダーの後に一連の 3 つのユニオンがあり、これは 64 ビット システムでHeader16
あるため、これを含むユニオンを使用する必要があると思います。
Depth: 0x3
Sequence: 0x1bf
HeaderType: 0x1
Init: 0x0
Reserved: 0x0
NextEntry: 0xfffffa8001df5b0
要素にはHeader16.NextEntry
有効な仮想アドレスが含まれているため、これが次のリスト要素の実際の値なのか、それとも別のものなのかはわかりません。
_SINGLE_LIST_ENTRY.Next
したがって、 64ビットシステムで要素がどのように計算されるかを明確にするのを手伝ってくれる人がいれば、大いに感謝します。
ありがとう