windows驱动系列-概述

之前一直长期做windows驱动开发,但是一直将这些技术知识点进行整理和总结,最近又开始做一套新的驱动,于是就打算趁这个机会,将一些windows驱动开发的技术知识系统性的整理出来。

目录如下:

windows驱动开发知识-设计目标

windows驱动开发知识-WDM和WDF

windows驱动开发知识-内核组件

windows驱动开发知识-设备栈

windows驱动开发知识-内存概述

windows驱动开发知识-I/O请求

windows驱动开发知识-内核线程

windows驱动开发知识-硬件中断

windows驱动开发知识-软件中断

windows驱动开发知识-寄存器

windows驱动开发知识-DMA

============================================================

windows驱动开发基础知识

windows 驱动开发经历了许多版本,在2000和xp的时候,使用的是DDK开发包;在win 7时候使用的是WinDDK开发包;在win 8之后,微软在Visual Studio2012中正式集成了winddk,但是最终直到Visual Studio 2015开始,才比较完整在IDE中集成了驱动开发工具。

windows内核一般也叫NT内核,从5.0开始,才真正脱离了之前MSDOS的架构,这是有史以来兼容性最好的系统内核设计体系,很多基于NT 5.0设计的驱动程序,仍然可以直接在NT 10.0上运行。

WDM驱动模型贯穿整个NT 5.0~NT10各个版本的驱动设计中,后面新出现的WDF框架是在WDM驱动模型之上进行的封装,大大提高了开发效率和降低了开发难度。以win 11来讲,WDM和WDF框架均可以开发这个平台下的驱动程序,不过,一般建议使用WDF框架,毕竟对于一些常见的驱动程序来说WDF框架非常友好。

和认知不一样的是,WDM和WDM都是面向对象的开发模型,这和内核有关,虽然windows内核几乎都是使用C语言开发的,但内核的设计思想是面向对象的,驱动被认为是内核链接的动态链接库。

驱动程序的后缀名一般是sys或者dll,它们都是PE结构,这一点和应用程序并无区别,在驱动编程中会更加关注本质而非形式-无论QT还是MFC、C或者VB、com组件还是exe,最终都会以汇编二进制的形式去看待,故对于驱动开发来说,了解汇编是必须的。

驱动程序一般是"驱动“硬件为目的,它们架构于ACPI之上,是最靠近系统底层的程序之一,内核本身设计为HAL、微内核、执行体三层,HAL仅仅提供硬件抽象的能力,主要的硬件功能几乎都是由驱动程序以DLL的方式,被内核加载到地址空间中,为执行体层提供I/O服务,这些服务最终以IRP在内核和应用层之间传递,故在应用层,控制硬件是一件看起来很简单的事情,但是实际上是一件很复杂的事情。

例如USB设备插入电脑:

1. 当接口电路接通时,ACPI会收到一个接通信号,这个信号传递到PCI总线,PCI总线又将其传递到USBHub,USBHub检测到这个电源信号,会创建一个物理设备对象,同时ACPI会主动向USB设备供电,保证后续的通讯正常;

2. 这个物理设备对象创建后,USB总线会从默认的USB端点读取描述符,根据描述符的信息,USB总线会根据这些信息生成一个硬件ID,然后USB总线会根据硬件ID来判断系统是否有PID和VID相匹配的驱动程序记录,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum中查看;

3. 如果有,那么将对应的驱动程序加载到内核中,然后USB总线通过PNP管理器调用对应驱动的AddDevice事件;在AddDevice最重要的一步是创建设备栈并初始化I/O派发例程;

4. 当AddDevice例程调用是,[NP管理器也会通知应用层的窗口管理器,应用层编程中,可以注册接收WM_DEVICECHANGE消息,如果注册了这个消息,那么窗口管理器在收到设备插入的事件时,就会通知对应的窗口;

5. windows会话管理器本身也会受到这个事件通知,然后这个通知就在系统托盘处显示"USB插入信息",这个过程中我们甚至可以看到系统是如何匹配这些设备的驱动过程;

但是在应用层,我们只需要注册WM_DEVICECHANGE即可收到通知,并会在设备安装完驱动之后才会收到通知。

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

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

相关文章

第十四章大数据和数据科学4分

14.1 引言 14.1.3 科学理念 1.数据科学 数据科学将数据挖掘、统计分析和机器学习与数据集成整合,结合数据建模能力,去构建预测模型、探索数据内容模式。 数据科学依赖于: 1)丰富的数据源。具有能够展示隐藏在组织或客户行为中不…

jpa分页插件对象Pageable出现了错误异常如何解决?

jpa分页插件对象Pageable出现了错误异常如何解决?! 一般来说,遇到这种的错误异常情况,通常情况 下,都是因为程序员把传递的分页页码数字写错了。 正常情况下,分页页码起始数字应该是0;而不是1…

区块链钱包开发——专业区块链开发

随着区块链技术的发展,钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性,分析当前面临的挑战,并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

