派遣函数
在开始部分,首先介绍一下应用层与驱动层进行通信的方式:
/*
与驱动中有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)中。