转载:驱动SYS开发总结

(八)USB驱动--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目> 通过移植USB驱动,使用外接键鼠、U盘等设备 阅读详情
目录
1.驱动简介
1.1.驱动是什么
1.2.sys文件
1.3.inf文件
1.4.usb-client driver

2.WDM机制
2.1.WDM驱动的分层机制
2.2.PDO以及IRP机制
2.3.WDM驱动程序code构成
2.4.必需的处理

3.USB类驱动接口
3.1.USB类驱动和URB
3.2.URB详细
3.3.常用函数

4.我们的设备

5.SYS开发
5.1.安装配置开发环境
5.2.制作inf文件
5.3.编写以及编译驱动
5.4.驱动的安装调试

6.经验、教训总结
6.1.仔细check你的代码
6.2.调试机的必要性
6.3.谨慎和认真



----------------------------------------------------------------------------


1.驱动简介

1.1.驱动是什么
计算机的外部设备需要和计算机进行数据交换,生产外部设备的厂家如何使计算机和自己的设备交换数据呢,就是通过驱动程序,从设备中读入到计算机中,早期的Win3.1,Win9x设备驱动是vxd,Win NT是kdm, Win2k 统一发展成wdm模式。

1.2.sys文件
sys文件是驱动程序的可执行代码,其扩展名为.sys,驱动程序安装后保存在windows/system32/drivers目录中。

对于PnP设备,在设备插入后,sys文件会被windows装载到内存中,系统线程调用sys中的函数来和设备进行通信。

1.3.inf文件
inf文件是安装设备驱动程序时必须使用的文件,其扩展名为 .inf,驱动程序安装后保存在windows/inf目录中。

系统使用一个扩展名为INF的文本文件来控制与安装驱动程序相关的大部分活动。INF文件应该由驱动程序开发人员随驱动程序一起提供。通过INF文件可以告诉操作系统哪一个文件需要复制到用户硬盘上,应该增加或修改哪一个注册表项,如此等等。

inf中提供产品设备的产品id,以及对应的sys文件名,驱动class名,class guid,

1.4.usb-client driver
HOST 与DEVICE, ENDPOINT与PIPE

我们进行的USB驱动开发大多数是usb-client driver,系统厂商大多数都已经把USB类驱动做好,我们则是在类驱动之上开发针对自己设备的驱动,习惯上称做usb-client driver,其在整个软件构架中地位如下:
UHCD--USBD--USB CLIENT DRIVER--DLL OR APP

usb-client driver仍然遵守WDM模型,是WDM驱动。因为要支持PnP,所以要很小心的处理自己的资源以及IRP, 随时准备处理拔出或者插入设备的情况; 电源处理不当也会使系统无法唤醒。

需要了解的知识:wdm,usbdi,our usedevice,
wdm:
目标: a, 能提供接口函数,
b, 能实现pnp,电源消息处理,wmi,i/o等处理,
usbdi:
urb,irp,等时,中断,控制,批传输的概念
our usedevice:
我们的usb设备的传输类型,设备的能力。



2.WDM机制
WINDOWS 9X 及以前版本VXD,WIN NT 使用KDM机制,WIN2000后的驱动程序都使用WDM机制。

2.1.WDM驱动的分层机制
WDM驱动的分层图:

2.2.PDO以及IRP机制
一种设备使用相同的驱动程序,每层驱动程序装载后,有一个驱动对象(driver object)。

在驱动对象中,有设备链,一个节点是一个设备对象(device object), 称为pdo,对应一个设备,用设备链实现多个设备支持。

系统使用irp(i/o request package)和设备进行通信,调用驱动程序函数时候,会传递需要操作的的设备对象pdo,以及进行通信使用的irp。

2.3.WDM驱动程序code构成
1, 函数构成:
基本函数:driverentry,adddevice,unload 入口函数driverentry必须使用driverentry命名,并向系统注册 其他函数名。
i/o控制函数:startio,oninterrupt,dpcforisr,adaptercontrol。
分发函数:Dispatchpnp,Dispatchpower,Dispatchwmi,dispatchread, dispatchwrite。
其它见到的函数:deviceioctl,Dispatchcreate,Dispatchclose。

这些函数除了driverentry外,其它的都可以可以自己命名,由 driverentry向系统注册。

