新闻详情

新闻详情

首页 / 资讯中心 / 详情

Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(三)

发布时间:2026/10/1 16:23:23来源:尧图网络
Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(三)
子文档三Zadig 核心架构与主程序分析zadig.c是 Zadig 工具的主程序它是一个完整的 Windows GUI 应用程序使用原生 Win32 API 构建不依赖 MFC 或 .NET Framework。Zadig 的主要功能是提供一个用户友好的界面让用户选择 USB 设备并安装相应的驱动程序。其代码量约 2000 行是 libwdi 最复杂也最完整的应用示例。整体架构Zadig 采用经典的“事件驱动 模态对话框”模式。其核心是一个主对话框MAIN_DIALOG所有控件下拉列表、按钮、编辑框、日志窗口等都放置在此对话框上。主窗口过程main_callback处理所有 Windows 消息包括控件通知、设备变化事件、自定义消息等。关键数据结构与全局状态Zadig 使用大量全局变量管理应用程序状态这些变量在zadig.c顶部声明包括struct wdi_device_info *device, *list当前选中的设备和完整设备链表。struct wdi_options_*多个 options 结构体用于配置 libwdi 的行为。int current_device_index下拉列表中的当前选中项索引。BOOL advanced_mode是否显示高级选项日志窗口、文件夹浏览等。BOOL create_device是否处于“手动创建设备”模式即不通过枚举而是手动输入 VID/PID。enum wcid_state has_wcid当前设备是否支持 WCID。UINT64 target_driver_version目标驱动版本用于比较并提示升级/降级。全局状态变量使得 UI 状态与底层逻辑紧密关联但也增加了代码的耦合度。Zadig 通过精心组织的消息处理来维护状态一致性。主窗口初始化流程main_callback处理WM_INITDIALOG时执行以下关键步骤调用init_dialog该函数完成所有控件的创建、字体设置、图标加载、工具提示创建等。调用parse_ini读取zadig.ini配置文件应用用户自定义的默认选项如默认驱动类型、日志级别、高级模式等。调用set_loglevel根据配置设置日志级别。调用set_default_driver检测系统支持的驱动类型选择合适的默认驱动。调用toggle_advanced根据配置显示或隐藏高级控件。发送UM_REFRESH_LIST消息触发设备列表的初始枚举和显示。设备枚举与显示设备列表的刷新由UM_REFRESH_LIST消息驱动。其处理逻辑为调用wdi_create_list获取设备链表。调用display_devices将设备描述填充到下拉列表IDC_DEVICELIST中并将设备结构体指针作为itemdata存储便于后续快速检索。若设备列表为空则禁用“编辑描述”和“安装”按钮。自动选择当前设备基于current_device_hardware_id或默认选择第一个。设备选择与信息显示当用户从下拉列表中选择设备时CBN_SELCHANGE事件触发以下操作通过ComboBox_GetItemData获取对应的wdi_device_info指针。更新device全局变量。读取VID、PID、MI、驱动名称、驱动版本等信息并显示在对应的静态文本和编辑框中。调用wdi_get_vendor_name解析 VID 对应的厂商名称若无法解析则显示“提交厂商”按钮IDC_VID_REPORT引导用户向 USB ID 仓库提交数据。检测设备的compatible_id是否以USB\MS_COMP_开头判断是否为 WCID 设备并相应地显示 WCID 状态图标。根据当前设备的驱动类型和版本计算“安装”、“替换”、“升级”、“降级”、“重装”等按钮动作并更新 UI 提示。安装流程当用户点击“安装”按钮IDC_INSTALL时主程序调用install_driver函数其流程为若处于“手动创建设备”模式从编辑框中读取描述、VID、PID、MI构造一个临时的wdi_device_info对象。调用wdi_prepare_driver准备驱动文件。若成功调用wdi_install_driver执行安装。根据返回值显示成功/失败消息框并刷新设备列表PostMessage(WM_DEVICECHANGE)以反映驱动状态的变化。安装过程中installation_running全局变量被设为TRUE禁止用户在安装过程中进行其他操作如切换设备、修改选项避免干扰。设备热插拔处理Zadig 通过处理WM_DEVICECHANGE消息来响应 USB 设备的插入和拔出。由于该消息可能被频繁触发Zadig 采用“延迟通知”策略首次收到WM_DEVICECHANGE时创建一个后台线程该线程等待NOTIFICATION_DELAY1000ms后发送自定义消息UM_DEVICE_EVENT回到主线程。在主线程收到UM_DEVICE_EVENT后刷新设备列表。若当前处于“手动创建”模式则弹出提示询问用户是否放弃修改并刷新。这种设计避免了在设备快速插拔时多次刷新 UI同时也保证了当用户插入一个新设备后界面能及时更新。高级功能菜单Zadig 提供了丰富的菜单选项包括设备创建新设备手动输入 VID/PID、打开预设配置文件.cfg。选项高级模式、列出所有设备、忽略集线器、生成 CAT、签名 CAT、日志级别选择。帮助在线帮助、检查更新、关于。这些菜单项通过WM_COMMAND处理调用相应的功能函数如toggle_advanced、toggle_driverless等。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

