驱动例程详解(-)

[Windows驱动开发](三)基础知识——驱动例程 一、NT式驱动的基本例程 1. 驱动入口函数——DriverEntry // 驱动程序的一般性定义 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath); // DriverEntry的主要工作是对驱动程序进行初始化。它由系统进程System调用的。 驱动被加 阅读详情

大多数标准驱动程序例程及其使用的一些配置相关的对象是由 I/O 管理器定义。驱动程序对象是不透明的:只有定义的系统组件(这里是 I/O管理器)“知道”对象类型的内部结构,并能直接访问对象包含的所有数据。定义的系统组件通常输出支持例程,驱动程序和其他内核模式组件能调用它们以 操纵那些组件的对象。

内核模式驱动程序必须在它的驱动程序对象中定义下列的入口点: 
所有的驱动程序必须有一个 DriverEntry 例程,,至少一个 Dispatch 例程,并且必须在其驱动程序对象中为驱动程序处理的每个IRP_MJ_XXX 定义发送入口点。驱动程序能拥有与它所能处理的IRP_MJ_XXX 功能同样数量的 Dispatch 例程。    如果在系统运行时驱动程序能被替换,驱动程序必须有 Unload 例程,并且在其驱动程序对象中定义一个 Unload 入口点。Unload 例程负责释放任何系统资源,诸如 Windows 2000 对象或者驱动程序分配的内存,这些资源通常在驱动程序本身被从系统卸载之前使用。 
所有的 PnP 驱动程序必须有 AddDevice 例程,并且在驱动程序对象的驱动程序扩展中定义其入口点。AddDevice 例程负责为驱动程序控制的每一个 PnP 设备创建和初始化设备对象。 
驱动程序可以有 StartIo 例程,并且能在其驱动程序对象中定义一个 Startlo 入口点。没有 StartIo 例程的任何最低层驱动程序必须创建并且管理发送到其 Dispatch 例程的内部 IRP 队列,除非它能在它的Dispatch 例程中完成它得到的所有 IRP。较高层驱动程序可以有 StartIo 例程,但是很少这样做,这是因为较高层驱动程序通常把IRP 从它们的 Dispatch 例程直接传递到低层驱动程序。

下面对一些驱动例程进行讨论:

DriverEntry 例程:
每个驱动程序必须有一个 DriverEntry 例程以用来初始化驱动程序范围的数据结构和资源。当 I/O 管理器装入驱动程序时,它调用 DriverEntry 例程。对于一个支持“即插即用”(PnP)的驱动程序,就象所有的驱动程序将要支持一样,DriverEntry 例程负责驱动程序的初始化,而 AddDevice 例程负责设备初始化(也可能是处理 PnP IRP_MN_START_DEVICE请求的 Dispatch 例程)。驱动程序初始化包括输出该驱动程序其他入口点,初始化该驱动程序使用的特定对象,并设置每个驱动程序系统资源。
每个 DriverEntry 例程都运行在位于 IRQL PASSIVE_LEVEL 的系统线程环境中。因此,只要驱动程序不控制持有系统页文件的设备,任何由 ExAllocatePool 在初始化过程中分配的专用内存都能从页式存储池中取得。在 DriverEntry 返回控制前,分配的内存必须由ExFreePool 释放。当然,设置 Reinitialize 例程的驱动程序可以在它调用IoRegisterDriverReinitialization 的时候传送一个指针到内存,从而使驱动程序的Reinitialize 例程负责释放已分配的内存。

DriverEntry 例程在以下阶段中初始化: 
1.  为需要与其设备通信的硬件配置信息(如果有)分配内存。
2.  在驱动程序对象中设置驱动程序的 Dispatch、AddDevice、StartIo(如果有)和Unload(如果有)入口点。 
3.  建立所有驱动程序对象或其他系统资源,例如自旋锁,使驱动程序可以用它们来处理I/O 请求。 
4.  释放任何不再需要的已分配内存,可能调用 IoRegisterDriverReinitialization,并返回一个适当的 NTSTATUS 值。