2,必要性说明:
必须函数:
基本函数:driverentry,adddevice,
分发函数:Dispatchpnp,Dispatchpower, Dispatchwmi,
可选函数:
处理请求队列需要的函数:i/o控制例程:startio,
如果设备需要产生中断:i/o控制例程:oninterrupt,dpcforisr,
DMA操作需要的函数:i/o控制函数:adaptercontrol,
分发函数:dispatchread,dispatchwrite,

2.4.必需的处理
基本函数:driverentry,adddevice,
分发函数:Dispatchpnp,Dispatchpower, Dispatchwmi,


在driverentry中必须完成所需要的其他函数的注册,使得系统可以调用这些函数与设备进行通信。

在有新的设备插入时系统会调用adddevice,由驱动程序自己调用IoCreateDevice创建设备对象,并attach到设备堆栈中,并初始化设备对象的Flag成员。

Dispatchpnp,处理PnP管理器的发出的主功能码为IRP_MJ_PNP 的i/o请求,实现设备对即插即用的支持。

Dispatchpower,处理电源管理器发出的主功能码为IRP_MJ_PNP 的i/o请求,实现设备对电源管理的支持。

Dispatchwmi,处理WMI管理器发出的主功能码为IRP_MJ_SYSTEM_CONTROL 的i/o请求,实现设备对WMI(WINDOWS management instrumentation)的支持,作用是可以监控设备性能。

详细资料,可以查阅ddk,D_P2003-050_MBCUSB2_TRN_WDMSTRUCT_CN.ppt



3.USB类驱动接口


3.1.USB类驱动和URB
在这个UHCD--USBD--USB CLIENT DRIVER--DLL OR APP结构中, usbd将usb端口芯片驱动uhcd进行了包装,提供更便利的功能,使得其它设备驱动程序可以简单的利用这些功能。

usbd提供的函数就称为usbdi(usbd interface),主要利用 urb(usb request block), 将urb放入irp(可以自己分配irp)中传递给usbd,由usbd完成 usb设备的相关操作。

3.2.URB详细
请阅读DDK帮助。

3.3.常用函数
UsbBuildVendorRequest,UsbBuildGetDescriptorRequest, UsbBuildSelectConfigurationRequest,USBD_ParseConfigurationDescriptorEx, USBD_CreateConfigurationRequestEx,USBD_ParseDescriptors



4.我们的设备


我们的设备有一个控制管道,两个bulk读写管道(自己的命令都通过读写来完成),支持usb2.0, 支持标准usb请求。



5.SYS开发


5.1.安装配置开发环境
1、确定你已经安装了Visual C++,
2、安装2000 DDK,安装2000 DDK成功后,在“开始”->“程序”里应该有“Development Kits”->“Windows 2000 DDK”的项目。(注意一定要先安装好VC,然后才安装DDK,这个顺序决不能颠倒!!)

DDKROOT环境变量设置为Windows 2000 DDK的基目录,如果不是的话,必须进行手工配置。请在控制面板“系统”属性的“高级”标签环境变量编辑器中设置好这个环境变量。例:DDK的安装路径为:E:WINDDK3790 则新建用户环境变量变量名为: DDK ROOT 变量值为: E:WINDDK3790

5.2.制作inf文件
系统使用一个扩展名为INF的文本文件来控制与安装驱动程序相关的大部分活动。INF文件应该由驱动程序开发人员随驱动程序一起提供。通过INF文件可以告诉操作系统哪一个文件需要复制到用户硬盘上,应该增加或修改哪一个注册表项,如此等等。

INF文件包含一些名字由方括号括起来的段,大部分段都含有一系列keyword = value形式的指令。例如:[Version] Signature="$CHICAGO$" Class=UUSBD ClassGUID=B51CA6BA-E750-4dff-9CDE-6AA963B17052{} provider=%LEADING% DriverVer=08/27/2001,0.1.0.1

inf制作详细参看,D_P2003-050_MBCUSB2_TRN_INFSTRUCT_CN.ppt

5.3.编写以及编译驱动
1 、makefile 文件,2 、Sources文件

makefile的内容是:
# # DO NOT EDIT THIS FILE!!! Edit .sources. If you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV)makefile.def

Sources:
TARGETNAME=HelloWDM TARGETTYPE=DRIVER DRIVERTYPE=WDM TARGETPATH=OBJ ? INCLUDES=$(BASEDIR)inc; $(BASEDIR)incddk; TARGETLIBS=$(BASEDIR)lib*freeusbd.lib? SOURCES=HelloWDM.cpp 这个文件指定了生成的驱动程序目标名、存放obj文件的位置、lib文件的位置、被编译的源文件对象 值得注意的是,“=”前后不能有空格,否则编译的时候会出错。

