windows驱动程序开发(普及)

Win10下VS2015(WDK10)驱动开发环境配置 1、     概述 微软在”WDK7600“以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VisualStudio,然后再从微软官网下载集成的WDK开发包、或者离线安装包,但是安装后Visual Studio就集驱动程序开发,编译,安装,部署和调试于一身,使得Windows驱动程序开发会变得更容易。对于Windows 10和Visual Studio2015驱动开发W 阅读详情

1.用户态驱动驱动程序和核心态驱动程序   

下图描绘出了操作系统驱动程序的相关组成部分的概貌:


Windows驱动程序既可以运行在用户态也可以运行在核心模态。

l         用户态的驱动程序运行在非特权处理机模式(nonprivileged processor mode)上,其他一些被保护的子系统代码也运行在该模式上。用户态的驱动程序不能获得系统数据的存取权,除非调用Win32 API或者系统服务。

l         核心态驱动程序作为操作系统的一个组成部分被执行——支持一个或多个受保护的子系统的操作系统底层组件。

用户态和核心态驱动程序有不同的结构,不同的入口点和不同的系统接口。一个设备是需要一个用户态驱动程序还是需要一个核心态驱动程序依赖于该设备的类型和操作系统对它提供的支持。

一些设备驱动程序可以完全地或部分地运行在用户态。用户态驱动程序没有堆栈空间的限制,可以访问Win32 API,并且容易调试。

大多设备驱动程序运行在核心态。核心态驱动程序可以完成某些受保护的操作,并且可以访问用户态驱动程序不能访问的系统结构体(system sturcture)。然而,访问权限的提高当然也要付出相应的代价——调试的艰难,系统随时面临毁坏的危险。当代码运行在有特权的核心态环境中时,操作系统对代码所请求的数据的完整性和有效性的检查将大大减少。

为了方便,应该用高级语言(high-level language)来编写驱动程序,通常,C适合用来编写核心态驱动程序,C或C++则适合用于编写用户态驱动程序。

驱动开发一般分为六步,在下面列出,每一步在DDK中都有相关部分进行阐述。

  • 第一步:理解驱动程序和操作系统基础
  • 第二步:确定特定设备驱动程序的需求
  • 第三步:做一个驱动程序设计方案
  • 第四步:构建、测试和调试驱动程序
  • 第五步:提供一个驱动程序包
  • 第六步:发布驱动程序

2.设备对象和设备栈

2.1介绍设备对象

操作系统用设备对象(device object)表示设备。每一个设备都有一个或多个设备对象与之相关联。设备对象提供了在设备上的所有操作。

核心态驱动程序中,每个设备必须至少创建一个设备对象,下面两种情况除外:

l         与类(class)或端口设备相关的微驱动程序不必创建它自己的设备对象。

l         特定类型子系统的设备驱动程序的设备对象由子系统创建。例如:NDIS小端口驱动。

一些设备对象并不表示物理设备。一个唯软件驱动程序(software-only driver,处理I/O请求,但是不把这些请求传递给硬件)也必须创建表示它的操作的设备对象。

设备常常由多个设备对象所表示,每一个设备对象在驱动程序栈(driver stack)中对应一个驱动程序来管理设备的I/O请求。一个设备的所有设备对象被组织成一个设备栈(device stack)。无论何时,一个操作都在一个设备上被完成,系统把IRP(I/O request packet)数据结构体传递给设备栈中顶部设备的驱动程序。每一个驱动或者处理IRP,或者把它传递给设备栈中下一个设备对象的驱动程序。

设备对象由DEVICE_OBJECT结构体表示,它被对象管理器(Object Manager)所管理。对象管理器提供为设备对象提供与其他系统对象相同的功能。特别地,一个设备对象可以被命名,并且一个被命名的设备对象可以有一个句柄。


    系统为每一个设备对象提供专门的存储空间,被成作设备扩展(device extension),它可以用作特定设备的存储空间。设备扩展同设备对象一起被创建和释放。

下图描述了设备对象和I/O管理器之间的关系:

2.2Windows驱动模型(WDM)设备对象和设备栈

 

2.2.1. WDM设备对象的类型

有三种类型的WDM设备对象:

1)        物理设备对象(PDO)——表示一个总线驱动程序的总线设备。

