windows驱动程序wdf--KMDF获取应用程序数据缓冲区地址

有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的地址对于驱动层是可读的,实际上这就是所谓“输出缓冲区可作为附加的输入缓冲区”

时间: 2024-11-06 07:13:40

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

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

[cpp] view plaincopy #ifdef WIN32 #include <Windows.h> #else #include <stdio.h> #include <unistd.h> #endif #include <assert.h> std::string getCurrentAppPath() { #ifdef WIN32 char path[MAX_PATH + 1] = {0}; if (GetModuleFileName(NULL

PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)

在WDF的PCIe驱动程序中,共有四个.h文件(Public.h  Driver.h  Device.h  Trace.h).本文将分别对四个文件源代码进行详细的解释. Public.h 1 #ifndef _USER_H 2 #define _USER_H 3 // 4 // Define an Interface Guid so that app can find the device and talk to it. 5 // 6 #include <initguid.h> 7 // {4

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

原文地址:http://www.cnblogs.com/jacklu/p/6139347.html 正如前几篇博客所说,使用WDF开发PCIe驱动程序是我本科毕业设计的主要工作.在读研的两年,我也分别为所在课题组移植了自己编写的驱动程序,在Windows 32位和64位平台下的PXI.PXIe.PCI.PCIe板卡分别得到了验证. 这篇文章根据自己最新编写的驱动代码(源代码请找博主索取),主要讲述如何为自己的硬件板卡移植驱动程序,并简单讲述如何使用Altera系列FPGA配置PCI IP核,然后

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

本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已经在上篇文章中讲解)和3个.c文件(Driver.c  Device.c   Queue.c) Driver.c 在看复杂的代码前,先给出程序流程图 1 #include "driver.h" 2 #include "driver.tmh" 3 4 #ifdef ALLOC_PRAGMA 5 #pragma alloc_text (INIT, DriverEntry)

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

本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法. 在上一篇简要介绍了WDF和开发环境搭建后,本篇将讲述几个WDF中的概念,对开发者了解WDF非常有帮助,属于“内功部分”: 本篇文章结构将没那么清晰,当句句都是作者通过看书.看论文.看MSDN提炼出来的,希望对读者能够有所帮助. 1.WinDBG是唯一的内核驱动调试利器,但是开发PCIe的WDF驱动可以采用“黑盒”方式,所以windbg不是必须的: 2.WDF比WDM好,别再用WDM了: 3.驱

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

本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法. 这个系列的博客将首先用一个篇幅为不懂Windows 下PCI/PCIe驱动开发的介绍WDF和开发环境搭建,接下来几篇将直接讲述程序编写, 看完这几篇后,希望能够帮助读者了解如何通过500行左右的代码实现一个标准的PCIe接口卡驱动程序. 毕设题目的PCIe板卡是BAR0下映射两个5K的内存,偏移地址为0x20000和0x22000,源代码在: https://github.com/luluji

程序间获取ALV显示数据(读取ALV GRID上的数据)

程序间获取ALV数据的两种方法: 方法1:通过修改SUBMIT的目标程序,把内表EXPORT到内存,SUBMIT后IMPORT ,该方法需要修改目标程序,可以任意设置目标程序的中断点: * Execute transaction IA09 to get all Functional Location Tasklists SUBMIT riplko10 WITH SELECTION-TABLE lt_selscreen WITH pn_iflo = abap_true "Select Func L

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

这两个计划写一个小类库,需要在不同项目下任意调用.该类库需要对磁盘文件进行读写,所以就需要获取程序执行的磁盘路径,就简单的对获取磁盘路径的方法进行研究. 借助搜索引擎,我从网上搜罗来多种方法,都可以直接或间接的获取到应用程序执行的根目录.大概总结一下,一共有以下 11 种: Server.MapPath("~") //使用 HTTP 上下文中的 Server 对象来获取Web站点的根目录 System.AppDomain.CurrentDomain.BaseDirectory //使用

[Windows]_[MacOSX]_[获取程序的执行文件所在路径(目录)]

场景: 1. 有时候有些辅助程序文件需要放在主程序文件同样的位置,便于管理和调用,这时候就需要通过主程序的路径来获取辅助程序所在位置. 2. 或者通过执行文件地址获取程序目录的安装地址. 方案: 1. 这里列出来省的大家去费神去找了. Windows实现: Unicode2Utf8实现搜博客里有- #include <Windows.h> #include <shlwapi.h> std::string GetExeDir() { static wchar_t szbuf[MAX_