编译:
从开始菜单里选择编译环境 如:Windows 2000 Checked Build Environment.exe 它从配置文件sources中读出待编译的程序的配置,包括源文件、目标文件等, 从环境变量include中得到引用文件的地址,然后调用编译链接器进行实际的编译链接工作。 编译所产生的日志文件: Build.log 链接中执行的命令行 Build.wrn 链接中遇到的警告 Build.err 链接中遇到的错误

5.4.驱动的安装调试
Win2000以上都使用*.inf文件来控制与安装驱动程序相关的大部分活动。Inf文件由驱动开发人员随驱动程序一起提供。控制面板->添加新硬件,从硬件列表中选择其他设备,并单击从软盘安装,再单击浏览,找到*.inf所在文件夹后,确定。接下来点下一步就ok了。安装之后,该驱动将出现在设备管理其中。

调试手法:
dbgprint(),
systemdump,
assert(),
windbg跟踪,可以设置硬断点(插入dbgbreakpoint()函数)以及软断点(在运行到硬断点后,在windbg程序中打开源文件,设置软断点)


详细资料,查阅D_P2003-050_MBCUSB2_TRN_WDMDEVELOP1_CN.ppt, D_P2003-050_MBCUSB2_TRN_WDMDEVELOP2_CN.ppt,机械工业出版社,《windows2000设备驱动程序设计指南》附录A驱动程序调试环境,附录B故障检验码



6.经验、教训总结


6.1.仔细check你的代码
驱动程序运行在kernelmodel下,与应用程序截然不同,你的代码如果出现任何问题,那么你看到的将是蓝色的系统崩溃屏幕,或者系统直接重新启动,

6.2.调试机的必要性
由于代码不可避免的会存在错误,所以,拥有调试机是必要的,否则你的大部分时间会浪费在等待计算机shutdown和reset上,工作的进展会如同蜗牛在爬行。

请注意你的dbug信息,尤其是dbgbreakpoint,如果你的机器不是处于调试模式下,断点将会挂起你的系统,黑屏,不能再进行任何操作,也看不到任何显示。

6.3.谨慎和认真
小心的处理每一个irp,以及你的任何资源,最好有一个可以确定它们被正确无误的处理和使用的手段,比如增加标志性的调试信息,使用计数等。否则你将花费很多很多的的时间去发现这些细微而致命的错误。
 
Windows驱动开发之第一个驱动程序 一个简单的驱动程序 阅读详情

相关推荐

SYS驱动文件安装加载启动工具源码 支持文件拖放 Driver Loading Tool

资源介绍:。源码里面有个GetDeviceName(获取设备名称)的子程序。它其实就是读入驱动文件后 在文件中搜索特征 然后再进行取文本  这样做是为了做个通用的加载 通讯工具 。因为别的加载工具里都是安装 启动 停止 卸载 则少了通讯获取到设备名称就能建立设备连接 通过调用DeviceIoControl和驱动进行通讯。但在后来发现构建通讯结构没有那么简单 加上时间的关系 所以没加这功能..资源作者:。guazi。资源界面:。资源下载:。

1.驱动SYS开发总结

1.驱动简介 1.1.驱动是什么计算机的外部设备需要和计算机进行数据交换,生产外部设备的厂家如何使计算机和自己的设备交换数据呢,就是通过驱动程序,从设备中读入到计算机中,早期的Win3.1,Win9x设备驱动是vxd,Win NT是kdm, Win2k 统一发展成wdm模式。 1.2.sys文件 sys文件是驱动程序的可执行代码,其扩展名为.sys,驱动程序安装后保存在windows/system

grp_rainy的专栏 2906

windows驱动开发sys文件+vc++编写exe调用驱动中的功能

windows驱动开发sys文件+vc++编写exe调用驱动中的功能 两个工程:一个sys驱动工程,一个exe工程 c语言难,vc++更难,c语言驱动开发更是难上加难。一套完整的源代码奉上

驱动SYS开发总结

            1.驱动简介             1.1.驱动是什么            计算机的外部设备需要和计算机进行数据交换,生产外部设备的厂家如何使计算机和自己的设备交换数据呢,就是通过驱动程序,从设备中读入到计算机中,早期的Win3.1,Win9x设备驱动是vxd,Win             NT是kdm, Win2k 统一发展成wdm模式。          

Mobidogs Blog 5073

多核系统核间通信(IPC)设计:从硬件机制到软件实现

