编写简单的WDF驱动程序

  • 在创建新的KMDF或UMDF程序时,必须选择一个不多于32个字符的驱动程序名称。此长度限制在wdfglobals.h中定义。如果驱动程序的名称超出最大尺度,则驱动程序无法加载。
  • 每个基于框架的驱动程序都包含一个DriverEntry例程和一组事件回调函数,框架在发生特定于对象的事件时将调用该函数。

基于框架的简单驱动程序可能由以下内容组成:

  • DriverEntry例程,在加载驱动程序并调用WdfDriverCreate时调用。

  • 一个EvtDriverDeviceAdd事件回调函数,当即插即用(PnP)管理器使用与驱动程序支持的硬件ID匹配的硬件标识符(ID)报告设备检测时,框架将调用该函数。

    可以通过提供一个INF文件来指定驱动程序支持的硬件ID,操作系统会在第一次将设备连接到计算机时使用该文件来安装驱动程序。
    驱动程序的EvtDriverDeviceAdd回调函数调用WdfDeviceCreate为检测到的设备创建框架设备对象。

  • 当i/o管理器向驱动程序发送i/o请求时,框架调用请求处理程序(如EvtIoDefault回调函数)。
    当i/o管理器将i/o请求发送到驱动程序时,框架会将请求放入i/o队列,然后通过调用请求处理程序通知你的驱动程序。
    驱动程序必须为每个设备创建至少一个i/o队列,以便驱动程序可以接收设备的i/o请求。若要创建i/o队列,驱动程序将调用WdfQueueCreate,这将创建一个框架队列对象并注册设备的请求处理程序。

WDF驱动程序例程的DriverEntry

  • DriverEntry是加载驱动程序后调用的第一个驱动程序提供的例程。它负责初始化驱动程序。

  • 语法

    NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject,_In_ PUNICODE_STRING RegistryPath
    );
    
  • 参数

    DriverObject:指向驱动程序_对象结构的指针,该结构表示驱动程序的WDM驱动程序对象。

    RegistryPath:指向UNICODE_字符串结构的指针,该字符串结构指定注册表中驱动程序的Parameters项的路径。

  • 返回值
    如果例程成功,则必须返回状态“_成功”,否则,它必须返回在ntstatus中定义的错误状态值之一。

  • 备注
    与所有WDM驱动程序一样,基于框架的驱动程序必须具有DriverEntry例程,该例程是在加载驱动程序后调用的。基于框架的驱动程序的DriverEntry例程必须:

    • 激活WPP软件跟踪
      DriverEntry应包含一个WPP_INIT_TRACING宏来激活软件跟踪。
    • 调用WdfDriverCreate
      对WdfDriverCreate的调用使驱动程序可以使用Windows驱动程序框架接口。在调用WdfDriverCreate之前,驱动程序无法调用其他框架例程。
    • 分配任何特定于设备的系统资源和可能需要的全局变量
      通常驱动程序将系统资源与单个设备相关联。因此,基于框架的驱动程序在EvtDriverDeviceAdd回调中分配大多数资源,在检测到各个设备时将调用该回调。因为UMDF驱动程序的多个实例可能由单独的Wudfhost实例托管,所以全局变量可能无法在UMDF驱动程序的所有实例中使用。
    • 从注册表获取驱动程序特定的参数
      某些驱动程序从注册表中获取参数,这些驱动程序可以调用WdfDriverOpenParametersRegistryKey来打开包含这些参数的注册表项。
    • 提供DriverEntry返回值

串行(KMDF)示例驱动程序的DriverEntry例程

NTSTATUS
DriverEntry(IN PDRIVEROBJECT DriverObject,IN PUNICODE RegistryPath)
{WDF_DRIVER_CONFIG config;WDFDRIVER hDriver;NTSTATUS status;WDF_OBJECT_ATTRIBUTES attributes;SERIAL_FIRMWARE_DATA driverDefaults;//初始化WPP 跟踪WPP_INIT_TRACING(DriverObject,RegistryPath);SerialDbgPrintEx(TRACING_LEVEL_INFORMATION,DBG_INIT,"Serial Sample (WDF Version) - Built %s %s\n",__DATE__,__TIME__);WDF_OBJECT_CONFIG_INIT(&config,SerialEvtDeviceAdd);status = WdfDriverCreate(DriverObject,RegistryPath,&attributes,&config,&hDriver);if(!NT_SUCCESS(status)){SreialDbgPrintEx(TRACE_LEVEL_ERROR,DBG_INIT,"WdfDriverCreate failed with status 0x%x\n",ststus);WPP_CLEANUP(DriverObject);return status;}SerialGetConfigDefaults(&driverDefaults,hDriver);if(driverDefaults.ShouldBreakOnEntry){DbgBreakPoint();}return status;
}

