windows 驱动实例分析系列-COM驱动案例讲解

news2024/11/15 8:33:06

COM也被称之为串口,这是一种非常简单的通讯接口,这种结构简单的接口被广泛的应用在开发中,几乎所有系统都能支持这种通讯接口,它有RS232和RS485等分支,但一般我们都会使用RS232作为常见的串口,因为它足够简单和高效。

几乎所有的开发板,都会提供用于烧录、调试、日志的串口;大部分常见的底层协议也会使用串口来作为数据上报的主要接口;USB甚至为COM口提供了单独而专用的驱动,故用它来作为入门是足够简单和方便。

COM也会被称为Serial或者UART,同时也容易和windows的另外一项技术相混淆,Serial或者UART在物理或者机制上是有区别的,但我们主要关注的是windows 驱动的编写,故我们会使用windows为这一类设备提供的类命名方式"COM"来在本文中表示这一类驱动。

选择合适和案例

windows 直接提供的驱动案例如下:

kmdfecho: 这个例子来源于WinDDK,是一个软件驱动,本身的设备节点位于root上,这个驱动是kmdf的演示驱动,代码演示了顺序队列对呈现给驱动程序的读写请求进行序列化,分为同步和异步两个子驱动;默认情况下需要修改inx文件里面的Sample字段;

serial: 这个系列是COM驱动最齐全的例程之一,包含对硬件ID的物理设备的直接支持(serial),包含基于UMDF1.0和UMDF2.0的virtualserial的支持;包含配合serial的Filter驱动serenum;

serialhcibus:基本总线驱动程序以支持新的蓝牙可扩展性传输DDI,通过UART传输。这种串行总线驱动器可以通过UART传输支持多无线电设备,并利用通用的蓝牙HCI数据包进行通信。此驱动程序的下边缘按照蓝牙SIG的UART(H4)传输协议与UART控制器连接;注意这个驱动需要实现基于供应商的部分才能正常工作;

由于接下来的代码将用于演示,故我们选择基于UMDF2.0的virtualserial用于演示。

项目改造

新建一个UMDF2.0的空项目:

将案例UMDF2.0virtualserial里面的源代码文件拷贝进来,不需要拷贝文件夹里面的内容:

 

注意,我们生成UMDF驱动项目的时候,已经有了inf文件了,接下来就是对整个驱动文件进行处理,事实上这个驱动编写得非常出色,可以直接编译成功运行的:

这里需要修改默认的inf文件,这个案例的INF文件如下:

;
; umdfserial.inf
;

[Version]
Signature="$Windows NT$"
; 默认情况下这里的class是system,但是我们需要一个串口驱动,故改为PORT
; 对应的GUID也需要修改,下面是修改之后的
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%ManufacturerName%
CatalogFile=umdfserial.cat
DriverVer=09/22/2024,1.0.0.0 ; TODO: set DriverVer in stampinf property pages
PnpLockdown=1

