函数指针、函数数组的使用

    xiaoxiao2026-03-26  13

    在学习驱动编程的过程中,碰到函数指针的使用,如下:

    pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数

    NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp    );

    //---------------------------------------

    //逆推过程

    01.查看MajorFunction的定义:

    typedef struct _DRIVER_OBJECT { ...     PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];

    } DRIVER_OBJECT;

    02.接着查看DISPATCH的定义 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;

    03.再查看DRIVER_DISPATCH的定义

    typedef     NTSTATUS     DRIVER_DISPATCH (     __in struct _DEVICE_OBJECT *DeviceObject,     __inout struct _IRP *Irp

        ); 

    04.可以看出DRIVER_DISPATCH是一个 函数声明

    05.正推替代: NTSTATUS     (*MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]) (     __in struct _DEVICE_OBJECT *DeviceObject,     __inout struct _IRP *Irp

        ); //括号不能少。typedef DRIVER_DISPATCH (*PDRIVER_DISPATCH)这里引入的括号。

    06.现在再回头看前面的使用

    pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数

    NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp    );

    其过程是:给pDriverObject->MajorFunction[IRP_MJ_CREATE]这个函数指针赋值ddk_DispatchRoutine_CONTROL,

    ddk_DispatchRoutine_CONTROL带的两个参数(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp    )和MajorFunction定义中的两个参数  __in struct _DEVICE_OBJECT *DeviceObject, __inout struct _IRP *Irp是等效的。

    类比简化: long (*majorfunction[10])(int,int);  //定义了一个有十个成员变量的函数指针数组,每个函数带两个int型参数,返回值是long型 //--------------------------------------- //简单例子: #include <math.h> #include <iostream> using namespace std; int (*function[4])(int,int); //括号不能少 int add(int a,int b) {     return a+b; } int sub(int a,int b) {     return a-b; } int mult(int a,int b) {     return a*b; } int div_int(int a,int b) {     return floor((float)a/b); } int _tmain(int argc, _TCHAR* argv[]) {     function[0]=add;     function[1]=sub;     function[2]=mult;     function[3]=div_int;     int a = (*function[0])(10,2);  //参照声明,括号不能少。     int b = (*function[1])(10,2);     int c = (*function[2])(10,2);     int d = (*function[3])(10,2);     return 0; } //----------------------------------------------- 函数指针的一个妙用,根据数组下标中的宏定义来识别不同的函数,比如IRP_MJ_CREATE,代表该函数是用来做创建相关动作的。 主要用于注册函数,让别人来调用。 pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数 pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
    转载请注明原文地址: https://ju.6miu.com/read-1308207.html
    最新回复(0)