流微型驱动开发指南(二)

流微型驱动开发指南(六) 六、Minidriver的控制流程 下面要介绍的这几步,一般都和Minidriver的初始化、调用和卸载密切相关。将要用到的命令和结构在DDK的其他章节均有详细描述。 Minidriver的初始化、调用和卸载的步骤如下: 1.PnP管理器枚举到Minidriver所支持的硬件适配器插入,然后PnP管理器通过检查注册表去解析所有相关的符号引用,并向I/O子系统发送请求。 2.I/O子系统加载Mini 阅读详情

二、Stream Class和 Minidriver之间的接口

流类接口(Stream Class Interface)主要由介于Class Driver和Minidriver之间的一系列的函数调用组成。Class Driver对请求的流程(Request Flow)进行控制,当有必要对适配器硬件进行存取时,它就调用适配器的Minidriver。Class Driver还负责对多处理器和中断同步作出响应。当Class Driver和Minidriver都初始化完毕之后,Minidriver将处于一个被动的地位,它只能被Class Driver所调用,而绝大多数的调用都是非常低级的服务请求。

对Minidriver来说,对命令和信息(Commands and Information)进行控制的最基本的机制就是流请求块(Streaming Request Block)。每个Minidriver都有一系列的SRB来对其某个特定的功能进行访问,而且一般说来,设备所支持的每种数据流都有相应的SRB与之对应。这些信息(SRB)通过操作系统控制的DMA缓冲区(它是一个环形队列)传递给设备。

一个SRB由一个命令码字段,以及与该命令码相关联的其他数据所组成。结构体HW_STREAM_REQUEST_BLOCK包含了和特定的SRB相关的所有信息。我们常常把这个结构体就简称为SRB,它体内还包含了一些作为对命令码的补充信息的其他参数。结构体HW_STREAM_REQUEST_BLOCK的定义如下:

typedef struct _HW_STREAM_REQUEST_BLOCK