2)        函数设备对象(FDO)——表示一个函数驱动程序的设备。

3)        过滤器设备对象(filter DO)——表示一个过滤器驱动程序的设备。

这三种设备对象都是DEVICE_OBJECT类型,但是用法不同并且有不同的设备扩展。

 

2.2.2. WDM设备对象的例子

 

2.2.3. WDM设备对象何时被创建

 

2.2.4. WDM设备栈的例子

 

2.3创建一个设备对象

    驱动程序调用IoCreateDevice或IoCreateDeviceSecure来创建它们的设备对象。当驱动程序创建一个设备对象时,要提供下列信息给IoCreateDevice或IoCreateDeviceSecure:

l         设备的设备扩展(device extension)的大小。设备扩展是一块系统分配的存储区域,驱动程序可以使用这块区域作为特定设备的存储空间。

l         一个系统定义的常量,指明设备对象表示的设备类型(DeviceType)。

l         一个或多个ORed,系统定义的常量,它指明了设备的特征。

l         一个被叫做Exclusive的布尔值(Boolean value),它指明了设备对象的Flags中的一位是否应该被设置成DO_EXCLUSIVE——表明驱动服务于一个独立的设备,例如视频,串行,并行或声音设备。WDM驱动必须设置Exclusive为FALSE。

l         一个指向驱动程序的驱动对象(driver object)的指针。一个WDM函数或过滤器驱动程序接收指向它的驱动对象的指针作为它的AddDevice函数的参数。所有的驱动程序在它们的DriverEntry函数中接收到一个只想驱动对象的指针。系统使用这个指针与相应的设备对象关联起来。

l         一个指向以0中止符结尾的Unicode字符串(DeviceName)的指针,该指针是可选的。除了总线驱动程序,WDM驱动程序不提供设备名称。

    如果调用IoCreateDevice或IoCreateDeviceSecure成功,I/O管理器将为设备对象本身和其它所有与设备对象相关的数据结构提供存储空间,包括设备扩展,它初始化的时候为0。

 

2.3.1为WDM函数和过滤器驱动程序创建设备对象

    除了总线驱动程序以外的WDM驱动程序都调用IoCreateDevice来创建它们的设备对象。大多数的WDM驱动程序在它们的AddDevice函数里来创建设备对象。有些驱动程序,例如磁盘驱动程序,从分派函数(dispatch routine)调用IoCreateDevice。

 

    除非是DDK说明文档里特别指定的设备类型,否则,你的驱动程序应该在它的AddDevice函数中创建设备对象。

 

2.3.2为WDM总线驱动程序创建设备对象

    当一个WDM总线驱动程序为响应IRP_MN_QUERY_DEVICE_RELATIONS而列出新设备时,如果类型是BusRelations,它将创建一个物理设备对象(PDO)。

下列规则决定了一个总线驱动程序是调用IoCreateDevice还是调用IoCreateDeviceSecure来创建一个设备对象:

l         如果设备可以在原始模式(raw mode)下使用,那么必须调用IoCreateDeviceSecure。

l         如果设备不能在原是模式下使用,那么总线驱动程序既可以调用IoCreateDevice,也可以调用IoCreateDeviceSecure。当对于总线上的设备的默认系统安全性足够的时候可以调用IoCreateDevice;调用IoCreateDeviceSecure可以指定更严格的安全描述符。

2.3.3为非WDM驱动程序创建设备对象

    非WDM驱动程序通常使用IoCreateDevice来创建无名的设备对象,使用IoCreateDeviceSecure来创建有名的设备对象。

 

 

2.4初始化一个设备对象

          IoCreateDevice将返回一个指向设备对象(DeviceObject)的指针给调用者,这个设备对象包含一个指向设备扩展(device extension)的指针,驱动程序必须为它们的物理的、逻辑的、或虚拟的设备创建各自的区域。

# Windows驱动程序开发入门:从原理到实践 Windows驱动程序(Device Driver)是一种特殊的软件组件,运行在内核模式下,负责管理特定的硬件设备。它们充当应用程序和硬件之间的翻译器,将操作系统的标准化调用转换为特定硬件能够理解的指令。#ifdef DBG。 阅读详情

相关推荐

Windows 8 I2C驱动程序开发实践指南

