分发函数与卸载函数
2021-07-01
105
0
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中,已经无法决定这个驱动能否卸载。只能做善后处理。