在 Windows 2000 和 WDM 驱动程序中,每个设备对象应在 AddDevice 例程或者在处理 PnP

IRP_MN_START_DEVICE 请求的 Dispatch 例程中分配,而不是在 DriverEntry 例程中。

一个驱动程序可能需要为其他驱动程序范围的使用分配额外的系统存储空间。如果这样,DriverEntry 例程可以调用一个(或多个)下列例程: 
.  IoAllocateDriverObjectExtension,创建一个与驱动程序对象连接的上下文区间。 
.  ExAllocatePool,用于页式或非页式系统内存空间。 
.  MmAllocateNonCachedMemory 或 MmAllocateContiguousMemory,用于分配给高速缓存的非页式系统内存空间(用于 I/O 缓冲区)

如果一个驱动程序不能在其 DriverEntry 例程中完全初始化自己,它可以在 DriverEntry例程返回控制一段时间之后提供一个 Reinitialize 例程调用,这个Reinitialize 例程执行另一个驱动程序启动后必须要做的任务。

Dispatch 例程一般实现:
大多数驱动程序必须处理一些或者所有以下请求: 
.  IRP_MJ_PNP 表明一个包括 PnP 设备识别的请求,硬件配置,或者资源分配的请求。这类请求显然从 PnP管理器或者从一个与较高层驱动程序密切相关的设备发送到一个设备驱动程序。 
.  IRP_MJ_POWER 表明一个属于设备或者系统的电源状态请求。这类请求通过电源管理器或者一个密切连接的较高层驱动程序发送到设备驱动程序。关于这个例程的更多信息,
.  IRP_MJ_CREATE 表明用户模式保护子系统,可能代表应用或者特定子系统驱动程序,已请求一个与目标设备对象有关的文件对象的控制,或者一个较高层的驱动程序把其设备对象连接或者附加到目标设备对象。 
.  IRP_MJ_CLEANUP 表明,为代表目标设备对象的文件对象的处理被关闭,因此任何在清除 IRP 的驱动程序 I/O 栈位置中找到的,在给定文件对象目标设备的当前队列中的IRP, 应该被取消。 
.  IRP_MJ_CLOSE 表明代表目标设备对象的文件对象句柄或指向目标设备对象的指针已经被关闭,还表明没有未完成的、对文件对象指针的引用。 
.  IRP_MJ_READ 表明 I/O 请求从下层物理设备向系统传输数据。 
.  IRP_MJ_WRITE 表明 I/O 请求从系统向下层物理设备传输数据。 
.  IRP_MJ_DEVlCE_CONTROL 表明一个带有系统定义的,指定一个被发送给设备驱动程序的具体设备操作的特定设备类型 I/O 控制码的请求. 
.  IRP_MJ_INTERNAL_DEVICE_CONTROL 表明一个传给设备驱动程序的请求,大多数情况下是来自一个紧密连接的较高层驱动程序,通常带有一个私有的、驱动程序特定的及特定设备类型的或特定设备的 I/O 控制码,该控制码请求一项特定设备类型的或特定设备的操作。

大多数 Dispatch 例程如下处理输入 IRP: 
1.在 IRP 中检测驱动程序的 I/O 栈位置以决定做什么,并且如果有参数的话,检测参数的有效性。 
2.尽可能满足请求并完成 IRP;否则,由较低层驱动程序或其他设备驱动程序例程传送它以做进一步处理。

