设备驱动开发之缓冲区读写操作
2012-05-01 08:48 java20130722 阅读(195) 评论(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; }