揭开ChatGPT面纱(2):OpenAI主类源码概览

文章目录 〇、使用OpenAI的两个步骤一、初始化方法__init__()1.源码2.参数解析 二、提供的接口1.源码2.接口说明主要接口说明 OpenAI版本1.6.1 〇、使用OpenAI的两个步骤 在上一篇博客中,我实现并运行了一个OpenAI的demo,我们可以发现,想要使…

Unity的旋转实现一些方法总结(案例:通过输入,玩家进行旋转移动)

目录 1. Transform.Rotate 方法 使用 2. Transform.rotation 或 Transform.localRotation 属性与四元数 使用方式: 小案例 :目标旋转角度计算:targetRotation(Quaternion类型) 玩家发现敌人位置,玩家…

ubuntu20 中设置桌面背景任务

1. 下载conky 使用 Conky 在 Ubuntu 中显示信息,例如你的阅读计划,可以分几个步骤来完成。Conky 是一款灵活的轻量级系统监视器,能够在桌面上显示各种信息。以下是基本的设置步骤: 安装 Conky 首先,你需要在 Ubuntu…

js面试---闭包、作用域及作用域链、执行上下文

1、什么是闭包 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。 闭包的作用: a、使我们在函数外部能够访问到函数内部的变量。通过使用闭包…

道可云元宇宙每日资讯|济南起步区:加快建设元宇宙政务大厅

道可云元宇宙每日简报(2024年4月23日)讯,今日元宇宙新鲜事有: 济南起步区:加快建设元宇宙政务大厅 济南起步区以“元宇宙”赋能智慧政务,集成政务服务智能办理、数字人智能引导交互服务、沉浸式漫游体验、…

【学习记录】autoware标定相机与激光雷达外参

一、autoware选择 这里踩了好几个坑,首先autoware作为一个无人驾驶知名框架,其内部实际上是有两套标定的东西的,这一点绝大多数博客没有提到。其中最常用的是一个叫标定工具箱的东西,这个ros包已经在1.10往后的版本中被删掉了&am…

hive SQL谓词下推

Sql 优化:谓词下推(PPD 定义 谓词下推的概念其实出现在sql中,在关联查询时(join,left join ,right join),因为涉及两个大表之间的关联(特别是在hive)造成资源消耗会比较大, 因为建议在join之前先将两个表进行过滤(hive…

Android 获取sha1的快速有效的简单方法

第一步 下载apk 点击下载(https://download.csdn.net/download/xiaohui2015/9751428) 第二步 试用Windows键R键打开命令行 输入 adb install把apk用鼠标左键拖动到命令行自动输入路径 回车安装 第三步 打开apk 选择你要查看的apk,一键…

Spring 1、初识Spring

初识Spring 了解Spring家族了解Spring发展史Spring Framework系统架构学习路线 了解Spring家族 官网spring.io Spring形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。 Spring Framework(最基础的东西&#x…

qemu参考

手把手教你搭建ARM64 QEMU环境 - 知乎

SpringCloud Alibaba--nacos配置中心

目录 一.基础介绍 1.1概念 1.2 功能 二.实现 2.1 依赖 2.2 新建配置文件 2.3 克隆 2.4 配置bootstap.yml文件 三.测试 一.基础介绍 1.1概念 在微服务架构中,配置中心就是统一管理各个微服务配置文件的服务。把传统的单体jar包拆分成多个微服务后&#xf…

NameError: name ‘_mysql‘ is not defined 安装mysqlclient报错

安装mysqlclient报错 The error message you’re seeing indicates that the pkg-config utility is not installed on your system, or it is not able to find the necessary configuration for mysqlclient. pkg-config is used to determine the compilation options for …

跨越未知,拥抱挑战——新征程

在浩瀚的IT领域里,每一位开发工程师都如同一位探险家,不断地探索、挑战和成长。作为一名新入职的Java开发工程师,我面临着全新的技术栈和业务领域,这是一次跨越未知的征程,也是一次自我提升的机会。 新入职 初入公司…

Android活动之Intent

Intent Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景, 显示intent 第一个参数Context要求提供…

低代码开发之腾讯云微搭工具

低代码开发之腾讯云微搭工具 微搭简介诞生缘由开发模式如何创建组件模块介绍实例讲解url传参级联联动使用事件其他方法调用数据源方法 callDataSource触发流程 callProcess 数据模型方法V2 微搭简介 微搭(WeDa),全称是腾讯云微搭低代码开发平…

设计模式- 适配器模式(Adapter Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

【Python】深入解析Python中的eval()函数

你是魔鬼中的天使 所以送我心碎的方式 是让我笑到最后一秒为止 才发现自己胸口插了一把刀子 你是魔鬼中的天使 让恨变成太俗气的事 从眼里流下谢谢两个字 尽管叫我疯子 不准叫我傻子 🎵 田馥甄《魔鬼中的天使》 Python的eval()函数是一个强大而…