首页 / 资讯中心 / 文章详情

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

Windows 驱动实例分析系列:libwdi 驱动分析 - libwdi 篇(四) ★ FEATURED ARTICLE
子文档四令牌生成器tokenizer与 INF/CAT 模板处理tokenizer.c实现了一个轻量级模板引擎是 libwdi 动态生成 INF 和 CAT 文件的核心组件。它不依赖任何外部库仅使用标准 C 字符串操作设计简洁高效。设计理念模板文件如winusb.inf.in中包含形如#TOKEN_NAME#的占位符。tokenizer在运行时扫描模板内容将占位符替换为实际值如设备描述、硬件 ID 等生成最终的文件内容。这种设计将静态模板与动态数据分离使得 INF 和 CAT 文件无需针对每个设备单独编写。核心数据结构typedefstruct_token_entity_t{constchar*match;// 要匹配的令牌名不含前后缀charreplace[1024];// 替换后的字符串}token_entity_t;libwdi.c中定义了一个inf_entities数组包含 16 个令牌实体分别对应 INF 模板中的#DEVICE_DESCRIPTION#、#DEVICE_HARDWARE_ID#、#DEVICE_INTERFACE_GUID#等。tokenize_string函数实现该函数是令牌引擎的核心其算法如下初始化输出缓冲区大小为输入大小 1024。在输入字符串中搜索前缀默认为#。若找到前缀则提取从前缀后到后缀默认为#之间的子串作为令牌名。遍历token_entities数组查找匹配的令牌名。若找到匹配将匹配的replace字符串追加到输出缓冲区。若未找到匹配原样保留#TOKEN#。继续搜索下一个令牌直到输入字符串结束。支持递归替换recursive参数即替换后的内容可能包含新的令牌会再次进行替换直到无更多令牌为止但 libwdi 中通常只执行一轮。性能优化grow_strcpy函数动态扩展输出缓冲区避免固定大小限制。每次扩展的大小为所需大小 1024减少 realloc 调用次数。使用场景INF 生成wdi_prepare_driver通过wdi_tokenize_resource调用tokenize_string处理winusb.inf.in等模板传入inf_entities数组得到完整的 INF 内容然后以 UTF-16 编码写入磁盘。CAT 生成pki.c中的CreateCat函数内部也会使用令牌引擎实际上CAT 模板仅包含文件列表每行一个文件名而CreateCat直接解析模板内容通过strtok获取文件列表并未使用令牌引擎因为 CAT 模板中不需要动态替换除了一些版本信息但 libwdi 采用固定格式。不过wdi_prepare_driver在生成 CAT 文件前也会调用wdi_tokenize_resource处理 CAT 模板以替换#WDF_VERSION#等令牌确保 CAT 中的 WDF 版本与 INF 一致。错误处理tokenize_string返回负数表示错误如-ERROR_BAD_ARGUMENTS0 表示输入为空正数表示输出长度。调用方检查返回值若小于等于 0 则视为失败。优点与局限简单可靠无递归下降解析代码量小约 200 行易于调试。灵活可自定义前缀和后缀默认#。局限性不支持条件替换、循环等高级功能但对于 INF 和 CAT 生成已足够。
阅读完成 · 觉得有帮助?
咨询建站