【驱动之三】派遣函数

本文详细介绍了Windows驱动程序中的派遣函数,包括IRP(I/O Request Package)处理机制,IRP类型如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE等,以及不同类型的I/O操作如缓冲区方式、直接方式和直接内存模式。派遣函数在处理这些IRP时的角色,如何设置IRP状态和读写字节数,以及如何处理DeviceIoControl的IOCTL码等内容。
摘要由CSDN通过智能技术生成

派遣函数

在开始部分,首先介绍一下应用层与驱动层进行通信的方式: 

/* 

与驱动中有4种模式 分为

1、 输入输出缓冲I/O(METHOD_BUFFERED) 参数为0

2、 直接输入缓冲输出I/O(METHOD_IN_DIRECT) 参数为1

3、 缓冲输入直接输出I/O(METHOD_OUT_DIRECT) 参数为2

4、 上面三种方法都不是(METHOD_NEITHER) 参数为3


四种模式的接收数据与输出数据的位置都不同 如下:

接收数据:

传输类型                                                 位置

METHOD_IN_DIRECT                pIrp->AssociatedIrp.SystemBuffer

METHOD_OUT_DIRECT             pIrp->AssociatedIrp.SystemBuffer

METHOD_BUFFERED                 pIrp->AssociatedIrp.SystemBuffer

METHOD_NEITHER                    pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer

 

输出数据:  

METHOD_IN_DIRECT                pIrp->MdlAddress

METHOD_OUT_DIRECT             pIrp->MdlAddress

METHOD_BUFFERED                 pIrp->AssociatedIrp.SystemBuffer

METHOD_NEITHER                    pIrp->UserBuffer

*/


关于符号链接:

//不支持符号链接用户相关性

#define DEVICE_NAME                  L"\\Device\\devtest"             // Driver Name

#define SYMBOLIC_LINK_NAME           L"\\DosDevices\\test"            // Symbolic Link Name

#define WIN32_LINK_NAME              "\\\\.\\test"                     // Win32 Link Name

 

//支持符号链接用户相关性

#define SYMBOLIC_LINK_GLOBAL_NAME    L"\\DosDevices\\Global\\test"    // Symbolic Link Name

 

宏CTL_CODE示范:

CTL_CODE:用于创建一个唯一的32位系统I/O控制代码,这个控制代码包括4部分组成:DeviceType(设备类型,高16位(16-31位)),Access(访问限制,14-15位),Function(功能2-13位),Method(I/O访问内存使用方式)。


#define IOCTL_HELLO_WORLD     \
    CTL_CODE                  \
    (                         \
        FILE_DEVICE_UNKNOWN,  \                  //设备类型
        0x800,                \                  //访问限制
        METHOD_NEITHER,       \                  //其他模式也就是第4种模式,即是上面介绍的4种驱动模式
        FILE_ANY_ACCESS       \                  //I/O访问内存使用方式
    )

接下来开始正文内容,该正文摘自张帆 史彩成等编著的《Windows 驱动开发技术详解》第七章,特此说明。

派遣函数是WIndows驱动程序中的重要概念。驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的。

用户模式下所有驱动程序的I/O请求,全部由操作系统转化为一个叫IRP的数据结构,不同的IRP会被派遣到不同的派遣函数(Dispatch Function)中。

1、IRP与派遣函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值