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


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

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

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



  • 相关阅读:
    jenkins+pytest+ allure运行多个py文件测试用例
    jenkins发送测试报告邮件
    appium+python 存在多个类时,不用每次都初始化解决办法
    allure报告定制(pytest+jenkins)
    UVa202
    UVa1588
    UVa1587
    OpenJ_Bailian3377
    OpenJ_Bailian 1852
    UVa227
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207163.html
Copyright © 2020-2023  润新知