拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(二) 子文档二wdi-simple —— 命令行极简安装器wdi-simple.c是 libwdi 提供的最简单的驱动安装示例其代码行数不足 200 行但却完整地展示了 libwdi 的核心工作流程。它非常适合开发者快速理解如何在自己的应用程序中集成驱动安装功能。核心流程wdi-simple 的执行流程可概括为四个步骤解析命令行参数使用 GNU getopt 解析用户输入的 VID、PID、驱动类型、INF 名称、目标目录等。准备驱动文件调用wdi_prepare_driver生成 INF 和 CAT 文件并提取所需的驱动二进制。枚举设备调用wdi_create_list获取当前系统中的所有 USB 设备链表。匹配并安装遍历设备链表查找与指定 VID/PID 匹配的设备若找到则调用wdi_install_driver安装驱动若未找到则直接调用wdi_install_driver以“预安装”模式仅复制 INF 到系统目录等待设备插入。命令行参数设计wdi-simple支持以下主要选项-v, --vid设置 VID十六进制-p, --pid设置 PID十六进制-i, --iid设置复合设备的接口号MI-t, --type驱动类型0WinUSB, 1libusb-win32, 2libusbK, 3usbser, 4custom-n, --name设备描述用于 INF 中的设备名称-f, --infINF 文件名-d, --dest提取目录-e, --external使用外部 INF 文件替代内置模板-x, --extract仅提取文件不安装-s, --silent静默模式-c, --cert安装嵌入的证书到受信任发布者存储这些参数几乎覆盖了wdi_options_prepare_driver和wdi_options_install_driver结构体的所有字段使得开发者可以灵活控制安装行为。关键代码片段分析1. 设备匹配与安装for(;(ldev!NULL)(rWDI_SUCCESS);ldevldev-next){if((ldev-viddev.vid)(ldev-piddev.pid)(ldev-midev.mi)(ldev-is_compositedev.is_composite)){dev.hardware_idldev-hardware_id;dev.device_idldev-device_id;matching_device_foundTRUE;rwdi_install_driver(dev,ext_dir,inf_name,oid);}}该循环遍历 libwdi 返回的设备链表通过 VID/PID/MI 三要素匹配目标设备。一旦匹配成功将设备的hardware_id和device_id赋值给dev结构体然后调用wdi_install_driver执行安装。这种设计使得安装器可以自动适配当前插入的特定型号设备。2. 预安装模式当没有匹配的已连接设备时wdi_install_driver仍然会被调用此时dev结构体中仅包含 VID/PID/描述等信息但hardware_id和device_id为空。libwdi 内部会检测到设备未连接转而调用SetupCopyOEMInf将 INF 复制到系统目录并标记设备以便下次插入时自动安装。这实现了“先准备驱动再插入设备”的用户体验。3. 进度反馈wdi-simple支持-b参数显示进度条若指定 HWND 则作为父窗口否则使用控制台窗口句柄。它通过GetConsoleHwnd获取控制台窗口句柄并将其传递给wdi_options_install_driver的hWnd字段从而触发 libwdi 内部的进度对话框模式。这展示了 libwdi 如何在 GUI 和无头环境下切换安装界面。使用场景wdi-simple 非常适合以下场景驱动程序开发者的快速测试在开发过程中快速为测试设备安装驱动。自动化部署通过脚本调用实现无人值守的驱动安装。学习 libwdi API 的入门参考代码简洁注释清晰是理解 libwdi 工作原理的最佳起点。
返回列表