如果一个输入 IRP 能被迅速完成,Dispatch 例程要做以下工作: 
1.通常将 IRP 的 I/O 状态块中的 Status 与 Information 成员设置为恰当的值:    
.  Dispatch 例程将 Status 设置为 STATUS_SUCCESS 或者一个适当错误 STATUS_XXX,可以是调用一个支持例程所返回的值,或者对于某些的同步请求来说,是一个较低层驱动程序返回的值。 如果较低层驱动程序返回 STATUS_PENDING,较高层驱动程序不应当用 IRP 调用IoCompleteRequest,除非它首先用该 IRP 调用了IoMarkIrpPending。当然,较高层驱动程序的 Dispatch 例程未必为返回 STATUS_PENDING 的较低层驱动程序完成任何 IRP。 
.  如果满足了一个传输数据的请求,例如一个读或写请求,则将 Information 设置为成功传输的比特数。 
.  对其他以 STATUS_SUCCESS 完成的 IRP 的不同特定请求而将 Information 设置为不同的值。 
.  对以警告性 STATUS_XXX 完成的 IRP 的不同特定请求而将 Information 设置为不同的值。例如,对于象STATUS_BUFFER_OVERFLOW 这样的警告,将 Information 设置为传输的字节数。 
.  通常,对以一个错误 STATUS_XXX 完成的请求,将 Information 置为零。 
2.用 IRP 和PriorityBoost IO_NO_INCREMENT 调用 IoCompleteRequest。 
3.返回已在 I/O 状态块中设置的适当的 STATUS_XXX。注意,对 IoCompleteRequest 的调用使给定的 IRP不能被调用者访问,因此来自一个 Dispatch 例程的返回值不能从一个已完成的 IRP 的 I/O 状态块中设置。 
以下是用 IRP 调用 IoCompleteRequest 的实现方针: 
.  调用 IoCompleteRequest 之前,总是释放驱动程序持有的自旋锁。 完成一个 IRP 的时间是不确定的,尤其是在一系列分层的驱动程序中。另外,如果一个较高层驱动程序的 IoCompletion 例程向一个正持有自旋锁的较低层驱动程序发送一个 IRP  ,就会产生死锁

通常,驱动程序不在它们的 Dispatch 例程中完成 IRP,除非给定请求的参数是无效的,或者在设备驱动程序中,特定 IRP_MJ_XXX 不要求设备 I/O 操作。 一个较高层驱动程序往往将它传送给较低层驱动程序来处理.

一个最低层驱动程序按照以下方针在它的 Dispatch 例程里完成 IRP:
1. 如果 Dispatch 例程确定它自己的 I/O 栈位置里有参数是无效的,它应当用一个适当的错误 STATUS_XXX 立即完成该 IRP。
2.如果 IRP 包含功能码 IRP_MJ_CLEANUP,DispatchCleanup 例程必须为给定的驱动程序清除 IRP 的 I/O 栈位置的文件对象,完成当前在目标设备对象排队的所有 IRP,并完成清除 IRP。
3.如果请求不要求设备 I/O 操作,Dispatch 例程应满足请求并完成 IRP。
4.否则,Dispatch 例程必须用 IRP 调用 IoMarkIrpPending,将 IRP 排队到其他驱动程序例程以做进一步处理,并返回 STATUS_PENDING。

i.MX RT1170 MIPI DSI屏幕驱动实战:从时钟配置到sd_jpeg例程详解 MIPI DSI(Display Serial Interface)是一种广泛应用于嵌入式系统的高速串行显示接口标准,它通过差分信号传输,能以极少的连线实现高分辨率屏幕的驱动。其核心原理在于将并行像素数据打包成高速串行数据包,经由D-PHY物理层传输,从而显著节省GPIO和PCB布线空间。这项技术的价值在于为资源受限的嵌入式设备提供了驱动高分辨率显示屏的可行方案,尤其适合智能家居、工业HMI、便携设备等对显示质量和硬件成本有双重要求的场景。本文以NXP i.MX RT1170高性能MCU为平台,深入剖析如何 阅读详情

相关推荐

STM32F4 FSMC驱动TFT LCD详解:从正点原子例程到CubeMX配置的迁移心法

本文详细解析了STM32F4 FSMC驱动TFT LCD的实现方法,重点介绍了从正点原子例程到CubeMX配置的迁移技巧。通过对比分析手动编码与CubeMX配置的差异,帮助开发者理解FSMC时序参数设置、GPIO配置等关键点,并提供常见问题解决方案和性能优化建议,适用于探索者开发板用户快速掌握HAL库下的LCD驱动开发。

