有3种常用方式:METHOD_BUFFERED  METHOD_IN_DIRECT  METHOD_OUT_DIRECT
  还有METHOD_NEITHER,《windows设备驱动WDF开发》描述为:源自win 9x的VxD的模式,不建议读者掌握。这个就不管了。
  METHOD_BUFFERED:无论读和写都对应同一缓冲区
  METHOD_IN_DIRECT\ METHOD_OUT_DIRECT:输入缓冲区可作为附加输出缓冲区,输出缓冲区可作为附加输入缓冲区,两者区别只在DMA读写要分清,详见《windows设备驱动WDF开发》的DMA_Sample

  举简例:
  应用层DeviceIoControl传两个UNCHAR数(2 和 4)的地址给驱动。
  驱动读取地址提取数值,两数相加完成请求返还给应用层。
  以上过程分别以:METHOD_BUFFERED    METHOD_IN_DIRECT  METHOD_OUT_DIRECT 各执行一次
  
  结果:

   驱动层EvtDeviceIoControl例程读取处理部分:
   
#define IOSample_IOCTL_BUFFERED CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOSample_IOCTL_IN_DIRECT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define IOSample_IOCTL_OUT_DIRECT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

    switch(IoControlCode)
   {

    case IOSample_IOCTL_BUFFERED:
    case IOSample_IOCTL_IN_DIRECT:
    case IOSample_IOCTL_OUT_DIRECT:
if (InputBufferLength  == 0 || OutputBufferLength == 0)
{ //检查输入、输出参数有效性
WdfRequestComplete(Request, STATUS_INVALID_PARAMETER);
}
else
{
//METHOD_BUFFERED,METHOD_OUT_DIRECT,METHOD_IN_DIRECT三种方式,
//输入缓冲区地址可通过调用WdfRequestRetrieveInputBuffer函数获得
//输出缓冲区地址可通过调用WdfRequestRetrieveOutputBuffer函数获得

//获取输入缓冲区地址buffer
status = WdfRequestRetrieveInputBuffer(Request, 1, &buffer, NULL);
if (!NT_SUCCESS(status))
{
WdfRequestComplete(Request, STATUS_UNSUCCESSFUL);
        break;
}

//buffer表示输入缓冲区地址
//输入x1=应用程序传给驱动程序的数字
x1 = *(UCHAR *)buffer;

//获取输出缓冲区地址buffer
status = WdfRequestRetrieveOutputBuffer(Request, 1, &buffer, NULL);
if (!NT_SUCCESS(status)) 
{
WdfRequestComplete(Request, STATUS_UNSUCCESSFUL);
break;
}
//输入x2=应用程序通过输出缓冲区传给驱动程序的数字
x2 = *(UCHAR *)buffer;

*(UCHAR *)buffer=x1+x2;

//完成I/O请求,驱动程序传给应用程序的数据长度为1字节
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 1);
}
        break;

    default :
        status = STATUS_INVALID_DEVICE_REQUEST;
WdfRequestCompleteWithInformation(Request, status, 0);
        break;
    }


分析:对于METHOD_BUFFERED:
  驱动层输入输出缓冲区对应应用层的输入缓冲区和输出缓冲区,WdfRequestRetrieveInputBuffer和WdfRequestRetrieveOutputBuffer都读取同一位置,所以2+2=4。那个6的地址在驱动层是不可读的,他只是应用层接受来自驱动的输出结果

对于METHOD_OUT_DIRECT,METHOD_IN_DIRECT:
  驱动层输入缓冲区,驱动层输出缓冲区分别于应用层对应。所以那个6的地址对于驱动层是可读的,实际上这就是所谓“输出缓冲区可作为附加的输入缓冲区”

windows驱动程序wdf--KMDF获取应用程序数据缓冲区地址的更多相关文章

  1. windows和linux下获取当前程序路径以及cpu数

    #ifdef WIN32 #include <Windows.h> #else #include <stdio.h> #include <unistd.h> #en ...

  2. 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)

    原文出处:http://www.cnblogs.com/jacklu/p/4679304.html 在WDF的PCIe驱动程序中,共有四个.h文件(Public.h  Driver.h  Device ...

  3. 基于WDF的PCI/PCIe接口卡Windows驱动程序(5)-如何为硬件移植驱动程序

    原文地址:http://www.cnblogs.com/jacklu/p/6139347.html 正如前几篇博客所说,使用WDF开发PCIe驱动程序是我本科毕业设计的主要工作.在读研的两年,我也分别 ...

  4. 基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)

    原文出处:http://www.cnblogs.com/jacklu/p/4687325.html 本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已 ...

  5. 1   开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。   本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:    正确的使用数据库MetaData方法    只获取需要的数据    选用最佳性能的功能    管理连

    1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...

  6. 基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念

    原文出处:http://www.cnblogs.com/jacklu/p/4646601.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...

  7. 基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建

    原文出处:http://www.cnblogs.com/jacklu/p/4619110.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...

  8. 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别

    原文:[C#遗补]获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPa ...

  9. 获取应用程序根目录物理路径(Web and Windows)

    这两个计划写一个小类库,需要在不同项目下任意调用.该类库需要对磁盘文件进行读写,所以就需要获取程序执行的磁盘路径,就简单的对获取磁盘路径的方法进行研究. 借助搜索引擎,我从网上搜罗来多种方法,都可以直 ...

随机推荐

  1. SpringMVC源码情操陶冶-AbstractUrlHandlerMapping

    承接前文SpringMVC源码情操陶冶-AbstractHandlerMapping,前文主要讲解了如何获取handler处理对象,本文将针对beanName注册为handler对象作下解析 Abst ...

  2. Python元编程

    简单定义"元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,因此你可以在运行时对它进行内审.生成和/或修改",本博参考<<Python高级编程>> ...

  3. COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

    传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...

  4. SDN第四次上机作业

    1.建立以下拓扑,并连接上ODL控制器. 2.利用ODL下发流表,使得h3在10s内ping不通h1,10s后恢复. 3.借助Postman通过ODL的北向接口下发流表,再利用ODL北向接口查看已下发 ...

  5. SDN第二次上机作业

    作业链接 安装floodlight 生成拓扑并连接控制器floodlight,利用控制器floodlight查看图形拓扑 from mininet.topo import Topo class MyT ...

  6. Hadoop源码分类概要整理

    最近突然觉得, 很多掌握的都还是很浅的原理,需要更深入细粒度去了解整个分布式系统的运转机制.于是..开始作死而又作死而又作死的源码之旅. Hadoop包的功能总共有下列几类: tool:提供一些命令行 ...

  7. MySQL select语句直接导出数据

    select * into outfile '文件存放路径' from 表名; (先记下来,还未测试)

  8. 如何在关闭ssh连接的情况下,让程序继续运行?

    [http://blog.csdn.net/smstong/article/details/5872309] 对Unix,Linux类服务器维护经常是通过ssh完成的,而有些操作比较费时,如更新程序等 ...

  9. 设为首页/加入收藏JS代码

    传统网站常用的设为首页/加入收藏js代码 <a href="javascript:void(0)" onclick="sethome(this,window.loc ...

  10. 【项目记录】-路灯监测 gmap.net

    需求 2016年5月,客户要求在地图上显示路灯及数据,分析数据生成报表,以便查看分析路灯情况. 选型 国外项目就不考虑国内的地图了,开始想使用google的web地图,考虑到地图上标记物过多影响性能及 ...