Windows驱动_UMDF驱动之一UMDF驱动架构

2024-09-01 03:48
文章标签 windows 驱动 架构 umdf

本文主要是介绍Windows驱动_UMDF驱动之一UMDF驱动架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

    我们知道WDF分UMDF和KMDF框架,因为之前一直在内核模式下,所以一直没有考虑UMDF驱动框架,还有一个原因是可以使用UMDF框架的驱动,都可以使用KMDF框架代替,反之,不然。但是,UMDF因为其运行在用户模式下,所以也有许多便利性,比如:
    1. UMDF增加了系统的稳定性,驱动在用户模式进程地址空间中运行。
    2. 既可以使用用户模式的调试器调试,也可以使用内核模式下的调试器调试。
    3. 因为UMDF运行在LocalService帐号下,是受限的访问用户模式数据和系统文件,增加系统的安全性。

 

二、结构
    UMDF驱动抽象硬件功能,作为驱动堆栈的一部分管理设备,文件系统驱动,显示驱动,和打印机的驱动不能使用UMDF。
    
    UMDF和系统如下的部件进行联系

        Driver host process:UMDF主持进程装载UMDF驱动和框架的DLL,并提供一个执行环境,给UMDF驱动,用户模式堆栈中的消息传递。
        Driver manager:驱动管理器是一个Windows服务,它管理所有Wudfhost驱动主持进程的所有实例。驱动管理器启动每一个驱动主持进行的追踪信息。每一个host都是驱动管理器的子进程。每个系统中只存在一个驱动管理器。驱动管理器启动安装UMDF设备,并在之后运行它。
        Reflector:反射器是一个内核模式驱动,它允许应用程序和驱动主持进行(用户模式设备堆栈)和其进行交互。反射器为每一个设备实例创建一个独立的设备对象。并处理每一个设备PNP事件和电源管理请求。所有的应用程序和驱动主持进程都是通过反射器进行交互的。对于给定的设备的所有函数和过滤驱动必须运行在同一个驱动主持进程中。但是多个主持进程可以并发运行。
        UMDF Driver Host Process:驱动主持进程(Wudfhost.exe)是驱动管理服务的子进程。Wudfhost.exe通常运行在LocalService账户下,在当前的计算机上只拥护最小的权限。Wudfhost.exe的实例装载一个或多个UMDF驱动DLL和框架的DLL.驱动主持进程提供一种运行环境,来处理在驱动管理器和反射器内部间进行内部进程通讯,IO分发,驱动装载,驱动分层,线程池的管理。

 

三、注意点

        1. 驱动管理器可以创建多个共存的Wudfhost.exe进程实例。

        2. 如果你的UMDF驱动使用的UMDF1.9或者更早的版本,框架为每一个设备堆栈创建一个独立主持进程Wudfhost.exe的实例。
            如果你的UMDF驱动使用的UMDF1.11以后的版本,运行在Windows8或以后的系统上,驱动管理器默认创建一个Wudfhost.exe实例,它可以主持多个设备堆栈,这个技术叫做设备池。
            如果你的UMDF驱动使用的UMDF2.0的版本,运行在Windows8.1,池也是默认的。
            你可以装载那些使用版本1和2的UMDF共存的驱动,也可以使用同一个主持进程或不同的主持进程。一般来说,在Windows8.1以后,驱动管理器会把UMDF1.11和UMDF2.0驱动都装载到同一个主持进程。
            但是,你不能在同一个设备堆栈中同时加载UMDF1.11和UMDF2.0驱动。所以,你不能够将UMDF版本1的过滤驱动加载到UMDF版本2功能驱动的上面。

        3. 在Wudfhost.exe内部,每一个UMDF驱动都运行在自己的独立的地址空间,这样就和应用程序和驱动主持进行的实例进行了隔离。

 

四、UMDF架构

        下面,我们来看一下UMDF驱动体系结构,驱动管理器怎样构建用户模式设备堆栈,主持进程,反射器,驱动管理器,怎样来处理用户模式应用程序发送到UMDF驱动的IO请求。


        跟内核模式堆栈一样,用户模式堆栈的建造和卸载都是通过PNP事件来处理。在内核模式堆栈已经建立以后,反射器通知驱动管理器,开始构建用户模式驱动堆栈。驱动管理器启动驱动主持进程,并给其足够的信息,来构建用户模式堆栈。用户模式堆栈可以看作是内核模式堆栈的扩展。
        驱动主持进程为用户模式驱动提供执行环境,并在用户模式堆栈中的驱动间传送消息。反射器使用基于消息的内部进行通信体系和驱动管理器和驱动主持进程进行交互。
        为了发送IO请求给UMDF驱动,应用程序可以调用Win32 IO函数,比如CreateFile,ReadFileEx,CancelloEx或DeviceIoControl。但反射器接受到一个来自应用程序的一个请求的时候,它发送请求到合适的驱动主持进程。然后,驱动主持进程将请求发送到正确的用户模式设备堆栈的最上层驱动。
        请求可以被用户模式堆栈的驱动直接结束,或者由用户模式驱动转发给反射器。当反射器接收到一个来自用户模式驱动堆栈的请求时,它发送请求到内核模式驱动堆栈进行处理。

 

 

 

这篇关于Windows驱动_UMDF驱动之一UMDF驱动架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125854

相关文章

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1