zoukankan      html  css  js  c++  java
  • Windows驱动派遣函数的学习

    //派遣处理例程的介绍:
    
    //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; //返回成功
    }
    
    
    //参考资料:
    //郁金香讲课资料整理
    

  • 相关阅读:
    php实现拼图滑块验证的思考及部分实现
    【php设计模式】门面模式
    【php设计模式】装饰器模式
    php 如何将image图片转化为字符串(GD库操作及imagick两种实现方式)
    【php设计模式】组合模式
    【php设计模式】桥接模式
    深拷贝和浅拷贝
    【php设计模式】适配器模式
    【php设计模式】建造者模式
    Java50道经典习题-程序29 求矩阵对角线之和
  • 原文地址:https://www.cnblogs.com/csnd/p/11800743.html
Copyright © 2011-2022 走看看