本文还有配套的精品资源,点击获取 简介:Windows 8中的I2C驱动程序开发至关重要,因为I2C协议广泛用于低速通信设备。KMDF框架简化了内核模式驱动的编写,使开发者能够专注于硬件特定功能。本文深入探讨了KMDF如何为Windows 8提供I2C支持,包括I2C总线驱动和设备驱动的实现,KMDF事件循环的处理,WDF库的API使用,以及驱动的调试、测试、兼容性升级和签...

weixin_28968525的博客 1059

Windows驱动开发详解 第三章(Windows驱动编译环境配置、安装及调试)

由于微软的WDK驱动开发工具包,只提供了C、C++语言的库和头文件,因此最好使用C/C++来编写驱动文件 函数调用约定 函数调用步骤: 将函数的返回地址压入堆栈 将函数的参数压入堆栈(有四种方式) _cdecl:C语言调用约定 _stdcall:标准调用约定 _fastcall:快速调用约定 thiscall:C++类成员函数调用约定 调用函数(即call 函数地址) 函数执行结束退出时对栈进行平衡(同样四种方式,与参数入栈对应) Windows驱动程序,编写需要使用标准调用约定(_stdcall).

冰糖葫芦的夏天的博客 1410

Windows 7系统下开发板USB驱动程序备份指南

J-Link是由SEGGER公司开发的一款广泛使用的JTAG仿真器,它支持多种微控制器和处理器,能够提供高速的调试和编程能力。J-Link通过USB接口连接到计算机,然后连接到目标板进行调试。它支持的微控制器系列广泛,包括但不限于ARM Cortex-M系列、8051、AVR等。J-Link的主要应用场景包括但不限于以下几点:软件开发与调试:在开发阶段,J-Link用于下载和调试应用程序,它可以实现断点、单步执行和实时调试等功能。固件更新。

weixin_42186015的博客 1195

Windows驱动开发(一)

总结来说,WDM是早期的Windows驱动开发模型,需要开发人员直接操作底层硬件资源,而WDF是在WDM之上的高级和抽象的驱动程序开发框架,提供了更简化和自动化的开发方式。注意:在极少数情况下,你需要编写注意到 PnP 或电源事件的软件驱动程序,并且驱动程序需要访问无法通过 KMDF 获取的数据,你必须使用 WDM。WDF提供了更多的自动化和简化功能,减少了驱动程序开发的复杂性和错误,提高了开发效率和稳定性。WDM驱动程序以核心驱动程序、功能驱动程序和过滤器驱动程序为基础,涵盖了广泛的硬件设备类型。

qq_38933606的博客 3553

Windows驱动程序开发实战:利用Windows Driver Foundation

Windows Driver Foundation(WDF)是微软公司为了简化硬件驱动程序的开发、测试和维护过程而设计的一套编程接口和框架。WDF为驱动开发者提供了一套丰富的预构建功能集合,支持驱动程序以更简单、更稳定的方式与Windows操作系统进行交互。在本章中,我们将对WDF做一个基本的介绍,包括其核心组件和设计目标,以及它如何帮助开发者构建更高质量的设备驱动程序。我们还将探讨WDF背后的哲学,以及它如何适应现代硬件和软件的发展。

weixin_42402664的博客 1314

Windows WDM USB驱动程序开发实战

Windows驱动模型(WDM)是一种用于在Windows操作系统中编写设备驱动程序的框架。WDM定义了一组标准的编程接口,确保驱动程序能够以统一的方式与Windows内核通信。它提供了对硬件设备的支持,同时简化了驱动开发过程。Windows驱动程序开发过程中的编译工作由Microsoft Visual Studio环境下的驱动程序编译器CL.EXE完成。编译器是构建驱动程序的必要组件,它负责将高级语言代码转化为可以被系统执行的机器码。

weixin_30632267的博客 875

windows驱动程序开发基础

  1.用户态驱动驱动程序和核心态驱动程序 下图描绘出了操作系统驱动程序的相关组成部分的概貌: Windows驱动程序既可以运行在用户态也可以运行在核心模态。 l 用户态的驱动程序运行在非特权处理机模式(nonprivileged processor mode)上,其他一些被保护的子系统代码也运行在该模式上。用户态的驱动程序不能获得系统数据的存取权,除非调用Win32 API或者系

