在驱动程序创建设备对象时,就需要为设备指定何种读写方式。
缓冲区方式读写对应的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;
}