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