windows驱动开发-inf文件(一)

2024-05-09 08:36
文章标签 windows 开发 驱动 inf

本文主要是介绍windows驱动开发-inf文件(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

驱动总是和inf文件相关,在WinDDK的时候,许多inf文件都需要开发工程师手动编写,不过,现在已经可以使用inx文件来生成inf文件了,它经常用于驱动的安装和卸载;不过,并不是所有的驱动都需要使用inf文件安装,也不是所有inf文件都是用来安装驱动,在inf系列文章的最后,我们会讨论这些额外的情况,不过在那之前,先看一下inf文件的基础知识吧。

INF文件是组织成命名节的文本文件。某些节具有系统定义的名称,某些节的名称由 INF 文件的编写者确定。每个部分都包含由设备安装组件解释的特定于部分的条目。 某些条目以预定义关键字 (keyword) 开头。 这些条目称为指令。

出于特定目的,某些 INF 文件条目基本上是从一个部分到另一个部分的指针。 例如, INF AddReg 指令标识包含指示 Windows 修改注册表的条目的部分。 这些条目有时包括其他参数 。

其他 INF 文件条目不指向其他部分,但提供 Windows 在安装期间使用的信息,例如文件名、注册表值、硬件配置信息、标志等。 例如, INF DriverVer 指令 提供驱动程序版本信息。

当 Windows 开始安装时,它首先查找INF版本部分([Version])来验证 INF 文件的有效性。 然后,它通过查找 INF 制造商([Manufacturer])部分来启动安装。

inf文件的语法规则

区分大小写: 节名称、条目和指令不区分大小写。 例如, version、 VERSION 和 Version 是 INF 文件中同样有效的节名称规范。

必需和可选内容: 任何特定 INF 文件中的必需和可选部分、条目和指令集取决于要安装的设备/驱动程序或组件的类型。安装任何特定设备及其驱动程序所需的一组节、特定于节的条目和指令也在某种程度上取决于相应的类安装程序。 

节名称: 节名称的规则如下:

  • 可以按任意顺序指定节。 大多数 INF 文件按约定按特定顺序列出节,但 Windows 按名称而不是按 INF 文件中的位置查找节;
  • INF 文件中的每个节都以括在方括号 ([ ]) 的节名称开头。 节名称可以是系统定义的,也可以是 INF 编写器定义的。例如, [Manufacturer] 指定系统命名的 Manufacturer 节的开头,而 [Std.按文 种] 表示特定 INF 编写器定义的 Models 节名称。在 Windows 2000 及更高版本的 Windows 上,节名称的最大长度为 255 个字符;
  • 每个节在新 [section-name] 的开头或文件末尾标记处结束;
  • 如果 INF 文件中的多个节具有相同的名称,系统会将其条目和指令合并到单个节中;
  • 除非它用双引号字符括起来 (“) ,否则 INF 编写器定义的节名称必须是唯一到 INF 无引号的显式可见字符字符串,不包括具有 INF 特定含义的某些字符。 具体而言,由节项或指令引用的无引号节名称不能有前导空格或尾随空格、换行符、返回字符或任何不可见的控制字符,并且不应包含制表符。 此外,它不能包含括号 ([ ]) 字符、单个百分比 (%) 字符、分号 (;) 或任何内部双引号 (“) 字符,并且不能将反斜杠 (\) 作为其最后一个字符;

使用字符串标记: INF 文件中的许多值(包括 INF 编写器定义的节名称)可以表示为 strkey% 形式的%字符串键标记。 在 INF 文件的 INF 字符串 部分中,每个字符串键必须与由一系列显式可见字符组成的字符串值相关联。 如有必要,设置代码会将字符串值转换为 Unicode。

行格式、延续和注释: 格式和注释方面的规则如下

  • 节中的每个条目和指令都以返回或换行符结尾。 因此,用于创建 INF 文件的文本编辑器不得在编辑器确定的任意字符数之后插入回车符或换行符。
  • 反斜杠字符 (\) 可用作条目或指令中的显式行连续符。 但是,路径规范中也使用反斜杠字符。 若要确保路径规范中显示的反斜杠字符不会被错误地解释为行连续符,
  • 注释以分号 (开头 ;) 字符。 分析和解释 INF 文件时,系统会假定以下内容与安装过程无关:同一行中分号后面的任何字符,除非分号出现在 “带引号的字符串” 或 %strkey% 标记中除换;行符或返回字符外不包含任何内容的任何空行;
  • 逗号分隔节条目和指令中提供的值。INF 文件条目或指令可以在值列表中间省略可选值,但逗号必须保留。 INF 文件可以省略尾随逗号。
  • 若要在节条目和指令中提供的值中包含百分比 (%) 字符,请使用另一个百分比字符对百分比字符进行转义。
  • 若要在节条目和指令中提供的值中包含双引号 (“) 字符,请使用另一个双引号字符转义双引号字符。 请注意,字符串必须位于 “带引号的字符串”内。

 INF 大小限制: 在字符串替换和包含终止 NULL 字符之前,INF 文件字段的最大长度(以字符为单位)为 4096。字符串替换后,INF 文件字符串的最大长度(以字符为单位)为 4096,其中包括终止 NULL 字符。

INF文件解析1

下面是官方给出一个inf例子,以显示任何 INF 文件如何由部分组成,每个部分都包含零行或更多行,其中一些是引用其他 INF 编写器定义的部分的条目::

[Version]
Signature   = "$Windows NT$"
Class       = Mouse
ClassGUID   = {4D36E96F-E325-11CE-BFC1-08002BE10318}
Provider    = %Provider% ; defined later in Strings section
DriverVer   = 09/28/1999,5.0.2136.1
CatalogFile = ExampleCatalog.cat
PnpLockdown = 1[DestinationDirs]
DefaultDestDir = 13; ... [ControlFlags] section omitted here[Manufacturer]
%StdMfg% = StdMfg ; (Standard types)
%MSMfg%  = MSMfg  ; Microsoft
; ... other Manufacturer entries omitted here[StdMfg]  ; per-Manufacturer Models section
; Std serial mouse
%*pnp0f0c.DeviceDesc% = Ser_Inst,*PNP0F0C,SERENUM\PNP0F0C,SERIAL_MOUSE
; Std InPort mouse
%*pnp0f0d.DeviceDesc% = Inp_Inst,*PNP0F0D
; ... more StdMfg entries and following MSMfg and xxMfg Models sections omitted here; per-Models DDInstall (Ser_Inst, Inp_Inst, etc.) sections also omitted here[Strings]
; where INF %strkey% tokens are defined as user-visible (and
; possibly as locale-specific) strings.
Provider = "Microsoft"
; ...
StdMfg   = "(Standard mouse types)"
MSMfg    = "Microsoft"
; ...
*pnp0f0c.DeviceDesc = "Standard Serial Mouse"
*pnp0f0d.DeviceDesc = "InPort Adapter Mouse"
; ...

以前的 INF 文件中的几个部分具有系统定义的名称,例如 Version、 DestinationDirs、 Manufacturer 和 Strings。 某些命名节(如 Version、 DestinationDirs 和 Strings) 仅包含简单的条目。 其他引用其他 INF 编写器定义的部分,如制造商(Manufacturer)的 上一个示例所示。

请注意鼠标设备驱动程序安装相关部分的隐含层次结构,从上一示例中的 “制造商 ”部分开始。 下图显示了 INF 文件中某些节的层次结构:

请注意以下有关 INF 文件的隐式层次结构:

  • “制造商”[Manufacturer]部分中的每一个项都引用 INF 文件中其他位置 (StdMfg、MSMfg) 中的每个制造商的型号部分;
  • 每个模型部分([models-section-name])指定一些条目数;在示例中,它们以 xxx 开头,%DeviceDesc% ;
  • 每个这样的 %xxx.DeviceDesc% 令牌引用该制造商产品系列 (Ser_Inst和Inp_Inst) 的一些按型号的 DDInstall 部分,每个条目标识单个设备 (*PNP0F0C 和 *PNP0F0D,因此此处显示的“DeviceDesc”) 或一组设备的兼容型号;
  • 每个此类 DDInstall-typeXxx_Inst 节又可以追加某些系统定义的扩展,并且可以包含引用其他 INF 编写器定义的节的指令。 例如,在上一示例中显示为片段的完整 INF 文件也有Server_Inst。服务 部分[Server]及其Ser_Inst节具有 CopyFiles 指令,该指令引用此 INF 文件其他位置的Server_CopyFiles节;

这篇关于windows驱动开发-inf文件(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972917

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经