`

CONTAINING_RECORD macro之研究

    博客分类:
  • IOCP
阅读更多
CONTAINING_RECORD macro之研究
分享
标签: CONTAINING_RECORD  结构地址  分类: 语言的魅力 2007-10-19 01:38
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。
分享到:
评论

相关推荐

    VB_package_text_file_containing_sample_class.rar_VB 文本读写_class A

    "VB_package_text_file_containing_sample_class.rar" 提供了一个VB类(Class A),专门用于处理文本文件的读写操作。在这个压缩包中,我们可以找到相关的源代码示例,帮助我们理解如何在VB中实现这一功能。 类A...

    WRK_内核读取全部进程_调研报告

    例如,如果我们有一个指向EPROCESS结构体中ActiveProcessLinks成员的指针,我们可以通过CONTAINING_RECORD宏得到EPROCESS结构体的首地址。宏的参数包括地址address(ActiveProcessLinks的地址)、类型type(EPROCESS...

    A_自我约束_在线_书籍_娱乐_图书馆__FPGA设计元素

    A_自我约束_在线_书籍_娱乐_图书馆__FPGA设计元素_A_self-contained_online_book_containing_a_library__FPGADesignElements_A_self-contained_online_book_containing_a_library__FPGADesignElements.zip

    svn安装过程中遇到错误需要的文件包

    错误 configure: error: could not find library containing RSA_new: 错误 configure: error: no XML parser was found: expat or libxml 2.x required 解放方法: ...

    数字滤波器设计手册

    _IRR_filter_design_with_C_routines_for_the_bilinear_transformation,_plus_the_impulsive-invariance_and_step-invariance_design_methods._A_disk_containing_the_routines_in_C_is_included._Annotation_c._...

    kkt-containing.rar_Internet/IE编程_kkt_kkt 代码

    标题中的“kkt-containing.rar”是一个RAR格式的压缩文件,通常用于存储多个文件或文件夹。这个文件似乎属于“Internet/IE编程”类别,并且与“kkt”和“kkt 代码”有关。从描述来看,这可能是一个包含JXTA(Java ...

    dsbox-profiling:DSBox的数据分析TA1组件

    我们的可计算元功能包括: computable_metafeatures = ['ratio_of_values_containing_numeric_char', 'ratio_of_numeric_values', 'number_of_outlier_numeric_values', 'num_filename', 'number_of_tokens_...

    vasp_trans1:从WAVECAR(VASP)计算光学跃迁几率

    vasp_trans1基于电偶极近似的州际跃迁概率计算程序在此程序中,基于VASP输出的...trans1 ~/a_directory_containing_wavecar_file/WAVECAR另外,在通过剪刀近似校正光谱时 trans1 ~/a_directory_containing_wavecar_fi

    解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题

    4、模型报错:ValueError: You are trying to load a weight file containing 12 layers into a model with 0 layers. 问题分析: 模型创建后还没有编译,一般是在模型加载前调用model.build(input_shape), 但我通过...

    Foreground Object Detection from Videos Containing Complex Background

    **背景建模**是前景物体检测的核心技术之一。它旨在建立一个模型来表示场景中的背景,从而将前景物体从背景中分离出来。本文采用的方法结合了色彩特征和色彩共现特征,分别用于描述静态背景和动态背景。色彩特征主要...

    VC6插件(Open Containing Folder)

    相比VS2010及 VS2012, VC6编译器缺少一个“Open Containing Folder”的功能。该插件(MyOWF.dll)实现了该功能。 使用方法:1)将MyOWF.dll放到C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Add...

    Design of Composite Structures Containing.pdf

    这份博士论文《含有螺栓孔和开口孔的复合材料结构设计》(Design of Composite Structures Containing Bolt Holes and Open Holes),由瑞典皇家理工学院航空系出版,报告编号为99-03,是该领域的重要贡献。...

    KataBank:Kata 练习 MokistClasic TDD

    public void should_print_statement_containing_all_transactions() { account.deposit(1000); account.withdraw(100); account.deposit(500); account.printStatement(); verify(console).printLine("DATE | ...

    Enhanced Magneto-optical Kerr effect in magnetic multilayers containing double-negative metamaterials

    在本篇论文《Enhanced Magneto-optical Kerr effect in magnetic multilayers containing double-negative metamaterials》中,作者董云霞和张向东主要探讨了包含双负材料的磁性多层结构中磁光克尔效应(Magneto-...

    leetcode题库-Leetcode-Summary:Leetcode刷题总结(Java版)——更新中

      包含min函数的栈(The_stack_containing_the_min_function.java)   队列的最大值(The_maximum_value_of_the_queue.java) 堆(heap_items)   最小的k个数(The_smallest_k_number.java) 位运算(bit_...

    php给一组指定关键词添加span标签的方法

    // Example use: $spanned = codeWords($string_containing_keywords); // My site: andrew.dx.am // Using colour==blue, but different arrays of words and different // colours can be added. function ...

    rdb:使Rust的编译调试器周期更容易

    rdb PROGRAM_NAME PATH_TO_DIR_CONTAINING_TARGET 调试一下! 贡献 有关更多信息,请参见 。 执照 根据以下任一许可 Apache许可证2.0版( 或 ) MIT许可证( 或 ) 由您选择。 发牌 除非您明确声明,否则有意提交...

    Liquid Crystalline Poly(meth)acrylates Containing Bent-Core Mesogens: Synthesis and Characterization

    侧链液晶高分子材料因其在显示技术、非线性光学、传感器件等领域的潜在应用而成为研究热点。其中,液晶高分子中加入特定结构的液晶基元能够赋予材料特殊的液晶性质,比如通过引入香蕉形液晶基元(Bent-Core Mesogens...

Global site tag (gtag.js) - Google Analytics