编写简单的WDF驱动程序相关推荐

  1. 从零开始学习Windows WDF驱动程序开发

    摘要:本文通过简单的例子和精简的说明,带你快速了解和掌握基于WDF架构的Windows驱动程序的开发过程.WDF自带的文档非常详细而且冗长,读者需要一定的编程基础和英语水平,再加上一定的努力,才能看明 ...

  2. java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.

    内核第三讲,进入ring0,以及编写第一个内核驱动程序. 一丶进入ring0之前的简介 进入0环之前,我们要明白操作系统的设计,操作系统允许驱动程序使用In out等等特权指令来操作高2G的内存.那么 ...

  3. dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序

    dma-buf 由浅入深(一) -- 最简单的 dma-buf 驱动程序 dma-buf 由浅入深(二) -- kmap / vmap dma-buf 由浅入深(三) -- map attachmen ...

  4. 一个简单的字符驱动程序

    一.背景 为了了解设备驱动程序的框架,在此编写一个简单的字符驱动程序,以此来对驱动程序的框架进行一个简单的了解. 二.设备驱动程序 所谓设备驱动程序,其实就是计算机硬件与外部设备进行通信的接口.由于硬 ...

  5. 实用c语言函数源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  6. python七夕快乐_python编写简单抽奖系统

    python编写简单抽奖系统 #!/usr/bin/env python #coding=utf-8 from Tkinter import * import time import random c ...

  7. python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  8. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

  9. python的翻译-Python编写简单的谷歌翻译软件

    Python编写简单的谷歌翻译软件 这是我学习Python的图形模块tkinter时完成的一个小作业,翻译速度快, 直接调用Google翻译的Python接口,界面简洁,已成为我日常编程的小助手^^ ...

  10. 【Windows 逆向】CheatEngine 工具 ( 汉化版 CE 工具推荐 | 编写简单 C++ 程序 | C++ 程序执行分析 | 使用 CE 修改上述 C++ 程序 )

    文章目录 一.汉化版 CE 工具推荐 二.编写简单 C++ 程序 三.C++ 程序执行分析 四.使用 CE 修改上述 C++ 程序 一.汉化版 CE 工具推荐 推荐一个汉化版的 CE 工具 : htt ...

最新文章

  1. datatable和dataset的区别
  2. 基于JDK1.8---HashMap源码分析
  3. kdj超卖_三分钟学会KDJ三大买卖绝技,简单高效,把握最佳买卖点,不懂KDJ的股民值得一看!...
  4. 数据产品必备技术知识:机器学习及常见算法,看这一篇就够了
  5. UI5 registerModulePath
  6. Android-AB系统OTA升级介绍
  7. APICloud连接夜神模拟器--博客园老牛大讲堂
  8. 局域网、城域网IEEE802(LAN/MAN)标准——【局域网、城域网网络知识基础篇】
  9. .dat文件三维点云可视化
  10. 【自定义View】从零开始写一个PDF查看器
  11. 【重识云原生】第六章容器6.3.1节——K8S核心组件总述
  12. python操作键盘和鼠标_1、[python] PyMouse、PyKeyboard用python操作鼠标和键盘
  13. Labplus:Scratch创作工具的替代与进步
  14. 冷启动中的多臂老虎机问题(Multi-Armed Bandit,MAB)
  15. [Go实战]怎么写测试类,运用testing.T
  16. 安装proteus8和卸载
  17. Python3 借助pywin32模块获取Windows当前和所有窗口正在运行的应用程序信息
  18. 三星note10+5G (韩版9825)DL模式提示OEM Lock: ON(U)的解决方案
  19. 计算机课学生端重启,极域课堂管理系统怎么连接老师 学生端连接问题解决方法...
  20. IEEE access投稿经验

热门文章

  1. BUUCTF-[HDCTF2019]Maze
  2. 折线图-面积图-K线图
  3. edp和lvds区别在哪里 [转载]
  4. Saliency Detection: A Spectral Residual Approach
  5. 这几个免费、商用图片素材网,你一定要知道。
  6. java 实验室管理系统_java实验室设备管理系统
  7. java内存分配不够_java内存空间不够问题
  8. [实操记录]mysql5.7如何恢复被删除数据
  9. QQ界面的MSN聊天软件
  10. 逃离一线!从上海举家回成都七年,现在怎么样了?