weixin_42521843的博客 159

驱动开发之 驱动程序中几个常见例程

关于驱动设计中的几个常的例程:   DriverEntry例程   一个DriverEntry例程初始化一个驱动程序,所有的驱动程序必须有一个DriverEntry例程.当装载驱动程序的时候,PNP管理器为每个驱动程序调用一次DriverEntry.在驱动程序初始化之后,PNP管理器能够调用驱动程序的AddDevice例程来初始化由该驱动程序控制的设备.   DriverEntry例程示例如

Lydia的博客 1991

华大芯片HC32F460驱动库及例程实战详解

本文还有配套的精品资源,点击获取 简介:本文深入探讨了华大芯片HC32F460高性能、低功耗Cortex-M4单片机的驱动库及例程,旨在帮助开发者深入理解并应用该芯片。HC32F460具有丰富的外设接口和驱动库,覆盖所有外设功能。通过例程的实践,开发者可以学习初始化系统、配置外设、编写中断服务程序等关键步骤,提升嵌入式系统开发的专业技能。 1. HC32F460芯...

weixin_42613360的博客 8394

ST75256 ST75160 ST75263

最早是ST7065(字符)ST7920(中文),ST7565(128x64点阵),ST7529(256x160灰阶),这几个IC都是当时遗留的日韩驱动波形技术,B-TYPE,缺点电压多V0,V1,V2,V3,V4,V5,还有数个升压CAPN-,CAPN+,外围电容数量可达10颗以上,功耗高,静电损坏率高。随着市场的竞争,和产品的原生问题,都需要矽创来做出创新,在Vincent,William,Kevin,Sean的带领下,矽创决定了必须走差异化道路,必须有自己的技术创新,这条路线方针也是延续到了今天。

sainty07的博客 3709

FPGA EP4CE6F17C8N 多媒体接口驱动例程详解

在现代电子设计与嵌入式系统开发中,FPGA(现场可编程门阵列)扮演着至关重要的角色。本章将探讨FPGA的基本概念,理解其作为可编程逻辑设备在硬件设计中的灵活性和优势。我们将从FPGA的起源、工作原理讲起,并概述它的关键特性,为后续章节中深入探讨特定FPGA芯片及其应用场景打下基础。EP4CE6F17C8N是Altera公司生产的一款低成本、低功耗的FPGA芯片。它采用了40nm工艺技术,拥有丰富的逻辑单元、存储资源以及DSP处理能力,满足多种复杂设计的需求。

weixin_42518334的博客 1154

ST75256驱动及DATASHEET

LCD驱动芯片,ST75256的驱动及文档。适合深圳晶联讯的LCD屏。单片机采用8051。模拟IO方式

【全网首发】ST75256 液晶模块MicroPython驱动

MicroPython ST75256

weixin_42094079的博客 2795

一个简单的驱动程序例程

可以参考。配套博客解释,可以一看。。。http://blog.youkuaiyun.com/li171049/article/details/17612283

《Windows驱动开发技术详解》之StartIO例程

https://www.cnblogs.com/predator-wang/p/5567522.html

weixin_44628381的博客 296

ST75256驱动程序和规格书

ST75256驱动例程和中英文规格书,中文版为0.6,英文版为1.6b,因项目需要花钱搜集而来,1个积分分享出来。

st75256.pdf

ST75256翻译中文手册

N32G43X例程 - 硬件SPI驱动LCD详解

N32G43X例程 - 硬件SPI驱动LCD详解 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了一份详细的国民技术N32G43X硬件SPI驱动LCD的例程,旨在帮助开发者理解和掌握SPI主机模式下的LCD驱动实现。 例程简介 本例程主要包含以下内容: N32G43X硬件SPI接口配置 LCD初始化过程 数据传输与显示控制 通过这份例程,您将能够学习到如何使用N3...

gitblog_06751的博客 419

ST75256_V1.4.pdf

ST75256_V1.4.pdf

N32G43X例程-硬件SPI驱动LCD详解:助力开发者高效驱动LCD显示屏

