派遣函数
在开始部分,首先介绍一下应用层与驱动层进行通信的方式:
/*
与驱动中有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驱动程序中的派遣函数,包括IRP(I/O Request Package)处理机制,IRP类型如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE等,以及不同类型的I/O操作如缓冲区方式、直接方式和直接内存模式。派遣函数在处理这些IRP时的角色,如何设置IRP状态和读写字节数,以及如何处理DeviceIoControl的IOCTL码等内容。
最低0.47元/天 解锁文章
1514

被折叠的 条评论
为什么被折叠?



