Windows_WDM_驱动开发
### Windows WDM 驱动开发相关知识点 #### 一、概述 Windows WDM (Windows Driver Model) 驱动程序是一种广泛应用于Windows操作系统的设备驱动模型,它为硬件设备提供了一个统一的接口,使软件能够更好地管理和控制硬件资源。WDM支持即插即用(PnP)和电源管理功能,并且提供了丰富的API来简化驱动程序的开发。 #### 二、WDM驱动程序的运行 ##### 2.1 WDM驱动程序的基本调用流程 **2.1.1 驱动程序何时从何处开始执行?** - **2.1.1.1 第一次安装好驱动程序:** - 当一个WDM驱动首次被安装到系统中时,它的启动由Windows PnP(Plug and Play)管理器触发。 - PnP管理器负责加载所需的驱动程序和服务,并将其注册到系统中。 - **2.1.1.2 驱动程序正常运行:** - 在正常运行过程中,驱动程序通过接收IRP(I/O Request Packet)来进行数据处理。 - 每个IRP都包含一个主要功能代码(Major Function Code)和可能的次要功能代码(Minor Function Code)。 **2.1.2 DriverEntry()大约做些什么?** - `DriverEntry()` 是WDM驱动程序的入口点,其主要职责包括: - 初始化驱动程序对象。 - 注册驱动程序的服务例程。 - 设置驱动程序的能力标志等。 - `DriverEntry()` 必须返回`STATUS_SUCCESS`,表明初始化成功。 **2.1.2.1 IRP主功能码(MajorFunctionCode)** - IRP的主要功能码指定了请求的类型,例如读取、写入或查询信息等。 - 常见的主要功能码包括但不限于: - `IRP_MJ_CREATE`:创建文件或设备对象。 - `IRP_MJ_CLOSE`:关闭文件或设备对象。 - `IRP_MJ_READ`:读取数据。 - `IRP_MJ_WRITE`:写入数据。 - `IRP_MJ_DEVICE_CONTROL`:发送控制代码。 **2.1.2.2 IRP_MJ_PNP次功能码(MinorFunctionCode)** - PnP操作通常涉及以下次要功能码: - `IRP_MN_START_DEVICE`:启动设备。 - `IRP_MN_STOP_DEVICE`:停止设备。 - `IRP_MN_QUERY_REMOVE_DEVICE`:查询是否可以移除设备。 - `IRP_MN_QUERY_STOP_DEVICE`:查询是否可以停止设备。 - `IRP_MN_QUERY_REMOVE_DEVICE_EX`:扩展移除查询。 **2.1.2.3 IRP_MJ_POWER次功能码(MinorFunctionCode)** - 电源管理操作涉及: - `IRP_MN_SET_POWER`:设置设备的电源状态。 - `IRP_MN_QUERY_POWER`:查询设备的当前电源状态。 - `IRP_MN_POWER_SEQUENCE`:执行电源序列。 **2.1.3 驱动程序与应用程序相关的功能码如何调用?** - **2.1.3.1 DriverEntry()中您必须要注册回调函数** - 为了响应来自用户模式的应用程序的请求,必须在`DriverEntry()`中注册回调函数。 - 这些回调函数通常用于处理文件对象的创建、关闭以及设备控制等操作。 - **2.1.3.2 在您的应用程序中正确调用CreateFile()** - 应用程序通过调用`CreateFile()`来创建一个设备文件句柄。 - 此句柄用于后续的所有I/O操作。 - **2.1.3.3 应用层调用驱动的消息参照** - 应用程序可以通过`DeviceIoControl()`函数向驱动程序发送特定的控制命令。 - 这些控制命令通常用于配置设备或获取设备的状态信息。 - **2.1.3.4 IoControl调用** - `DeviceIoControl()`函数是最常用的方法之一,用于与设备驱动进行交互。 - 它允许应用程序向驱动程序发送特定的控制代码,并接收相应的结果。 #### 三、开始编写WDM驱动程序 **3.1 得到一个Demo工程** - 要开始编写WDM驱动程序,通常建议从一个现成的示例项目开始,这有助于快速理解WDM编程的基础。 - 示例项目通常包含了一个基本的驱动框架,以及如何处理常见事件的示例代码。 **3.2 在VC下配置DDK的开发环境** - **3.2.1 我的目录** - 确保所有的开发文件都按照推荐的结构组织起来,以便于管理和查找。 - **3.2.1.1 我们应该在系统环境变量里设置** - 设置环境变量,如`PATH`和`INCLUDE`,以便编译器能找到必要的库文件和头文件。 - **3.2.2 安装VC6** - 安装Visual C++ 6.0或更高版本,因为它是开发WDM驱动程序的常用工具之一。 - **3.2.3 打开wdm1\sys\Wdm1.dsp工作区文件** - 使用Visual C++ 打开示例项目的解决方案文件。 - **3.2.4 修改H:\driverDev\MakeDrvr.bat文件** - 调整构建脚本以适应个人的开发环境。 - **3.2.5 设置VC的环境** - 配置编译器选项,确保编译过程顺利进行。 - 处理编译时可能出现的错误,如类型未定义等问题。 **3.2.5.1 前面的内容编译时出了错误(配置'MakeDrvr')** - 如果在编译过程中遇到错误,首先要仔细阅读错误信息。 - 通常需要调整项目的编译选项或者添加缺失的头文件路径等。 **3.2.5.1.1 在project->settings中设置成如下:** - 调整项目设置以匹配开发环境的需求,比如添加必要的库文件路径等。 **3.2.5.1.2 还可以在Tools->Options-〉directories中选择 “Executablefiles” 并添加MakeDrvr.bat的目录即可** - 添加编译器需要的可执行文件路径,以便于构建脚本正确运行。 **3.2.5.1.3 再按F7编译有编译提示** - 编译过程中可能会出现各种提示信息,需要根据这些提示信息来解决问题。 **3.2.5.1.4 搞清楚MakeDrvr.BAT文件的功能** - 理解构建脚本的具体作用,有助于更有效地配置和管理构建过程。 **3.2.5.2 前面的内容编译时出了错误,让我们看看是什么原因** - 编译错误通常是由于配置不正确或缺少必要的依赖导致的,仔细排查可以找到问题所在。 #### 四、安装DebugPrintMonitor驱动程序 - **4.1 用控制面板安装DebugPrintMonitor** - 通过控制面板安装DebugPrintMonitor,这是一个用于调试目的的示例驱动。 - **4.2 检查DebugPrintdriver的安装情况** - 确认驱动程序已经正确安装,并检查相关的日志文件来验证其工作状态。 #### 五、安装wdm1驱动程序 - **5.1 INF文件** - INF文件是安装WDM驱动的关键组成部分,它包含了安装过程所需的所有信息。 - **5.1 全新安装驱动** - 完成WDM1.SYS驱动的全新安装,确保所有步骤都按照文档指导进行。 - **5.2 测试DebugPrintMonitor** - 对安装好的DebugPrintMonitor驱动进行测试,验证其功能是否正常。 #### 六、执行应用程序 - **6.1 打开Wdm1Test.dsp** - 使用Visual C++ 打开测试应用程序的解决方案文件。 - **6.2 编译Wdm1Test工程** - 编译测试应用程序,确保没有编译错误。 - **6.3 修改Wdm1Test.CPP文件的setupapi.h的路径** - 更新头文件路径以确保正确的包含。 - **6.3 重新指定Wdm1Test工程的setupapi.lib的路径** - 更改库文件路径以确保链接正确。 - **6.4 类型DWORD_PTR和ULONG_PTR没定义的错误** - 解决类型未定义的问题,通常需要更新编译器的预处理器指令。 - **6.4 调试WdmTest工程** - 使用调试工具来逐步执行测试应用程序,检查其与驱动程序之间的交互。 通过上述步骤,开发者可以逐步理解和掌握Windows WDM驱动程序的开发流程和技术要点。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ifbtdg iwbtgr
- SIGLENT鼎阳示波器1202f手册(PDF文档)
- Nging是一个网站服务程序,可以管理和配置 Caddy 和 Nginx 站点,并附带了实用的周边工具
- B站课程三小时带你玩转JQuery学习笔记
- 基于springboot+vue宠物领养系统设计与实现
- 使用树莓派3做的一套农业监控系统,可以监控植物的温度、湿度、光照强度、重量、录像,全方面记录种植过程中的情况
- springboot课程设计
- 10388749027736794,程序源码.zip
- 表格批量打印,自己ALT+F11设置想要打印的工作表名称和页码
- 基于C++语言NovAtel实现GPS和BDS双频RTK解算项目源码(高分课设)