N32G43X例程-硬件SPI驱动LCD详解:助力开发者高效驱动LCD显示屏 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代电子设备中,LCD显示屏的应用已变得十分广泛,从简单的显示信息到复杂的图像显示,LCD都扮演着重要角色。N32G43X例程-硬件SPI驱动LCD详解,就是专门为帮助开发者掌握N32G43X单片机硬件SPI接口驱动LCD显示屏而设计的开源项目...

gitblog_06747的博客 636

ST75256中文_ST75256fpga_st75256灰度级_st75256程序_ST7256中文_ST75256串行c51

24模集成电路(LSI),包含 256 段和 162 个公用段。芯片可以通过 8 位并行(8080-seriesor 6800-series type)、4 线串行和 I2C 多种方式与微处理器相连。显示数据存储在片内 RAM(DDRAM)低 。此外,LCD 系统的所有必须电路全部内建,可以构造一个具有最少组件的LCD 显示系统。

【2021末九软工边缘人保研】川大-中科院网络中心-华师夏令营+哈工大本-中科院网络中心-西交-厦大-中山-武大-北航预推免

2021末九软工边缘人保研记录一、写在前面二、个人背景 一、写在前面 2020年计算机保研可谓是诸神黄昏,卷的头破血流(指我等菜鸡)。疫情的原因,今年的夏令营和预推免基本全部改为线上,机试取消,能不能拿到offer基本完全取决于背景以及面试表现(当然也有个别头铁非要机试,甚至笔试的学校)。大佬们offer收割不停,我等边缘人只能看着一封封拒信发呆。 这种情况下,只有985 Rank5%以及211 Rank2%之前的大佬能够较为轻松地拿到面试入场券。贴一个上交电院夏令营要求你们感受一下: 预推免相比起夏令营

weixin_43222706的博客 4235

STM32 PWM输出原理和直流电机PWM驱动原理详解及例程

这次讲一讲STM32输出PWM的原理以及PWM可以作为信号传输数据的原理。 PWM会有很多地方用到,有控制灯的亮度,控制电机,控制舵机或者其他一些外设,有时候你的单片机所输出的PWM是作为信号去控制,有时候是用它来提供一个可控的超小功率的电压。 首先要知道什么是PWM信号。PWM信号是“Pulse(脉冲) Width(宽度) Modulation(调制)”的缩写,意思呢就是 可控制宽度的脉冲信号。...

qq_44776401的博客 3万+

别再到处找数据了!用Python+Tushare Pro免费获取A股行情、财务、龙虎榜数据(附完整代码)

本文详细介绍了如何使用Python和Tushare Pro免费获取A股行情、财务数据和龙虎榜数据,并构建本地金融数据仓库。通过完整的代码示例,帮助读者快速掌握金融数据接口的使用方法,提升量化分析效率。Tushare Pro作为免费、稳定的数据源,覆盖全面且API友好,是个人投资者的理想选择。

weixin_30596343的博客 617

单片机LCD驱动初始化参数详解:从ST7567/ST7920例程到自主调试

LCD驱动初始化是嵌入式显示系统的基础环节,其核心原理是通过特定命令序列配置驱动芯片的寄存器参数。从技术价值看,深入理解偏置设置、电阻比率、电子音量等关键参数,能够实现显示效果的精准控制和功耗优化。在单片机开发中,掌握SPI/I2C通信协议配置和初始化代码调试方法,对于解决显示异常、花屏等常见问题至关重要。特别是在ST7567、ST7920等常见驱动芯片的应用中,通过数据手册阅读和参数化配置,可以显著提升显示兼容性和调试效率。本文基于实际工程实践,详细解析了初始化命令序列的构成原理和调试技巧,帮助开发者从简

weixin_34166847的博客 318

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 240

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3024
上一篇: 基于PassThru的NDIS中间层驱动程序扩展
下一篇: VC实现驱动程序的开发和编译的完整步骤
codestinity
博客等级 码龄16年 29粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值