概述
分发函数是一组用来发送给设备对象的请求函数。它由内核驱动的开发者编写,以便来处理这些请求
并且返回给windows。分发函数的设置是在Driver Object上。也就是说每一个Driver Object都有自己
的分发函数。
请求有很多种,这里暂且只说3中。
1.打开(create),在访问一个设备对象时,必须先请求打开它,打开成功后再能发送其他请求。
2.关闭(close),在访问完一个设备对象之后,就要关闭它,在关闭之后必须重新打开才能再访问。
3.设备控制(Device control),设备控制是一种即能用来输入(从应用到内核),也可以用来输
出(从内核到应用)的请求。
一个标准的分发函数是这样的
NTSTATUS Dispatch(IN PDEVICE_ OBJCET dev,IN PIRP irp)
其中,dev则是要将请求发送到的目标对象,irp则是表示请求内容的数据结构指针。另外,
Dispatch必须首先设置给驱动对象,就是Driver->MajorFunction数组,这个指针数组里面
都是都是函数指针,每一个函数指针都是一个分发函数。
5.请求处理。
分发函数中处理请求首先要获得请求的当前栈空间(Current stack location)。
他就是对象中的一块结构。
每一个请求都有一个主功能号来说明这是一个什么请求。就本例而言,
打开请求的主功能号是IRP_MJ_CREATE
关闭请求的主功能号是IRP_MJ_CLOSE
控制设备请求的主功能号是IRP_MJ_DEVICE_CONTROL
获取IRP栈单元的函数:IoGetCurrentIrpStackLocation
然后根据主功能号(发送的请求做不同处理)
NTSTATUS Dispatch(IN PDEVICE_ OBJCET dev,IN PIRP irp)
{
PIO_STACK_LOCATION irpsp=IoGetCurrentIrpStackLocation(irp);
if(dev!=g_cdo) //判断请求是发给谁的
{
…
…
}
//判断请求
if(irpsp->MajorFunciton==xxxxxx)
{
xxxxxx操作
}
//操作完了之后,分发函数需要返回。需要一下四步
irp->IoStatus.Information = ret_len;
irp->IoStatus.Status=status;//用于记录返回状态
IoCompleteRequest(irp,IO_NO_INCREMENT); //用于结束这个请求
return status;
}
最后
以上就是顺心小蝴蝶为你收集整理的应用与内核通信(内核方面2)--windows内核安全与驱动开发的全部内容,希望文章能够帮你解决应用与内核通信(内核方面2)--windows内核安全与驱动开发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复