似水流年 -- 韩欣的博客 1365

告别底噪和发热:TPA3255的PCB布局与散热设计保姆级教程(附嘉立创EDA文件)

本文详细解析TPA3255 Class D音频功放的PCB布局与散热设计,提供从电源系统分层架构到热管理系统的全流程优化方案。通过实战案例展示如何消除底噪、降低发热,并附嘉立创EDA文件,助力工程师快速设计高性能音频功放。

weixin_29208077的博客 379

Windows10驱动安装流程(编译、签名、安装)

Windows10驱动安装

weixin_72946687的博客 9061

Scratch 3.0角色控制避坑指南:为什么你的键盘移动总卡顿?

本文深入剖析了Scratch 3.0中角色移动卡顿的根本原因,指出依赖`当按下`事件积木的局限性。通过对比分析,推荐采用`重复执行`结合`如果<键被按下?>`的循环控制方案,并引入速度变量模拟惯性,从而实现流畅、实时的键盘控制优化,显著提升游戏操作体验。

dd012的博客 1015

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

weixin_42412049的博客 1532

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

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

优快云资讯 1万+

【SECS】初识SECS协议

项目标题的第一位和第二位告诉下面有多少字节表示项目的长度。而项目的长度是指项目标题后面的字节数,这里第一个字节就是项目标题。1个字节可以表示的最大长度是0-255,所以只要项目标题后面的字节数小于等于254,都是0x01。

weixin_48618536的博客 1648

从零开始学习Windows WDF驱动程序开发

从零开始学习Windows WDF驱动程序开发 ▼ 目录: 1. 第一部分 编译安装测试一个简单的WDF驱动程序    1.1 编译安装测试    1.2 Windows驱动开发就是要开发出INF文件和SYS文件    1.3 简单介绍下编译脚本    1.4 Windows应用程序如何访问一个设备 2. 第二部分 了解WDF框架并且开发WDF驱

心之所向,身之所往 2万+

STM32F407+OV2640的DCMI+DMA双缓冲JPEG图像采集系统

在嵌入式视觉系统中,数字摄像头接口(DCMI)是MCU连接CMOS图像传感器的关键硬件通道,其与DMA协同实现零CPU干预的高速数据流采集;而JPEG作为一种基于DCT变换与量化压缩的有损图像格式,依赖传感器端硬件编码引擎才能满足实时性要求。理解DCMI三重同步时序(PCLK/HSYNC/VSYNC)与DMA双缓冲机制的流水线协作原理,是突破带宽瓶颈、避免FIFO溢出和帧丢失的技术基础。该架构广泛应用于智能硬件、工业检测与边缘AI前端等需低功耗、高可靠图像捕获的场景,本文以OV2640与STM32F407为

weixin_42103128的博客 158

【深度学习】脸部修复,CodeFormer,论文,实战

Blind face restoration是一个高度 ill-posed 的问题,通常需要辅助引导来 1) 改善从降级输入到期望输出的映射,或者 2) 补充在输入中丢失的高质量细节。在本文中,我们展示了在一个小的代理空间中学到的离散码本先验可以通过将盲目的面部恢复建模为 a code prediction task来大大减少恢复映射的不确定性和模糊性,同时为生成高质量面部提供丰富的视觉元素。

q742971636的博客 2996

Windows驱动程序开发指南

Windows驱动程序开发指南 项目介绍 本项目【Windows-Driver注意:实际链接替换为真实的项目链接】是基于Microsoft的Windows Driver Kit(WDK)的一个开源驱动程序示例集合,专为希望深入学习和实践Windows驱动程序开发的开发者设计。它涵盖了从基础到进阶的各种场景,帮助您理解和构建适用于Windows操作系统的驱动程序。虽然给定的链接指向了一个假设性的G...

gitblog_00720的博客 676

论文必备 - YOLOv8训练前一键扩充数据集,支持9种扩充方法,支持图像和标签同步扩充

在网络模型训练前,大量的数据集是必备的。而对于一些特殊场景中的特殊目标,大量的数据集往往难以获取,无法满足模型训练的基本需求。本文提供了,脚本可一键运行,。

Limiiiing的博客 769

