设备驱动开发之缓冲区读写操作

在驱动程序创建设备对象时,就需要为设备指定何种读写方式。

设备对象共有三种读写方式,分别是缓冲区方式读写/直接方式读写/其他方式读写

其对应的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;
}



原文地址:https://www.cnblogs.com/java20130722/p/3207163.html