PCHAR CONTAINING_RECORD(是一個MACRO,將 Structure 中某個field的offset 取出。
PCHAR Address,
TYPE Type,
PCHAR Field
);
以上面的宣告來說,會 return : "Address" + "Filed" 在 strucure "Type" 中的offset。
這樣做的原因是為了避免 hard coding offset 在 source 中,造成 structure 內容變更不易。
這一篇 有說明 :
以
typedef struct _BUFFER {為例, a 其實可以直接將 entry cast成 LIST_ENTRY就可以。
LIST_ENTRY e;
UCHAR *buf;
} BUFFER, *PBUFFER;
...
PLIST_ENTRY entry = RemoveHeadList(&listHead);
PBUFFER a = CONTAINING_RECORD(entry, BUFFER, e);
但是這樣以後 BUFFER 這個structure 若是修改的話,這樣寫就會有問題。