应用与内核通信(内核方面2)--windows内核安全与驱动开发

分发函数是一组用来发送给设备对象的请求函数。它由内核驱动的开发者编写,以便来处理这些请求
并且返回给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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值