[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$

[Standard.NT$ARCH$]
%DeviceName%=MyDevice_Install, Root\umdfserial ; TODO: edit hw-id

[SourceDisksFiles]
umdfserial.dll=1

[SourceDisksNames]
1 = %DiskName%

; =================== UMDF Device ==================================

[MyDevice_Install.NT]
CopyFiles=UMDriverCopy

[MyDevice_Install.NT.hw]

[MyDevice_Install.NT.Services]
AddService=WUDFRd,0x000001fa,WUDFRD_ServiceInstall

[MyDevice_Install.NT.CoInstallers]
AddReg=CoInstallers_AddReg

[MyDevice_Install.NT.Wdf]
UmdfService=umdfserial,umdfserial_Install
UmdfServiceOrder=umdfserial

[umdfserial_Install]
UmdfLibraryVersion=$UMDFVERSION$ 
ServiceBinary=%12%\UMDF\umdfserial.dll

[WUDFRD_ServiceInstall]
DisplayName = %WudfRdDisplayName%
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %12%\WUDFRd.sys

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WUDFCoinstaller.dll"

[DestinationDirs]
UMDriverCopy=12,UMDF ; copy to drivers\umdf

[UMDriverCopy]
umdfserial.dll

; =================== Generic ==================================

[Strings]
ManufacturerName="<Your manufacturer name>" ;TODO: Replace with your manufacturer name
DiskName = "umdfserial Installation Disk"
WudfRdDisplayName="Windows Driver Foundation - User-mode Driver Framework Reflector"
DeviceName="umdfserial Device"

driver.c 解读

这个文件主要处理驱动相关的代码,主要是DriverEntry和EvtDeviceAdd函数,下面分别来看这两个函数

NTSTATUS
DriverEntry(
    _In_  PDRIVER_OBJECT    DriverObject,
    _In_  PUNICODE_STRING   RegistryPath
    )
{
    NTSTATUS                status;
    WDF_DRIVER_CONFIG       driverConfig;

    WDF_DRIVER_CONFIG_INIT(&driverConfig,
                            EvtDeviceAdd);

    status = WdfDriverCreate(DriverObject,
                            

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Pyramid Vision Transformer》论文笔记

原文笔记 What 为了解决VIT在视觉任务上的局限性并且探究Transformer模型在视觉任务上的应用&#xff0c;这项工作提出了一种纯 Transformer 主干&#xff0c;称为 Pyramid Vision Transformer (PVT)&#xff0c;它可以作为 CNN 主干在许多下游任务中的替代方案&#xff0c;包…

【人工智能】Linux系统Mamba安装流程

在编译安装 mamba 之前&#xff0c;你需要确保已安装正常的PyTorch环境。 # 安装必要的系统依赖 sudo apt update sudo apt install build-essential # 安装mamba依赖 pip install packaging wheel # 克隆仓库 git clone https://github.com/Dao-AILab/causal-conv1d.git git …

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目&#xff1a; 大数据驱动的…

fastadmin 根据选择数据来传参给selectpage输入框

文章目录 js代码php代码&#xff1a;完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…

torch.embedding 报错 IndexError: index out of range in self

文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错&#xff1a; IndexError: index out of range in self2. 原因 首先看下正常情况&#xff1a; import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…

【C++ Primer Plus习题】17.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…

PHP、Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发&#xff0c;它的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金&#xff0c;这使得GoFly快速框架得到良好的发展&#xff0c;GoFly技术团队加大投入反哺科技企业和开…

数据结构之搜索二叉树

目录 一、什么是搜索二叉树 基本概念 特点 注意事项 二、搜索二叉树的C实现 2.0 构造与析构 2.1 插入 2.2 查找 2.3 删除 2.3.1 无牵无挂型 2.3.2 独生子女型 2.3.3 儿女双全型 三、搜索二叉树的应用 3.1 key搜索 3.2 key/value搜索 一、什么是搜索二叉树 搜索二…

EAGLE——探索混合编码器的多模态大型语言模型的设计空间

概述 准确解释复杂视觉信息的能力是多模态大型语言模型 (MLLM) 的关键重点。最近的研究表明&#xff0c;增强的视觉感知可显著减少幻觉并提高分辨率敏感任务&#xff08;例如光学字符识别和文档分析&#xff09;的性能。最近的几种 MLLM 通过利用视觉编码器的混合来实现这一点…

科研绘图系列:R语言ggplot2画热图(heatmap)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 热图(Heatmap)是一种数据可视化技术,它通过颜色的变化来表示数据的大小或者密度。热图通常用于展示两个变量之间的关系,或者在二维空间上展示数据的分布情况。以下是热图可以表示的一些内容: 数据分布:…

网络原理 HTTP与HTTPS协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多计算机网络知识 目录 1.HTTP概念 2.HTTP报文格式 3.HTTP请求 1.首行 1.1URL 1.2 GET⽅法 1.3 POST⽅法 1.4 其他⽅法 2.请求头&#xff08;head…

JVM面试问题集

什么是JVM? 了解过字节码文件的组成吗? 说一下运行时数据区 哪些区域会出现内存溢出&#xff0c;会有什么现象? JM在JDK6-8之间在内存区域上有什么不同 类的生命周期 什么是类加载器 什么是双亲委派机制 打破双亲委派机制 Tomcat的自定义类加载器

【网络通信基础与实践番外一】多图预警之图解UDP和TCP前置知识

参考大佬的文章https://www.cnblogs.com/cxuanBlog/p/14059379.html 一、宏观架构中的传输层 在计算机中&#xff0c;任何一个可以交换信息的介质都可以称为端系统。计算机网络的运输层则负责把报文从一端运输到另一端&#xff0c;运输层实现了让两个互不相关的主机进行了逻辑…

Kafka-Manager安装及操作

文章目录 一、kafka-manager介绍二、kafka-manager安装三、Kafka-Manager操作 一、kafka-manager介绍 CMAK (Cluster Manager for Apache Kafka, previously known as Kafka Manager) CMAK (previously known as Kafka Manager) is a tool for managing Apache Kafka cluster…

STM32篇:开发环境安装

编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5 和 STM32CubeMX 一.Keil5 的安装 使用 Keil4 写 STM32 代码其实也是可以&#xff0c;但需要很复杂的配置&#xff0c;不建议新手操作。 比较推荐 Keil5 编写 STM32 &#xff0c;只需要一些简单的设置就可…

(一)Lambda-Stream流

概述 Java8的Stream使用的是函数式编程模式&#xff0c;它可以被用来对集合或数组进行链状流式的操作&#xff0c;可以更方便地让我们对集合或数组操作。 使用Stream流程&#xff1a; 创建流 -> 中间操作 -> 终结操作; 注&#xff1a;必须要有终结操作否则中间操作不生效…

hive-拉链表

目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息&#xff0c;比如用户手机号码信息。然而随着时间的变化&#xff0c;某些用户信息会发生改…

7.搭建个人金融数据库之快速获取股票列表和基本信息!

前边我们提过&#xff0c;免费的数据一般来自于爬虫&#xff0c;获取难度和维护成本都比较高&#xff0c;其实不太适合小白用户。所以非必要情况下&#xff0c;我们尽量不用这种方式来获取数据。 我自己用的比较多的是tushare&#xff0c;一般来说有它也就够了&#xff0c;大…

Junit4测试报错:java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter

原来build path 界面&#xff1a; Junit为Modulepath 应把Junit改为Classpath即可&#xff0c;如下图所示&#xff1a;

前端和后端的相对路径和绝对路径

1. 相对路径访问图片 test.html 位于 web/a/b/c/ 目录中&#xff1a; 若要访问 static/img/ 文件夹中的图片&#xff08;假设图片名为 image.png&#xff09;&#xff0c;相对路径应该是&#xff1a; <img src"../../../static/img/image.png" alt"Image&quo…