0.driverbase—IOCtl的三种数据交互方式(buffer、direct、other)
来源:互联网 发布:昆西空压机密码算法 编辑:程序博客网 时间:2024/04/29 19:14
#define IOCTL_DIRECT_IN_IOCTL_CODE(FILE_DEVICE_COMM_DRIVER, 0x700, METHOD_IN_DIRECT, FILE_READ_ACCESS¦FILE_WRITE_ACCESS)//直接输入缓冲输出I/O#define IOCTL_DIRECT_OUT_IO CTL_CODE(FILE_DEVICE_COMM_DRIVER, 0x701, METHOD_OUT_DIRECT, FILE_READ_ACCESS¦FILE_WRITE_ACCESS)//缓冲输入直接输出I/O#define IOCTL_BUFFERED_IO CTL_CODE(FILE_DEVICE_COMM_DRIVER, 0x702, METHOD_BUFFERED, FILE_READ_ACCESS¦FILE_WRITE_ACCESS)//输入输出缓冲I/O#define IOCTL_NEITHER_IO CTL_CODE(FILE_DEVICE_COMM_DRIVER, 0x703, METHOD_NEITHER,FILE_READ_ACCESS¦FILE_WRITE_ACCESS)//Other I/0
IOCTL请求有以上四种
它们的输入输出缓冲区方式如下:
IOCTL请求类型输入缓冲存地址输出缓冲区地址METHOD_IN_DIRECT/ METHOD_OUT_DIRECTIrp->AssociatedIrp.SystemBufferMmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority)METHOD_BUFFEREDIrp->AssociatedIrp.SystemBufferIrp->AssociatedIrp.SystemBufferMETHOD_NEITHERpIoStackIrp->Parameters.DeviceIoControl.Type3InputBufferpIoStackIrp->Parameters.DeviceIoContMETHOD_IN_DIRECT/ METHOD_OUT_DIRECT 示例代码:
NTSTATUS DirectIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp){//以下四个变量都由DeviceIoControl参数传入ULONG ulInputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;//输入长度PVOID pInputBuf = Irp->AssociatedIrp.SystemBuffer;//输入buf ULONG ulOutputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;//输出长度PVOID pOutputBuf = NULL;if (Irp->MdlAddress){pOutputBuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);} //TODO.对pOutputBuf 赋值}METHOD_BUFFERED 示例代码:
NTSTATUS BufferIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp){//以下四个变量都由DeviceIoControl参数传入ULONG ulInputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;//输入长度PVOID pInputBuf = Irp->AssociatedIrp.SystemBuffer;//输入buf ULONG ulOutputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;//输出长度PVOID pOutputBuf = Irp->AssociatedIrp.SystemBuffer; //TODO.对pOutputBuf 赋值}
我们注意到BufferIo中输入和输出指向同一个缓冲区,如果输入数据有用的话,我们应当从系统缓冲区( Irp->AssociatedIrp.SystemBuffer)先获取输入,再将输出写入到系统缓冲区(同一个地方: Irp->AssociatedIrp.SystemBuffer)。当完成请求时,I/O 系统将输出数据从系统缓冲区复制到用户缓冲区
METHOD_NEITHER示例:
NTSTATUS NeitherIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp){//以下四个变量都由DeviceIoControl参数传入ULONG ulInputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;//输入长度PVOID pInputBuf = pIoStackIrp->Parameters.DeviceIoControl.Type3InputBuffer;//输入buf ULONG ulOutputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;//输出长度PVOID pOutputBuf = Irp->UserBuffer; //TODO.对pOutputBuf 赋值}
0 0
- 0.driverbase—IOCtl的三种数据交互方式(buffer、direct、other)
- 0.driverbase-IRP、IO_STACK_LOCATION、文件三种读写方式(buffer/driect/other)、DeviceIoControl
- windows phone 三种数据共享的方式(8)
- PHP的三种数据库连接方式
- WPF ListView 的三种数据绑定方式
- php中三种数据库的连接方式
- PDO的三种数据库连接方式
- JDK关于direct buffer与non-direct buffer的说明
- Direct Byte Buffer的操作
- 三种数据库连接方式
- Struts2三种数据转移方式
- Oracle11g 三种数据同步方式
- Struts2三种数据转移方式
- spring三种数据源方式
- Hive四种数据导入方式 (三)
- Oracle11g三种数据同步方式
- Java和SAP的三种数据通信方式RFC IDOC XI
- DCL、DDL、DML三种数据库语言的概述及区分方式
- 怎么让可穿戴设备不被用户弃用?教你6个办法
- nutch 1.8与solr 4.8环境搭建
- isKindOfClass& isMemberOfClass respondsToSelector& instancesRespondToSelector
- android:ellipsize属性的含义
- 线性表-顺序栈
- 0.driverbase—IOCtl的三种数据交互方式(buffer、direct、other)
- c/c++ 中static关键字
- 12C New Feature 之一 cdb 和pdb
- 在Linux系统中关闭触摸板
- struts2 2.3.15升级到2.3.16问题
- golang test说明解读
- 再见 小狗
- centos install vim for 开发 rails
- SBT学习 [持续更新...]