Monday, December 03, 2007

[Windows Driver] 利用 IRP 內的 ListEntry

這是不小心在 Testcap driver sample 內看到的,原先不知道可以這樣用 IRP 內的 ListEntry(事實上是沒時間,也不想去惡搞這些東西)。

Irp->Tail.Overlay.DriverContext[0] = context;
InsertTailList( &List, &Irp->Tail.Overlay.ListEntry);

context 通常是 device extension,而 testcap 是用 SRB,因為 SRB 內含 device extension,所以用 SRB 比較好。
List 則是你要把這個 IRP 放入的 LIST_ENTRY。


這樣就免於還要用另外一個資料結構去包 LIST_ENTRY 跟 IRP 了,蠻方便的。

至於要取出嘛:

PUCHAR ptr = (PUCHAR) RemoveHeadList(&List);
PIRP pIrp = (PIRP) (((PUCHAR) ptr) - FIELDOFFSET(IRP, Tail.Overlay.ListEntry));

這樣就抓出 LIST_ENTRY 內的 IRP 了。

No comments:

codeblock