zoukankan      html  css  js  c++  java
  • 设备驱动开发之缓冲区读写操作

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

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

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



  • 相关阅读:
    package.json作用
    github 发布项目
    kubernetes --> ConfigMap
    kubernetes1.9 手动安装
    python3 BeautifulSoup模块
    python3 requests模块
    ununtu16.04+python3+selenium+firefox环境搭建
    QQ空间动态内容,好友信息,点赞爬虫脚本
    k8s使用ceph作为后端存储挂载
    ceph存储安装配置
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207163.html
Copyright © 2011-2022 走看看