在多核处理器与嵌入式系统设计中,核间通信(IPC)是实现计算资源协同工作的核心技术。其原理基于共享内存、硬件邮箱与中断等底层硬件机制,通过构建结构化的消息传递通道,实现核间高效、可靠的数据交换。该技术的核心价值在于打破多核间的壁垒,将分散的计算单元整合为有机整体,从而显著提升系统整体性能与响应能力。在工程实践中,IPC广泛应用于智能座舱、边缘AI网关、实时控制系统等场景,用于处理如仪表显示、AI推理、实时控制等复杂任务。本文聚焦于基于共享内存与VRING的消息队列实现,深入剖析缓存一致性、内存屏障等关键问题

weixin_27006759的博客 599

Win10 IPv6 远程桌面连接(小米路由器)

背景 由于家里是移动网,且懒得向运营商要公网IPv4,所以想着用IPv6试一下。 家里的环境是这样的: 宽带用的是移动的,没有公网IPv4,但经过测试发现IPv6是公网的 上网通过光猫拨号,而不是通过路由器 路由器是小米AC2100 光猫更改为桥接模式 路由器必须要通过PPPoE拨号,如果是光猫拨号,那么要找对应的维护人员辅助你把光猫改成桥接模式。通过PPPoE拨号路由器就能够拿到公网的IPv6网段,也就可以给底下的其他服务分配公网IPv6了。而如果是光猫拨号,那么只有路由器可以拿到公网的IP。其他的设

timczm的博客 1万+

为什么 Android 开发人员不再需要 Windows USB 驱动程序?

【优快云 编者按】随着时间的推移,如今Android 开发人员无需再通过USB 驱动程序连接设备了,这具体是怎么做到的呢?原文链接:https://fabiensanglard.net/android_windows_driver/index.html未经允许,禁止转载!作者 | FABIEN SANGLARD 译者| 弯月责编 | 夏萌出品 | 优快云(ID:优快云news...

优快云资讯 1万+

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3901

安信Windows驱动开发外包教程:Windows驱动开发入门

安信Windows驱动开发外包教程:Windows驱动开发入门 一、驱动开发环境搭建 在Download the Windows Driver Kit (WDK)页面中下载最新版本的Visual Studio和WDK进行安装。如果要下载老版本可以到Other WDK downloads下载。 本文演示环境为:Visual Studio 2017版本,WDK for Windows 10 17740。其他版本亦可。 二、Hello Word工程 在Visual Studio中选择...

Anxinenen的博客 539

卷积码和Turbo码

通信原理相关博文目录:目录我们常在移动通信中遇到的卷积码就是一种非分组码,卷积码和信号处理中的卷积运算有关系吗?是不是就是信号处理中的卷积运算,先看看编码器的编码原理再说:下面是一个比较实用的卷积码编码器:它有三个移位寄存器D0,D1,D2和三个模2加法器,以及一个旋转开关组成,编码前,先将各级移位寄存器清零:现在假设输入的信息码元是1101:当输入的第一个码元为1时,三个模2加法器计算的结果都为...

Reborn Lee 2万+

self‑improving‑agent 安装与配置指南(OpenClaw)

长期记忆错误反思用户偏好学习持续进化AI → 反思 → 学习 → 改进。

tiantiantbtb的博客 1342

(转载)Windows文件系统过滤驱动开发教程

0.       作者,楚狂人自述我长期网上为各位项目经理充当“技术实现者”的角色。我感觉Windows文件系统驱动的开发能找到的资料比较少。为了让技术经验不至于遗忘和引起大家交流的兴趣我以我的工作经验撰写本教程。我的理解未必正确,有错误的地方望多多指教。有问题欢迎与我联系。我们也乐于接受各种驱动项目的开发。邮箱为MFC_Tan_Wen@163.com,QQ为16191935。对于这本教程,您可以

峥嵘岁月 1万+

Python全栈入门到实战【基础篇 05】核心基础:Python的2种运行模式(交互式+命令行式)

Python代码运行模式详解:交互式与命令行式对比 摘要: Python提供两种核心运行模式:交互式(REPL)和命令行式(脚本式)。交互式模式适合快速测试语法,即时反馈结果,通过终端输入python启动,特点是无需保存、临时执行,适合验证小段代码逻辑。命令行式模式需将代码保存为.py文件后运行,适合开发完整程序,可重复执行和修改。两种模式各有优势:交互式便于学习调试,命令行式适合实际开发。掌握两种模式的使用场景和切换方法,是Python入门的关键技能,能显著提升学习效率。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4563