2026年GPU AI训练与推理优化改造实战:从驱动兼容到多卡异构的完整指南 2026/10/1 22:58:49

2026年GPU AI训练与推理优化改造实战:从驱动兼容到多卡异构的完整指南

1. 从一张显卡的两种身份说起:为什么2026年的GPU优化不再是单点问题如果你最近打开过任务管理器,看到一台笔记本上同时挂着 Intel UHD Graphics 和 NVIDIA GeForce RTX 4060 Laptop GPU,然后心里冒出一个问题——“我到底该用哪个来跑模型&am…

阅读更多 →
Parse Server 8 迁移指南:邮件验证 Token 化改造与数据库索引自动创建 2026/10/1 22:58:49

Parse Server 8 迁移指南:邮件验证 Token 化改造与数据库索引自动创建

后端认证鉴权 【免费下载链接】parse-server Parse Server for Node.js / Express 项目地址: https://gitcode.com/gh_mirrors/pa/parse-server 点击查看 免费下载 本篇技术指南聚焦 Parse Server 8(当前仓库即 Parse Server 源码)中两项需要…

阅读更多 →
Delphi衰落的13个商业现实原因:从技术选型到CTO决策逻辑 2026/10/1 22:58:34

Delphi衰落的13个商业现实原因:从技术选型到CTO决策逻辑

1. 这不是技术淘汰,而是决策逻辑的集体转向Delphi曾经是Windows桌面开发的黄金标准——用Object Pascal写业务逻辑,拖拽组件生成界面,编译成原生EXE,启动快、资源省、部署简单。我2008年刚入行时,手头维护的财务系统、…

阅读更多 →
Jupyter Lab远程访问与密码登录安全配置指南 2026/10/1 22:58:33

Jupyter Lab远程访问与密码登录安全配置指南

1. 项目概述:为什么非得让 Jupyter Lab 支持密码登录和远程访问?Jupyter Lab 不是玩具,它是数据科学、机器学习、教学实验和工程验证的日常生产环境。我见过太多人——刚入门的研究生、转行的工程师、甚至带团队的技术负责人——在本地笔记本…

阅读更多 →
RabbitMQ交换机持久化详解:四大类型与配置实战 2026/10/1 22:58:32

RabbitMQ交换机持久化详解:四大类型与配置实战

做 RabbitMQ 也快十年了,我见过不少因为交换机持久化配置不规范导致的事故。最典型的一次是凌晨发版后,RabbitMQ 节点因为内存紧张被自动重启,结果业务方发现所有消息都发不出去。查来查去,问题不是队列丢了,而是交换机…

阅读更多 →
谷歌浏览器扩展打包与导入全指南:从MV2到MV3的避坑实践 2026/10/1 22:58:32

谷歌浏览器扩展打包与导入全指南:从MV2到MV3的避坑实践

只要你和谷歌浏览器扩展程序打过交道,多少都遇到过这样的场景:内网环境里没法直接访问应用商店,同事发来一个.crx文件让你装,或者自己做了一个小插件想在本地验证一下,却卡在“打包扩展程序”和“导入扩展程序”这两个…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