设备对象共有三种读写方式,分别是缓冲区方式读写/直接方式读写/其他方式读写
其对应的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; }