{

{

ULONG                      SizeOfThisPacket;

SRB_COMMAND              Command;

NTSTATUS                   Status;

PHW_STREAM_OBJECT       StreamObject;

PVOID                        HwDeviceExtension;

PVOID                        SRBExtension;

 

union _CommandData

{

    PKSSTREAM_HEADER                                                  DataBufferArray;

    PHW_STREAM_DESCRIPTOR                                        StreamBuffer;

    KSSTATE                                                         StreamState;

    PSTREAM_PROPERTY_DESCRIPTOR                                             PropertyInfo;

    PKSDATAFORMAT                                              OpenFormat;

    struct _PORT_CONFIGURATION_INFORMATION *           ConfigInfo;

    HANDLE                                                       MasterClockHandle;

    DEVICE_POWER_STATE                                        DeviceState;

    PSTREAM_DATA_INTERSECT_INFO                             IntersectInfo;

} CommandData;

 

ULONG                                                       NumberOfBuffers;

ULONG                                                       TimeoutCounter;

ULONG                                                       TimeoutOriginal;

struct _HW_STREAM_REQUEST_BLOCK*                             NextSRB;

PIRP                                                         Irp;

ULONG                                                       Flags;

PVOID                                                       HwInstanceExtension;

 

union

{

    ULONG   NumberOfBytesToTransfer;

    ULONG   ActualBytesTransferred;

};

 

PKSSCATTER_GATHER        ScatterGatherBuffer

ULONG                       NumberOfPhysicalPages;

ULONG                       Reserved[2];

} HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;

关于对以上其他参数的解释,参见DDK文档,这里不再赘述。

下图解释了流类(Stream Class)和Minidriver在初始化时所进行的交互动作。

·初始化适配器

所有的流式Minidriver函数并不一定非要和Minidriver的中断服务例程(Interrupt Service Routine,ISR)同步,因而Minidriver的代码是不可重入的(Non-re-entrant,相应的概念叫做可重入代码,又叫做纯代码。关于可重入代码的概念,请参考西电版操作系统教材),亦即,当Minidriver正在执行一个线程的时候,不能再调用Minidriver内其他任何函数,包括中断服务例程在内。这种非可重入的特性即便在支持多处理器的Windows NT/2000系统下也是存在的,这样可以令Minidriver编写起来更加方便。为了达到这样的特性,流类驱动(Stream Class Driver)会在Minidriver体内任何例程被执行时,通过内核例程KeSynchronizeExecution屏蔽Streaming Minidriver的中断请求IRQ(和所有低优先级的IRQ)。如果想了解更多关于同步的信息,请参看MiniDriver同步一章。Streaming Minidriver可以在必要的时候调用WDM系统服务。但是,Minidriver自己并没有设备对象,他是利用ClassDriver的设备对象来完成系统调用的。绝大多数Minidriver是不需要进行WDM系统调用的,因为几乎所有必要的功能都已经被Class Driver所涵盖了,没有必要直接进行系统调用。

必须知道的是,当进行WDM系统服务调用时,所有的Minidriver的入口点都会在高于DISPATCH_LEVEL的中断优先级下被调用(注意不包括DISPATCH_LEVEL中断优先级)。但有一个例外,那就是StreamClassCallAtNewPriority例程,此函数允许在DISPATCH_LEVEL

或PASSIVE_LEVEL中断优先级上进行系统服务调用,具体哪个优先级取决于调用时所指定的优先级别。如果要一劳永逸地修改这个对IRQL的调用限制,可以通过把HW_INITIALIZATION_DATA结构体中的BOOL型成员变量TurnOffSynchronization简单置为TRUE来实现之。

流Mini驱动开发(译自Microsoft DDK) 本节详细讨论了已经过时的Stream.sys Class Driver。随着Microsoft Windows XP的正式发布,Microsoft建议硬件制造商考虑使用下一代Class模型——AVStream——来开发新的,非音频多媒体驱动程序。相关细节可参看《AVStream Overview》一章。Microsoft现在只对Stream.sys提供基本的支持。如果你要开发一个音频Minidri 阅读详情

相关推荐

流微型驱动开发指南(五)

PORT_CONFIGURATION_INFORMATION各成员解释如下:·SizeOfThisPacket  设定本结构的大小,由Class Driver负责填写该域。·HwDeviceExtension  指向Minidriver的设备扩展结构(Device Extension)的指针。Minidriver会藉此buffer记录一些对Minidriver来说是公有的,但是对外是私有的信息。此

人是会思考的一棵苇草 1913

驱动设计流程

MiniDriver上层还有一个叫做ClassDriver的驱动。MiniDrive通过DriverEntity向ClassDriver注册它自己。这个过程是通过向ClassDriver传递HW_INITIALIZATION_DATA结构实现的。MiniDriver中的Drive

snowwood的专栏 826

Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程

Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程 文章目录Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程参考链接:前言:配置步骤: 参考链接: Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程 前言: 说到Digispark(ATTINY85) 微型开发板,我是真滴有很多槽要吐,由于我买来之后一直放着它在吃灰,淘宝的链接都快失效了。 好不容易找到了一个没失效的链接,下载了对应的软硬件驱动,发现插入之后,端口一直无法读取。

hehedadaq的博客 4383

WinXP下虚拟摄像头驱动程序开发

 WinXP下虚拟摄像头驱动程序开发摄像头驱动程序的主要目的是通过硬件捕捉视频信号。微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序。第三方厂商开发的软件,如QQ和MSN等软件,都可以通过这个接口读取视频摄像头采集的数据。本文将介绍一个虚拟摄像头的实现,读者可以根据自己的需要,结合硬件设计出符合这个接口的USB或者PCI摄像头驱动程序。1               驱动框

Tech is Online(物联网技术传播) 5427

Pixie微型LED链式显示模块技术解析与嵌入式驱动开发

链式LED显示模块是嵌入式人机交互的关键组件,其核心在于单线级联、分布式智能控制与低资源占用的协同实现。Pixie模块通过集成ATTINY45微控制器,将协议解析、PWM调光与数据中继功能下沉至像素节点,显著降低主控实时负担,使Arduino、STM32等MCU可在无额外硬件加速条件下驱动数十级显示。该架构兼顾了紧凑尺寸(20.6mm×34.7mm)、宽压供电(2.7–5.5V)与工业级可靠性(过温降频、奇偶校验、恒流可编程),适用于状态看板、IoT设备指示、工业HMI等对空间、功耗与鲁棒性敏感的场景。本文

weixin_35935514的博客 523

驱动程序的基本结构(WDM)

简单介绍了驱动对象、设备对象、设备扩展,重点介绍了WDM驱动的结构,如:驱动入口、派遣函数、AddDevice(设备创建)、设备层次结构等。

成功的方式只有一个,按自己的方式,度过人生。欢迎共赴知识与乐趣的探索之旅! 880

流微型驱动开发指南(一)

流微型驱动开发指南——翻译:codewarrior@HS5@HS5注意:本节详述了已经过时的Stream.sys类驱动。随着Microsoft Windows XP的正式发布,Microsoft建议硬件制造商考虑使用下一代Class模型——AVStream——来开发新的,非音频多媒体驱动程序。相关细节可参看《AVStream Overview》一章。Microsoft现在只对Stream.

人是会思考的一棵苇草 2251

保姆级教程:用Python+Mediapipe实时捕捉手势,驱动Unity虚拟手模型(附完整源码)

本文详细介绍了如何利用Python的Mediapipe库和Unity实现实时手势识别与虚拟手模型驱动。通过OpenCV进行图像采集,Mediapipe提供21个手部关键点识别,结合UDP通信协议实现Python与Unity之间的低延迟数据传输。教程包含完整源码、环境配置、核心代码实现及性能优化技巧,适用于VR教育、游戏开发等需要自然交互的场景。

weixin_42531779的博客 362

window 显示驱动开发-微型端口程序的初始化(一)

DriverEntry 分配 DRIVER_INITIALIZATION_DATA 结构,并使用DXGKDDI_INTERFACE_VERSION填充 DRIVER_INITIALIZATION_DATA 的 Version 成员,并使用指向显示微型端口驱动程序的其他入口点函数 ((即显示微型端口驱动程序实现的函数) )的指针填充DRIVER_INITIALIZATION_DATA的其余成员。用户模式显示驱动程序调用运行时提供的回调函数来访问显示微型端口驱动程序中的内核模式服务。

王马的博客 1330

基于STM32开发的智能语音控制系统

本文将介绍如何使用STM32微控制器开发一个智能语音控制系统,通过语音识别模块、OLED显示屏、Wi-Fi模块等实现对家用电器或其他设备的语音控制。智能语音控制系统的核心是STM32微控制器,通过语音识别模块识别用户的语音指令,并根据指令控制家用电器或其他设备。:定期测试语音识别模块、继电器控制模块、OLED显示屏和Wi-Fi模块的工作状态,确保系统能够在各种情况下正常运行,并保持智能语音控制系统的可靠性。本系统同样适用于办公环境,可以通过语音指令控制办公室设备,如照明、空调等,提供智能化的办公体验。

stm32d1219的博客 6911

FFTW多核优化避坑指南:从交叉编译到ELF2板载OpenMP部署全流程

本文详细介绍了在ELF2开发板(RK3588平台)上为FFTW库配置OpenMP多核并行的完整流程与避坑指南。内容涵盖从交叉编译、库依赖处理到板载部署的实战步骤,并深入分析了RK3588的big.LITTLE架构对线程调优的影响,帮助开发者在嵌入式环境中高效利用多核性能。

2a4s6d8f0g的博客 273

流微型驱动开发指南(三)

三、开始着手编写Stream Minidriver设计Stream Class Driver的主要目标,就是处理两个工作,一是处理操作系统,操作系统包含了对复杂的对多处理器的支持,二就是对内核流进行支持。这样Minidriver只需要对它必须执行的,与设备相关的操作进行处理即可。Class Driver为Minidriver分配内存空间,对Minidriver可能用到的NT内核资源进行登记,并(随

人是会思考的一棵苇草 1504

SAP Workflow审批功能实例详细过程

SAP Workflow审批功能实例详细过程

陈送平的博客 6573

window 显示驱动开发-微型端口程序的初始化(二)

帧缓冲内存(VRAM)系统内存孔径(AGP/GART)设备本地内存(DEVICE_LOCAL)WDDM版本数据结构关键增强1.0-1.1基础段属性定义1.2+支持UMA架构、缓存策略控制位。

王马的博客 1374

2025数学建模国赛A题1-4问详解(论文+完整代码)

本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。

Eloveeeee的博客 2802

FOC无刷电机磁编码器机械角度与电角度自动对齐校准及电机极对数自动获取的方法

本文提出磁编码器机械角度与电角度自动对齐校准方法及电机极对数自动获取方案。通过通直流电流使转子定向,读取机械角度并计算电角度偏移量,实现精确对齐;同时利用低速旋转时检测反电动势过零点次数,结合机械角度变化量自动计算极对数。核心算法包括转子定向、偏移量计算、极对数推导等步骤,并提供了基于STM32的C语言实现代码。该方法适用于工业伺服、机器人等高精度控制场景,需注意负载安全、参数调整和误差处理。两种自动化流程可有效解决电机安装调试中的角度对齐和参数识别问题。

qq_29653575的博客 2496

微型驱动程序、微型端口驱动程序和驱动程序对

微型驱动程序或微型端口驱动程序可以用作半个驱动程序对。诸如(微型端口、端口)的驱动程序对可以简化驱动程序开发。在驱动程序对中,一个驱动程序处理整个设备集合共同的常规任务,而另一个驱动程序处理特定于单个设备的任务。处理设备特定任务的驱动程序有多个名称,包括微型端口驱动程序、微型类驱动程序和微型驱动程序。 Microsoft 提供一般驱动程序,而独立的硬件供应商通常提供特定驱动程序。在阅读本主题之前

求索 1446

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码)

本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。

weixin_26950847的博客 266

Windows 显示驱动开发-微型端口的DriverEntry 函数

在 DriverEntry 返回后,DRIVER_INITIALIZATION_DATA 结构不需要保留在内存中。DriverEntry 应可分页。

王马的博客 860

【运动规划算法项目实战】全覆盖分区算法

全覆盖规划在机器人学领域具有重要意义,其应用场景涵盖了自动农场、扫地机器人、扫描监视无人机等多个领域。该问题的核心目标是使机器人能够从指定起点出发,规划一条避开障碍物、同时路径尽可能短的轨迹,从而实现对特定区域的全面覆盖。在实际应用中,全覆盖规划的成功实现对于提高机器人在各类环境中的工作效率至关重要。这一问题的解决涉及到高效的路径规划和规划区域分解技术。其中,梯形单元分解算法是一种常用分区的技术,过将地图上需要规划的区域进行分区,采用梯形分解的方式,可以更好地应对复杂环境。全覆盖算法规划流程。

xiewf的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

两种微型水泵介绍——微型电磁泵和微型隔膜泵

微型水泵:组成形式为电机+泵体,且泵体上有一进一出两个接口,水从入水口进,排水口出。凡是采用这种形式,且体积小巧、袖珍的水泵,都叫微型水泵。微型水泵的作用就是抽水,在各种电器具中得到非常广泛的应用。 下面介绍两种常用的微型水泵——微型电磁泵、微型隔膜泵。 电磁泵的工作原理 电磁泵是一种电磁驱动的柱塞泵,是一种高压微型泵;其特点为:结构紧凑、输出压力高、无泄漏、体积小、动态调节特性好、输出流量较小等。 等电磁线圈通电后,滑杆在电磁场力作用向右运动,密封仓容积增大,压力小于进口气压时,液体流入密封仓。

tuxinbang1989的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

流微型驱动开发指南(四)

p五、Minidriver的初始化过程当操作系统初次初始化Stream Class Minidrivers的时候会调用Minidriver的DriverEntry例程。Minidriver必须调用StreamClassRegisterMinidriver向Class Driver注册它自己。关于Stream Class Minidrivers的DriverEntry例程,请见第六部分。在Minid

人是会思考的一棵苇草 1526

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

window 显示驱动开发-微型端口程序的初始化(三)

第二次调用中,驱动程序应填充 DXGK_QUERYSEGMENTOUT 或 DXGK_QUERYSEGMENTOUT3的所有成员。第二次调用中,驱动程序应使用驱动程序支持的段的相关信息填充DXGK_QUERYSEGMENTOUT或DXGK_QUERYSEGMENTOUT3的 pSegmentDescriptor 成员中DXGK_SEGMENTDESCRIPTOR或DXGK_SEGMENTDESCRIPTOR3结构 NbSegment 大小的数组。使用WinDbg验证段布局。

王马的博客 674

微型机器人

微型智能车的潜在能力就来自于它体积小,耗电少,可以独自执行简单任务,或者组成群体完成更复杂的任务。下面一些可以自主行进、可以爬行、也可以飞行的微型机器人。 由无线电能驱动的微型爬行机器人 由纽扣电池驱动的由声音导航的机器人 世界上最小的通过抗磁性微操作驱动的可编程机器人 上面最小机器人散件 哈佛大学的Kilobot微型机器人 ^一百个Kilobots在一起相对 运动^ 荷兰科学家开发...

TSINGHUAJOKING 4422

windows显示驱动开发-在显示微型端口驱动程序中支持旋转

本文档详细说明了显示微型端口驱动程序在视频呈现网络(VidPN)中处理旋转功能的技术规范。关键点包括:1)驱动程序通过DxgkDdiEnumVidPnCofuncModality报告旋转支持;2)DirectX使用非旋转尺寸创建主图面,通过特定结构通知旋转;3)在克隆模式下,驱动程序需根据主/辅助目标和Rotate标志执行差异化旋转处理;4)Windows 8.1更新后,驱动程序必须满足主克隆路径(Offset0必须为TRUE)和辅助克隆路径(至少支持一个旋转偏移)的特定要求。文档还提供了横向/纵向优先显示

王马的博客 1038
上一篇: 流微型驱动开发指南(一)
下一篇: 流微型驱动开发指南(四)
会思考的草
博客等级 码龄25年 208粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值