sys安装

1、将SYS驱动文件放到系统目录的SYSTEM32目录中。2、按WIN+R组合键,在运行框中输入:regsvr32 sys所在全路径,点击确定即可。 转载于:https://www.cnblogs.com/hshy/p/10614992.html...

weixin_30498921的博客 2994

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红

文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖

九师兄 4412

YOLOv5改进有效涨点目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程60余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv8文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。本专栏持续更新网络上的所有前沿文章。

Snu77的博客 3万+

【转载】天际智联的E-Link32下载器驱动失败安装问题

【转载】 https://www.jianshu.com/p/41b9a2f266f8 原标题: 【使用E-Link32调试IMXRT1060】 (以下是我自己写的) 我电脑使用官方的方法安装驱动时失败了,提示是“INF中的服务安装段落无效”。 网上查找了许多方法,大概有以下几种: 1)修改INF文件,在里面额外添加一些代码; 2)移动系统文件中的某个sys文件和inf文件; 第一个方法,因为我不...

weixin_44939263的博客 1327

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

内核驱动签名sys文件签名指南

本文来自:维瑞-技术中心-内核驱动签名指南 http://www.willrey.com/support/digital_signatures_for_kernel.html sys内核驱动签名指南 Vista Non-PnP Kernel-Mode Boot Driver签名指南 Boot Start Driver 是指在操作系统启动时,就加载的驱动。由于系统刚刚启动,所以不会像加载其他P...

weixin_30687051的博客 1215

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

windows 大容量存储设备驱动异常(代码:39)U盘由于驱动问题无法用的解决方法

通过替换对应文件解决usb接口无法驱动问题

weixin_42616105的博客 1万+

转载:linux驱动层到应用层的重要接口sys文件系统---/sys目录详解

linux驱动层到应用层的重要接口sys文件系统---/sys目录详解 Linux2.6内核中引入了sysfs文件系统。sysfs文件系统整理的设备驱动的相关文件节点,被视为dev文件系统的替代者。同时也拥有类似proc文件系统一样查看系统相关信息的功能。最主要的作用是sysfs把连接在系统上的设备和总线组织成分级的文件,使其从用户空间可以访问或配置。 Sysfs被加载...

weixin_34189116的博客 321

解决virtualbox装ghost xp装驱动时报portcls.sys蓝屏的问题

原因:portcls.sys是声卡驱动文件,驱动与模拟的声卡型号不匹配。 解决办法:进入PE,把C:\sysprep\audio目录删除。进入系统后用驱动精灵装驱动。 转载于:https://www.cnblogs.com/xuxy03/p/6249942.html...

weixin_30336061的博客 1201

DOS下安装U盘驱动

DOS下安装U盘驱动 摘自([url]http://bbs.macd.cn/thread-546331-1-1.html[/url]) 绝大多数情况下我们都在Windows下使用闪盘等USB设备,那么在DOS下我们也能使用这些设备,操作并不复杂。  步骤1 制作一张Windows 98启动盘。把:RAMFD.SYSUSBCD.SYSUsbaspi.sysD...

weixin_34019929的博客 1315

linux驱动到应用层多长时间,转载:linux驱动层到应用层的重要接口sys文件系统---/sys目录详解...

Linux2.6内核中引入了sysfs文件系统。sysfs文件系统整理的设备驱动的相关文件节点,被视为dev文件系统的替代者。同时也拥有类似proc文件系统一样查看系统相关信息的功能。最主要的作用是sysfs把连接在系统上的设备和总线组织成分级的文件,使其从用户空间可以访问或配置。Sysfs被加载在 /sys/目录下,它的子目录包括:(本文以高通sdm630平台为例)1)Block:在系统中发...

weixin_36129381的博客 149

win10蓝屏问题,关于驱动kisSaasUrlRedirectKnl64.sys 的

上周末刚从win7升级到win10;今天出现了两次蓝屏了,都是显示: xxxxxxx 百度知道链接---http://zhidao.baidu.com/question/1641414565703874380.html 您的电脑遇到问题,需要重新启动。 我们只手机某些错误信息,然后你可以重新启动。 如果你想了解更多信息,则可以稍后搜索此错误:KERNEL_AUTO_BOOST_...

weixin_30851409的博客 777
上一篇: 转载:在C程序中显示汉字
下一篇: 转载:文件结构及原理
bbdg
博客等级 码龄21年 6粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值