Windows驱动程序开发 - 初识驱动

Windows驱动程序开发 - 初识驱动什么是驱动程序?[1]. 搭建Windows驱动开发环境[2]. 第一个驱动程序[3]. 双机调试参考总结 什么是驱动程序? 驱动(Driver)可以简单理解为设备的操作程序,通常驱动是要符合操作系统规范的。 情景一:没有操作系统的情况(裸机) 应用通过直接操作接口来发送命令编码,这一过程需要开发人员熟悉数据手册。 设备通过接口接收命令,直接执行 最后把命令封装成函数,形成库 #mermaid-svg-EdSqVzlrrS4aRRx2 .label{font-f

小小的进步 2445

21、时间触发以太网:通信、诊断、故障隔离与参数化详解

本文详细解析了时间触发以太网(TTEthernet)的核心机制,包括团检测算法、诊断服务、故障隔离策略、配置服务以及协议参数化等内容。TTEthernet是一种专为超高可靠性系统设计的网络技术,广泛应用于航空航天、工业自动化和汽车电子等领域。文章还探讨了其未来发展趋势,如技术创新与生态建设,为开发者、企业和研究机构提供了应用与发展的方向。

efc12345678的博客 110

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Windows 11驱动程序开发终极指南:驱动签名与Windows Update部署全流程

想要让你的Windows驱动程序成功部署到用户设备上吗?🚀 驱动签名和Windows Update部署是Windows驱动程序开发中最关键的环节。微软官方的Windows-driver-samples项目为开发者提供了完整的驱动签名解决方案,帮助您轻松通过Windows硬件认证。 作为微软官方提供的Windows驱动程序示例仓库,Windows-driver-samples包含了多种设备的驱动

gitblog_00160的博客 1083

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

基于Windows8与Visual Studio11开发第一个内核驱动程序

Windows 驱动程序的发展演变 我们在学习开发驱动程序时有必要弄清楚Windows设备驱动程序的发展演变过程(为了简便起见,以下简称驱动程序),以便明白我们将要开发什么样的驱动程序。这就象你开发一个应用程序时必须弄清楚它是运行在WINDOWS平台下还是在DOS平台下,否则我们能写出什么样的应用程序就可想而知了。       驱动程序开发者的各项任务之中,有许多是为特定的硬件编写驱动程序。由于W

尹成的技术博客 7256

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

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

Windows驱动程序示例项目教程

Windows Driver Samples 是一个由微软维护的GitHub仓库,提供了多种Windows驱动程序的示例代码,旨在帮助开发者学习和理解如何为Windows操作系统开发各种类型的驱动。这些样本涵盖了从通用Windows驱动到特定技术领域的驱动,如音频、蓝牙、文件系统、GPIO、USB等。通过这些示例,开发者可以快速入门,了解驱动开发的最佳实践。 ## 2. 项目快速启动 要开始使...

gitblog_00468的博客 772

微软开源 windows-drivers-rs, 用 Rust 开发 Windows 驱动程序

微软开源 windows-drivers-rs, 用 Rust 开发 Windows 驱动程序

云满笔记 2964

Windows驱动程序框架

一、驱动程序框架介绍 很多人都用过VC++等图形集成开发环境(IDE)开发过Windows应用程序,当用集成开发环境生成一个工程时,会自动生成一个预先定义好的命令行,这个命令行包含了编译器(compiler)和连接器(linker)某些缺省的配置。很多习惯于图形集成开发环境的人可能对此并不了解。你可能用IDE生成过GUI应用程序,也可能生成过console应用程序,这是两种不同的子系统(...

醉逍遥的博客 1447

Windows Rust 驱动程序示例项目安装和配置指南

Windows Rust 驱动程序示例项目安装和配置指南 1. 项目基础介绍和主要编程语言 项目基础介绍 Windows Rust 驱动程序示例项目是由微软开发的一个开源项目,旨在为开发者提供使用 Rust 语言编写 Windows 驱动程序的示例和最佳实践。该项目是官方 Windows 驱动程序示例的 Rust 移植版本,利用了 windows-drivers-rs 库。 主要编程语言 该项目主...

gitblog_01220的博客 1180
上一篇: debian详细安装
下一篇: 如何编写网络监视器
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值