现在的位置: 首页 > 综合 > 正文

Windows驱动派遣函数的学习

2018年02月08日 ⁄ 综合 ⁄ 共 2123字 ⁄ 字号 评论关闭
//派遣处理例程的介绍:

//IPR简介:
//IRP全称(I/O Request Package),即输入输出请求包。他是windows驱动的重要概念,用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遗”到不//同的派遣函数(DisPatch Function)中处理。

//作用:上层应用程序与底层驱动通信即EXE程序与SYS的通信

//五种常用的IRP类型:
#define IRP_MJ_CREATE                     0x00 //CreateFile
#define IRP_MJ_CLOSE                      0x02 //CloseHandle 
#define IRP_MJ_READ                       0x03//ReadFile
#define IRP_MJ_WRITE                      0x04//WriteFile
#define IRP_MJ_DEVICE_CONTROL		  0x0e//DeviceIoControl  


//过程:
//1、创建IRP处理函数
//2、在驱动入口函数里DriverEntry()注册IRP处理函数
//3、细化IRP函数处理例程

//相关内核API:

//获取指定IRP的堆栈
PIO_STACK_LOCATION IoGetCurrentIrpStackLocation( IN  PIRP Irp)

//完成IRP请求
VOID IoCompleteRequest(
			  IN  PIRP Irp,		    //指定需要完成的IPR
			  IN  CCHAR PriorityBoost)  //等级


//方法1:统一注册派遗函数

//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine;
//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine;
//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine;
//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_WRITE]=ddk_DispatchRoutine;
//注册派遗函数
pDriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine;

NTSTATUS ddk_DispatchRoutine(IN PDEVICE_OBJECT pDevobj, IN PIRP pIrp)
{
	//获取当前IRP的堆栈
   PIO_STACK_LOCATION irpsp=IoGetCurrentIrpStackLocation(pIrp);

   switch (irpsp->MajorFunction) 
   {
	   case IRP_MJ_CREATE:
			break;
	   case IRP_MJ_CLOSE:
			break;
	   case IRP_MJ_READ:
			break;
	   case IRP_MJ_WRITE:
			break;
	   case  IRP_MJ_DEVICE_CONTROL:
			break;
	   default:
	}

	//完成IRP请求
	// ......

	//成功返回
	return STATUS_SUCCESS;
}

//******************************************************************************************************

//方法二:分开注册派遗函数

//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CREATE;
//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CLOSE;
//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_READ;
//注册派遗函数
pDriverObject->MajorFunction[IRP_MJ_WRITE]=ddk_DispatchRoutine_WRITE;
//注册派遗函数
pDriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL;

//派遣处理例程
NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp	)
{
    //对相应的IPR进行处理

   pIrp->IoStatus.Information=0;		//设置操作的字节数为0
   pIrp->IoStatus.Status=STATUS_SUCCESS;	//返回成功
   IoCompleteRequest(pIrp,IO_NO_INCREMENT);	//指示完成此IRP
  
   return STATUS_SUCCESS; //返回成功
}


//参考资料:
//郁金香讲课资料整理

抱歉!评论已关闭.