(转)CONTAINING_RECORD macro之研究
来源:互联网 发布:下载小米直播软件 编辑:程序博客网 时间:2024/06/04 19:11
CONTAINING_RECORD macro之研究
#define CONTAINING_RECORD(address, type, field) ((type *)( /
(PCHAR)(address) - /
(ULONG_PTR)(&((type *)0)->field)))
这个宏的目的是
当我们知道某一个 C struct 内的某个field 的 address,我们就可以反推回含有这个 address 的 C struct instance 的 address.
宏中比较特別的是(&((type *)0)->field)
这是把type instance放在address 0的地方,得到field到struct一开始的偏移值,
所以把宏中的address减去这个偏移值,就是该struct instance的位址了.
另一个要注意的是,
address 是被 casting 为PCHAR,再做减法运算,
(ULONG_PTR)是为了32/64bit pointer size的不同,
最后所得到的位址再casting为type*传回.
结论
当使用SINGLE_LIST_ENTRY 或 LIST_ENTRY 时,
该 field 放在自定 struct 內的哪个位置都无所謂,
用CONTAINING_RECORD可轻易找到某 type 之 instance 含有某 field 的 address,它的位址.
在此补充『FIELD_OFFSET』的宏定义。
#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))
这个宏的运算原理与『CONTAINING_RECORD』一样。此外,这两个宏基本上可以执行在任何的IRQL,但是当所引用的内存页有可能产生 『page fault』時,就仅能执行在『APC_LEVEL』之下。若要知道现在的IRQL,可以使用『KeGetCurrentIrql』这一个Service 来取得。当然也可以使用 NonPage Pool来防止内存页产生Page Fault。
(PCHAR)(address) - /
(ULONG_PTR)(&((type *)0)->field)))
这个宏的目的是
当我们知道某一个 C struct 内的某个field 的 address,我们就可以反推回含有这个 address 的 C struct instance 的 address.
宏中比较特別的是(&((type *)0)->field)
这是把type instance放在address 0的地方,得到field到struct一开始的偏移值,
所以把宏中的address减去这个偏移值,就是该struct instance的位址了.
另一个要注意的是,
address 是被 casting 为PCHAR,再做减法运算,
(ULONG_PTR)是为了32/64bit pointer size的不同,
最后所得到的位址再casting为type*传回.
结论
当使用SINGLE_LIST_ENTRY 或 LIST_ENTRY 时,
该 field 放在自定 struct 內的哪个位置都无所謂,
用CONTAINING_RECORD可轻易找到某 type 之 instance 含有某 field 的 address,它的位址.
在此补充『FIELD_OFFSET』的宏定义。
#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))
这个宏的运算原理与『CONTAINING_RECORD』一样。此外,这两个宏基本上可以执行在任何的IRQL,但是当所引用的内存页有可能产生 『page fault』時,就仅能执行在『APC_LEVEL』之下。若要知道现在的IRQL,可以使用『KeGetCurrentIrql』这一个Service 来取得。当然也可以使用 NonPage Pool来防止内存页产生Page Fault。
- (转)CONTAINING_RECORD macro之研究
- CONTAINING_RECORD macro之研究
- CONTAINING_RECORD macro之研究
- CONTAINING_RECORD macro之研究
- CONTAINING_RECORD
- CONTAINING_RECORD
- CONTAINING_RECORD
- CONTAINING_RECORD
- CONTAINING_RECORD
- CONTAINING_RECORD
- C++小技巧之CONTAINING_RECORD
- C++笔记之macro
- qt 之 macro
- CONTAINING_RECORD宏的详细解释(转)
- macro
- macro
- macro
- Macro小记之if循环
- VISTA音量控制
- tcl/tk实例详解——switch
- 关于Antenna包产生中文乱码的问题
- tcl/tk实例详解——while
- 取数据库float截取数点两位
- (转)CONTAINING_RECORD macro之研究
- eclipse 插件集锦
- tcl/tk实例详解——return
- 下拉菜单绑定,再添加一个选项“请选择”
- cookie的写和读
- 进程自动启动脚本
- 存储过程的教程
- Matlab 读YUV 代码
- Javascript中类似多线程,并发解决方案