提示:本篇文章旨在记录个人学习笔记,如有错误欢迎各位大佬指出。未经许可,不可擅自转载!
文章目录
概要
INF文件的安装信息是驱动程序包中的文本文件,其中包含设备安装组件用于在设备上安装驱动程序包的所有信息。 Windows 使用 INF 文件为设备安装驱动程序。
整体架构流程
官方话说完了,开始进入正题吧
学过Windows驱动的都知道,驱动文件一般都包括inf、cat和sys文件。这里简单解释一下这几个文件的作用:
inf–驱动安装信息文件,操作系统会根据inf文件中的信息找到对应的设备安装驱动。
cat–驱动签名证书文件,可靠的证书一般都会有微软的签名,像平时开发时都是用的测试签名。
sys–系统驱动文件,二进制文件,可以理解为应用程序的exe文件。
INF文件的注释为分号(“;”),引用字符用双百分号(“%str%”)。
1. Version Section
按照约定, “version” 部分首先显示在 INF 文件中。 每个 INF 文件都必须有此节。
参考格式如下:
[Version]
Signature="$WINDOWS NT$"
Class=System ; TODO: specify appropriate Class
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318} ; TODO: specify appropriate ClassGuid
Provider=%ManufacturerName%
CatalogFile=test1.cat
DriverVer = 09/15/2023,17.24.46.989
PnpLockdown=1
Signature表示适用的系统版本,目前大多都为"
C
H
I
C
A
G
O
CHICAGO
CHICAGO"和"
W
I
N
D
O
W
S
N
T
WINDOWS NT
WINDOWSNT"两个版本;Class表示该驱动是哪一类设备比如USB、System、Printer等,每个class都有唯一的一个标识符对应,即classguid;Provider表示供应商名字;CatalogFile表示安装的证书文件名(包含后缀);DriverVer指定驱动的日期及版本;PnpLockdown = 1表示其他应用或程序修改该文件无效。
class和classguid是一一对应的,可以在devguid.h文件中找到这些guid。
常用的class及其guid:
36fc9e60-c465-11cf-8056-444553540000 //USB
88bae032-5a81-49f0-bc3d-a4ff138216d6 //USBDevice
4d36e97e-e325-11ce-bfc1-08002be10318 //UNKNOWN
4d36e97d-e325-11ce-bfc1-08002be10318 //SYSTEM
e0cbf06c-cd8b-4647-bb8a-263b43f0f974 //BUETOOTH
745a17a0-74d3-11d0-b6fe-00a0c90f57da //HIDCASS
4d36e968-e325-11ce-bfc1-08002be10318 //DISPAY
4d36e96e-e325-11ce-bfc1-08002be10318 //MONITOR
4d36e96f-e325-11ce-bfc1-08002be10318 //MOUSE
4d36e96b-e325-11ce-bfc1-08002be10318 //KEYBOARD
6bdd1fc1-810f-11d0-bec7-08002be2092f //1394
66f250d6-7801-4a64-b139-eea80a450b24 //1394DEBUG
7ebefbc0-3200-11d2-b4c2-00a0c9697d07 //61883
4d36e964-e325-11ce-bfc1-08002be10318 //ADAPTER
xd45b1c1-8c8f-a11d-19f7-70000f805f530 //APMSUPPORT
c06ff265-ae09-48f0-812c-16753d7cba83 //AVC
72631e54-78a4-11d0-bcf7-00aa00b7b32a //BATTERY
53d29ef7-377c-4d14-864b-eb3a85769359 //BIOMETRIC
ca3e7ab9-b4c3-4ae6-8251-579ef933890f //CAMERA
4d36e965-e325-11ce-bfc1-08002be10318 //CDROM
f01a9d53-3ff6-48d2-9f97-c8a7004be10c //COMPUTEACCEERATOR
4d36e966-e325-11ce-bfc1-08002be10318 //COMPUTER
6bdd1fc2-810f-11d0-bec7-08002be2092f //DECODER
4d36e967-e325-11ce-bfc1-08002be10318 //DISKDRIVE
48721b56-6795-11d2-b1a8-0080c72e74a2 //DOT4
49ce6ac8-6f86-11d2-b1e5-0080c72e74a2 //DOT4PRINT
9da2b80f-f89f-4a49-a5c2-511b085b9e8a //EHSTORAGESIO
c459df55-db08-11d1-b009-00a0c9081ff6 //ENUM1394
e2f84ce7-8efa-411c-aa69-97454ca4cb57 //EXTENSION
4d36e969-e325-11ce-bfc1-08002be10318 //FDC
f2e7dd72-6468-4e36-b6f1-6488f42c1b52 //FIRMWARE
4d36e980-e325-11ce-bfc1-08002be10318 //FOPPYDISK
ff494df1-c4ed-4fac-9b3f-3786f6e91e7e //GENERIC
6bdd1fc3-810f-11d0-bec7-08002be2092f //GPS
4d36e96a-e325-11ce-bfc1-08002be10318 //HDC
d612553d-06b1-49ca-8938-e39ef80eb16f //HOOGRAPHIC
6bdd1fc6-810f-11d0-bec7-08002be2092f //IMAGE
30ef7132-d858-4a0c-ac24-b9028a5cca3f //INFINIBAND
6bdd1fc5-810f-11d0-bec7-08002be2092f //INFRARED
8ecc055d-047f-11d1-a537-0000f8753ed1 //EGACYDRIVER
4d36e96c-e325-11ce-bfc1-08002be10318 //MEDIA
ce5939ae-ebde-11d0-b181-0000f8753ec4 //MEDIUM_CHANGER
5099944a-f6b9-4057-a056-8c550228544c //MEMORY
4d36e96d-e325-11ce-bfc1-08002be10318 //MODEM
4d36e970-e325-11ce-bfc1-08002be10318 //MTD
4d36e971-e325-11ce-bfc1-08002be10318 //MUTIFUNCTION
50906cb8-ba12-11d1-bf5d-0000f805f530 //MUTIPORTSERIA
4d36e972-e325-11ce-bfc1-08002be10318 //NET
4d36e973-e325-11ce-bfc1-08002be10318 //NETCIENT
87ef9ad1-8f70-49ee-b215-ab1fcadcbe3c //NETDRIVER
4d36e974-e325-11ce-bfc1-08002be10318 //NETSERVICE
4d36e975-e325-11ce-bfc1-08002be10318 //NETTRANS
78912bc1-cb8e-4b28-a329-f322ebadbe0f //NETUIO
4d36e976-e325-11ce-bfc1-08002be10318 //NODRIVER
4d36e977-e325-11ce-bfc1-08002be10318 //PCMCIA
4658ee7e-f050-11d1-b6bd-00c04fa372a7 //PNPPRINTERS
4d36e978-e325-11ce-bfc1-08002be10318 //PORTS
242681d1-eed3-41d2-a1ef-1468fc843106 //PRIMITIVE
4d36e979-e325-11ce-bfc1-08002be10318 //PRINTER
4d36e97a-e325-11ce-bfc1-08002be10318 //PRINTERUPGRADE
1ed2bbf9-11f0-4084-b21f-ad83a8e6dcdc //PRINTQUEUE
50127dc3-0f36-415e-a6cc-4cb3be910B65 //PROCESSOR
d48179be-ec20-11d1-b6b8-00c04fa372a7 //SBP2
53966cb1-4d46-4166-bf23-c522403cd495 //SCMDISK
53ccb149-e543-4c84-b6e0-bce4f6b7e806 //SCMVOUME
4d36e97b-e325-11ce-bfc1-08002be10318 //SCSIADAPTER
268c95a1-edfe-11d3-95c3-0010dc4050a5 //SECURITYACCEERATOR
5175d334-c371-4806-b3ba-71fd53c9258d //SENSOR
997b5d8d-c442-4f2e-baf3-9c8e671e9e21 //SIDESHOW
50dd5230-ba8a-11d1-bf5d-0000f805f530 //SMARTCARDREADER
53487c23-680f-4585-acc3-1f10d6777e82 //SMRDISK
53b3cf03-8f5a-4788-91b6-d19ed9fcccbf //SMRVOUME
5c4c3332-344d-483c-8739-259e934c9cc8 //SOFTWARECOMPONENT
4d36e97c-e325-11ce-bfc1-08002be10318 //SOUND
6d807884-7d21-11cf-801c-08002be10318 //TAPEDRIVE
e6f1aa1c-7f3b-4473-b2e8-c97d8ac71d53 //UCM
71a27cdd-812a-11d0-bec7-08002be2092f //VOUME
533c5b84-ec70-11d2-9505-00c04f79deaf //VOUMESNAPSHOT
25dbce51-6c8f-4a72-8a6d-b54c2b4fc835 //WCEUSBS
eec5ad98-8080-425f-922a-dabf3de3f69a //WPD
2. DestinationDirs Section
在DestinationDirs节中,定义了复制、删除或重命名节文件的目标路径,可以包含以下内容:
file-list-section:指定需要操作的文件列表及其对应的操作(例如CopyFiles、RenFiles或DelFiles)。
DefaultDestDir:为没有明确在DestinationDirs节中命名的CopyFiles、RenFiles或DelFiles节指定默认目标文件夹。
语法如下:
[DestinationDirs]
file-list-section = ldid, subdir
DefaultDestDir = ldid, subdir
其中,ldid是指定的操作标识符,subdir是指定的子目录。在DefaultDestDir命令中,ldid和subdir都是可选的。如果没有指定subdir,则默认目标文件夹将是在节文件中定义的位置。
例如,假设我们有一个名为[DestinationDirs]的节文件,它包含以下内容:
[DestinationDirs]
CopyFiles = \Windows, Windows\System32
RenFiles = \Windows, Windows\System32
这意味着复制和重命名操作的目标路径都被定义为\Windows\System32。因此,当执行复制或重命名操作时,目标文件夹将是\Windows\System32。
3. SourceDisksNames Section
在SourceDisksNames节中,定义了源盘的名称和路径,可以包含以下内容:
disk-description:指定源盘的描述信息。
disk-id:指定源盘的磁盘标识符。
disk-label:指定源盘的卷标或标签。
disk-signature:指定源盘的签名标识符。
volume-info:指定源盘的卷信息。
例如,假设我们有一个名为[SourceDisksNames]的节文件,它包含以下内容:
[SourceDisksNames]
1 = "My Disk 1", "D:, \\windows\system32\drivers\mydisk.sys"
这意味着源盘1的描述是"My Disk 1",源文件路径是"D:\Windows\System32\drivers\mydisk.sys"。
4. SourceDisksFiles Section
在SourceDisksFiles节中,定义了设备驱动程序的文件全路径,可以包含以下内容:
filename:指定驱动程序的文件名。
diskid:指定磁盘驱动器的编号。
subdir:指定该文件在磁盘上的路径。
size:指定该文件未经压缩时的大小,以字节为单位。
例如,假设我们有一个名为[SourceDisksNames]的节文件,它包含以下内容:
filename=diskid[,subdir][,size]
file1="C:\Windows\System32\drivers\mydisk.sys" (Windows 98)
file1="C:\Windows\System32\drivers\mydisk.sys", "C:\Windows\System32\Drivers" (Windows 2000)
这表示文件"mydisk.sys"在磁盘驱动器C上的路径是"C:\Windows\System32\drivers",并且它的大小未压缩时是1个字节。当INF文件使用CopyFiles指令时,必须包含该节。
5. Manufacturer Section
Manufacturer Section用于指定制造商信息。简单地说就是包含了制造商的名字和驱动安装在哪个CPU架构平台上。例如:
[Manufacturer]
%ManufacturerName%=Standard,NTamd64
ManufacturerName是strings section中定义的字符常量,Standard这个可以随便命名,AAA或者BBB都行,后面需要根据这个名称定义一些服务和注册表信息。NTamd64是固定的名字,表面该驱动安装在amd 64位的机器上,当然还有其他的平台,比如:NTx86、 NTia64、NTarm 或 NTarm64。还有一个偷懒的写法,可以用$ARCH $变量表示,该变量表示当前系统使用的环境。
以下是一个多平台的样例部分:
[Manufacturer]
%ManufacturerName%=Standard,NTx86,NTamd64,NTarm64
;%ManufacturerName%=Standard,NT$ARCH$
[Standard.NTx86]
...
[Standard.NTamd64]
...
[Standard.NTarm64]
...
在其子section中需要说明该驱动是用来做什么的以及安装的节点(硬件ID)。例如:
[Standard.NTx86]
%test.DeviceDesc%=test_Device, Root\VID_1100&PID_2233
[Strings]
test.DeviceDesc = "This is a test Device"
6. Strings Section
INF 文件必须至少有一个 Strings 节,才能定义该 INF 中其他位置指定的每个 %strkey% 标记。
这就跟定义一个字符串常量差不多,看下面的例子:
[Version]
...
Provider=%ManufacturerName%
...
[Strings]
ManufacturerName="<Your manufacturer name>" ;
version section中的provider指令就用到了strings中定义的ManufacturerName,用法也很简单双百分号括起来就行。
inf文件样例
以下test1.inf样例:
;
; test1.inf
;
[Version]
Signature="$WINDOWS NT$"
Class=System ; TODO: specify appropriate Class
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318} ; TODO: specify appropriate ClassGuid
Provider=%ManufacturerName%
CatalogFile=test1.cat
DriverVer = 09/15/2023,17.24.46.989
PnpLockdown=1
[DestinationDirs]
DefaultDestDir = 12
test1_Device_CoInstaller_CopyFiles = 11
[SourceDisksNames]
1 = %DiskName%,,,""
[SourceDisksFiles]
test1.sys = 1,,
;
;*****************************************
; Install Section
;*****************************************
[Manufacturer]
%ManufacturerName%=Standard,NTamd64
[Standard.NTamd64]
%test1.DeviceDesc%=test1_Device, Root\test1 ; TODO: edit hw-id
[test1_Device.NT]
CopyFiles=Drivers_Dir
[Drivers_Dir]
test1.sys
;-------------- Service installation
[test1_Device.NT.Services]
AddService = test1,%SPSVCINST_ASSOCSERVICE%, test1_Service_Inst
; -------------- test1 driver install sections
[test1_Service_Inst]
DisplayName = %test1.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\test1.sys
[test1_Device.NT.Wdf]
KmdfService = test1, test1_wdfsect
[test1_wdfsect]
KmdfLibraryVersion = 1.15
[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ManufacturerName="<Your manufacturer name>" ;TODO: Replace with your manufacturer name
DiskName = "test1 Installation Disk"
test1.DeviceDesc = "test1 Device"
test1.SVCDESC = "test1 Service"
过滤驱动inf样例:
;-------------------------------------------------------------------------------
[Version]
Signature = "$WINDOWS NT$"
Class = USB
Provider = %Mfg%
ClassGUID = {36FC9E60-C465-11CF-8056-444553540000}
DriverVer = 08/24/2023,1.0.7.7
CatalogFile = filter.cat
PnpLockdown = 1
[Manufacturer]
%Mfg% = ManufacturerFilter, NTx86.5.1, NTamd64.5.1, NTx86.10.0, NTamd64.10.0, NTarm.5.1, NTarm.10.0, NTarm64.5.1, NTarm64.10.0
[ControlFlags]
ExcludeFromSelect = *
[SourceDisksNames.x86]
1000 = %SrcDisk%,"",,\filter\i386
[SourceDisksNames.amd64]
1000 = %SrcDisk%,"",,\filter\amd64
[SourceDisksNames.arm]
1000 = %SrcDisk%,"",,\filter\arm
[SourceDisksNames.arm64]
1000 = %SrcDisk%,"",,\filter\arm64
[SourceDisksFiles]
filter.sys = 1000
[ManufacturerFilter.NTx86.5.1]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTamd64.5.1]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTarm.5.1]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTarm64.5.1]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTx86.10.0]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTamd64.10.0]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTarm.10.0]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[ManufacturerFilter.NTarm64.10.0]
%filter.DeviceDesc% = filter, USB\VID_0000&PID_0000
[filter.NT]
;-----------------------------------------------------------------
; Get the standard stuff from USB.inf
;-----------------------------------------------------------------
Include = USB.inf
Needs = Composite.Dev.NT
CopyFiles = filter.NT.Copy
[filter.NT.Copy]
filter.sys
[DestinationDirs]
filter.NT.Copy = 12
[filter.NT.HW]
AddReg = LowerFilterAddReg, USBCompositionChange
[LowerFilterAddReg]
HKR,,"LowerFilters",0x00010000,"filter"
; HKR,,"UpperFilters",0x00010000,"filter"
;-----------------------------------------------------------------
; Filter Device Filter Service Section
;-----------------------------------------------------------------
[filter.NT.Services]
Include = USB.inf
Needs = Composite.Dev.NT.Services
AddService = filter,, filter_Service_Inst
[filter_Service_Inst]
DisplayName = %filter.SvcDesc%
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %12%\filter.sys
[Strings]
Mfg = "Manufacturer Incorporated"
SrcDisk = "USB Driver Disk"
filter.DeviceDesc = "USB Composite Device"
总结
这只是简单的一个inf文件编写过程,还有一些更为复杂的本文没有写上,需要的可自行查找资料。
参考
【1】为供应商提供的系统定义的设备安装程序类
【2】保留给系统使用的系统定义的设备安装程序类
【3】INF Version section
【4】INF Manufacturer section
【5】INF DestinationDirs section
【6】INF SourceDisksFiles section
【7】INF SourceDisksNames section
【8】INF Strings Section
【9】INF AddReg directive
【10】INF AddService directive
【11】Using INX Files to Create INF Files
【12】Summary of INF Sections
【13】Windows驱动预定义设备GUID