分发函数与卸载函数

DRIVER_OBJECT中含有分发函数指针。这些函数用来处理发到这个驱动的各种请求。Windows总是自己调用DRIVER_OBJECT下的分发函数来处理这些请求。所以编写一个驱动程序,本质就是自己编写这些处理请求的分发函数。

DRIVER_OBJECT下的分发函数指针的个数为IRP_MJ_MAXIMUM_FUNCTION。保存在一个数组中。下面的代码设置所有分发函数的地址为同一个函数:

    NTSTATUS
        DriverEntry (
            IN PDRIVER_OBJECT   DriverObject,
            IN PUNICODE_STRING  RegistryPath
        )
    {
        ULONG i;
        for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;++i)
        {
            DriverObject->MajorFunctions[i] = MyDispatchFunction;
        }
        …
    }

这个设置固然不难。难的工作都在编写MyDispatchFunction这个函数上。因为所有的分发函数指针都指向这一个函数,那么这个函数当然要完成本驱动所有的功能。下面是这个函数的原型。这个原型是Windows驱动编程的规范,不能更改:

    NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device,PIRP irp)
    {
        ……
    }

这里出现了DEVICE_OBJECT和IRP这两大结构。前一个表示一个由本驱动生成的设备对象。后一个表示一个系统请求。也就是说,现在要处理的是:发给设备device的请求irp。请完成这个处理吧。这两个结构在后面再进一步描述。

还有一个不放在分发函数数组中的函数,称为卸载函数也非常重要。如果存在这个函数,则该驱动程序可以动态卸载。在卸载时,该函数会被执行。该函数原型如下:

    VOID MyDriverUnload(PDRIVER_OBJECT driver)
    {
        ……
    }

这个函数的地址设置到DriverObject->DriverUnload即可。
由于没有返回值,所以实际上在DriverUnload中,已经无法决定这个驱动能否卸载。只能做善后处理。

取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!