设备驱动开发之缓冲区读写操作
2012-05-01 08:48 java20130722 阅读(198) 评论(0) 编辑 收藏 举报
在驱动程序创建设备对象时,就需要为设备指定何种读写方式。
缓冲区方式读写对应的IRP_READ派遣函数代码示例:
设备对象共有三种读写方式,分别是缓冲区方式读写/直接方式读写/其他方式读写
其对应的Flags设置为:DO_BUFFERED_IO/DO_DIRECT_IO/0(零值)。
缓冲区读取代码示例:
//创建设备 status = IoCreateDevice( pDriverObject, sizeof(DEVICE_EXTENSION), &(UNICODE_STRING)devName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pDevObj ); if (!NT_SUCCESS(status)) return status; pDevObj->Flags |= DO_BUFFERED_IO;//指定为缓冲区读写方式 //pDevObj->Flags |= DO_DIRECT_IO; //指定为直接读取方式 //pDevObj->Flags |= 0; //其他读写方式
缓冲区方式读写对应的IRP_READ派遣函数代码示例:
NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { KdPrint(("Enter HelloDDKRead\n")); //对一般IRP的简单操作,后面会介绍对IRP更复杂的操作 NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp); ULONG ulReadLength = stack->Parameters.Read.Length; // 完成IRP //设置IRP完成状态 pIrp->IoStatus.Status = status; //设置IRP操作了多少字节 pIrp->IoStatus.Information = ulReadLength; // bytes xfered //将要读取的缓冲区所有字节都设置为0XAA memset(pIrp->AssociatedIrp.SystemBuffer,0xAA,ulReadLength); //处理IRP IoCompleteRequest( pIrp, IO_NO_INCREMENT ); KdPrint(("Leave HelloDDKRead\n")); return status; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步