INF文件详解(32位64位兼容INF)

INF文件格式要求
一个INF文件是以段组织的简单的文本文件。一些段油系统定义(System-Defined)的名称,而另一些段由INF文件的编写者命名。每个段包含特定的条目和命名,这些命名用于引用INF文件其它地方定义的附加段。
INF文件的语法规则:
1、要求的内容:在特定的INF文件中所要求的必选段和可选段、条目及命令依赖于所要安装的设备组件。端点顺序可以是任意的,大多数的INF文件安装惯用的次序来安排各个段。
2、段名:INF文件的每个段从一个括在方括号[]中的段名开始。段名可以由系统定义或INF编写者定义
在Windows 2000中,段名的最大长度为255个字符。在Windows 98中,段名不应该超过28个字符。如果INF设计要在两个平台上运行,必须遵守最小的限制。段名、条目和命令不分大小写。在一个INF文件中如果有两个以上的段有相同的名字,系统将把其条目和命令合并成一个段。每个段以另一个新段的开始或文件的结束为结束。
3、使用串标记:在INF文件中的许多值,包括INF编写者定义的段名都可以标示成%strkey%形式的标记。每个这样的strkey必须在INF文件的Strings段中定义为一系列显示可见字符组成的值。
4、行格式、续行及注释:段中的每个条目或命令以回车或换行符结束。在条目或命令中,“/”可以没用做一个显示的续行符;分好“;”标示后面的内容是注释;可以用都好“,”分隔条目和命令中提供的多个值。
INF文件举例
下面是一个完整的.inf文件,它是Windows 2000 DDK提供的USB批量阐述驱动程序范例中所附的.inf文件。
; Installation inf for the Intel 82930 USB Bulk IO Test Board
;
; (c) Copyright 1999 Microsoft
;
[Version]
Signature="$CHICAGO$"
Class=USB
ClassGUID={36FC9E60-C465-11CF-8056-444553540000}
provider=%MSFT%
DriverVer=08/05/1999
[SourceDisksNames]
1="BulkUsb Installation Disk",,,
[SourceDisksFiles]
BULKUSB.sys = 1
BULKUSB.inf = 1
[Manufacturer]
%MfgName%=Microsoft
[Microsoft]
%USB/VID_045E&PID_930A.DeviceDesc%=BULKUSB.Dev, USB/VID_045E&PID_930A
;[PreCopySection]
;HKR,,NoSetupUI,,1
[DestinationDirs]
BULKUSB.Files.Ext = 10,System32/Drivers
BULKUSB.Files.Inf = 10,INF
[BULKUSB.Dev]
CopyFiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf
AddReg=BULKUSB.AddReg
[BULKUSB.Dev.NT]
CopyFiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf
AddReg=BULKUSB.AddReg
[BULKUSB.Dev.NT.Services]
Addservice = BULKUSB, 0x00000002, BULKUSB.AddService
[BULKUSB.AddService]
DisplayName = %BULKUSB.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%/System32/Drivers/BULKUSB.sys
LoadOrderGroup = Base
[BULKUSB.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,BULKUSB.sys
HKLM,"System/Currentcontrolset/Services/BulkUsb/Parameters","MaximumTransferSize",0x10001,4096
HKLM,"System/Currentcontrolset/Services/BulkUsb/Parameters","DebugLevel",0x10001,2
[BULKUSB.Files.Ext]
BULKUSB.sys
[BULKUSB.Files.Inf]
BulkUsb.Inf
;---------------------------------------------------------------;
[Strings]
MSFT="Microsoft"
MfgName="Intel"
USB/VID_045E&PID_930A.DeviceDesc="BulkUsb.Sys Intel 82930 USB Bulk IO Test Board"
BULKUSB.SvcDesc="BulkUsb.Sys i82930 Bulk IO test driver"
INF文件详解
从上面完整的例子来看,可以对INF文件有的一个总体的印象,包括INF文件中包括的段,以及各段的书写格式。下面详细介绍组成INF文件的各个段。
1、[Version]段
习惯上,每个INF文件都开始于一个Version段,这段确定文件中描述的设备类型,上述范例中的Verson段有如下几条语句:
Signature=”$CHICAGO$”
Class=USB
ClassGUID={36FC9E60-C465-11CF-8056-444553540000}
provider=%MSFT%
DriverVer=08/05/1999
Signature指定使用此INF文件的操作系统,可以是$Chicago$、$Windows NT$(含有一个空格)、$Windows 95$(含有一个空格)之一,定界符$必不可少,且这些串是不分大小写的。如果Signature的值不是这些有效的串之一,该INF文件就被人为无效。如果一个INF文件用来向Windows 2000和Windows 98两个平台上安装设备驱动程序,它必须通过DDInstall段来增加系统定义的扩展指定任意操作系统特有的安装信息,而不管Signature是何值。
Class指定设备的类名,此范例中指定的是USB类。ClassGuid指定设备注册表的GUID,GUID是一个128位的标识符,DDK头文件DEVGUID.h定义了标准设备类的GUID。
Provide标志该INF文件的提供者。%MSFT%的具体内容将在Strings段中定义,范例中的定义是MSFT=”Microsoft”,表明该INF文件的提供者是Microsoft。
DriverVer条目提供整个INF文件的版本信息,在每个Install段中加上DriverVer条目,为驱动程序提供版本信息。Install段的驱动程序版本条目更具有专用性,并且比Version段的全局DriverVer条目日期具有更高的优先级。当操作系统搜索驱动程序时,他会选择一个具有更近的DriverVer日期的驱动程序代替一个较早的驱动程序。如果一个INF没有DriverVer条目,操作系统将会用缺省的日期00/00/0000。
2、[SourceDiskNames]段
该段制定并且命名一个或多个包含源文件的磁盘,这些源文件用于文件拷贝或者重命名操作。该段可以有任意条目,每个条目对应一个源盘。条目格式如下:
disk=%strkey%|”disk-description”,[tagfile],[unused],[path]
diskid是标志一个源盘的非负整数。这个值可以是十六进制或者十进制的形式标示,但他不能占用多余4个字节的存储单元。等式右边规定一个%strkey%标记或者一个引号引起来的串,描述由diskid所标示盘符的内容或目的。在安装过程中安装程序可以给终端用户显示这个串值。TagFile是一个可选的值,规定一个所带磁盘上提供的特征文件名,不规定任何目录和子目录。安装程序使用特征文件核对用户插入正确的安装盘。特征文件只能用于可移动的介质。
Unused值不用在Windows 2000中,只用在Windows 9x中。Path也是个可选项,用于标识磁盘上包含源文件的目录路径。范例中SourceDisksNames段的内容如下:
[SourceDiskNames]
1=”BulkUsb Installation Disk”…
范例规定源盘为磁盘1,在安装期间,安装程序可以给终端用户显示字符串“BulkUsbInstallation Disk”。
3、[SourceDisksFiles]段
该段命名安装过程中所用的源文件,标志包含这些源文件的磁盘(或者CD-ROM),并提供在所带磁盘上包含的每个文件的目录路径。一个SourcesDisksFiles段可以有任意多条目,磁盘上每个文件都有一个条目。它所包含的条目格式为
filename=disked[,[subdir][,size]]。
Filename规定磁盘上源文件的名称;diskid对顶一个整数来标志包含源文件的磁盘,即在
SourceDisksNames段中规定的diskid;subdir是个可选值,它规定了源磁盘上的文件所在的子目录,如果该条目省略,指定的源文件或者在给定磁盘的根目录中,或者在由SourceDisksNames段中的path条目所指定的目录;size也是个可选值,规定了给定文件的非压缩长度,其以字节标示。范例中SourceDisksFiles段的内容如下:
[SourceDisksFiles]
BULKUSB.sys=1
BULKUSB.inf=1
范例中为两个文件建立的条目,这两个文件都在磁盘1中,并且在根目录下。
4、[Manufacturer]段
该段标志一个或者多个用INF文件安装的设备的制造商,它也为制造商的设备即驱动程序的安装定义Models段名。每个INF文件都必须有Manufacturer段。
上述范例的Manufacturer段有一个条目:
[Manufacturer]
%MfgName%=Microsoft
在Strings段中可以找到%MfgName%定义的字符串,本范例中定义的是MfgName=”Intel”,表明设备制造商是Intel。而右边Microsoft也是制造商的Models段的段名。在INF中,为每个制造商的Models段规定了一个INF编写者定义的名字,这个名称要在Manufacturer段中加以应用。范例中的制造商Models段如下:
[Microsoft]
%USB/VID_045E&PID_930A.DeviceDesc%=BULKUSB.Dev, USB/VID_045E&PID_930A
该段属于制造商的Models段,段名是由INF编写者自行定义的,不属于系统段名。每个制造商的Models段至少标识一个设备,并规定设备的厂商ID(VID)和产品ID(PID)同时引用这个设备INF文件的Install段。该段也可以规定一个或者多个附加设备ID,因为有多个与初始硬件ID所识别的设备兼容,同时由相同的驱动程序驱动。当设备管理器发现从检测设备所得到的ID,符号此段定义的ID时,设备管理器就知道找到了正确的INF文件。
范例中规定了一个设备,设备的VID是0x045E,而PID是0x930A。VID是由USB管理委员会给每个USB芯片厂商统一分配的,例如Philips公司的VID是0x0471,Cypres公司的VID是0x0547等,范例中的VID是Intel公司的。产品ID(PID)是由各个厂商自己定义的,这里VID0x930A是Intel的一个USB批量传输的实验板。
范例中该条目等式右边的BULKUSBDev给设备标识了一个INF文件编写者定义的Install段。
5、[DestinationDirs]段
该段为所有的硬件拷贝、删除和改名操作规定目标目录。范例中的DestinationDirs段如下:
[DestinatinDirs]
BULKUSB.Files.Ext=10,System32/Drivers
BULKUSB.Files.Inf=10.INF
DestinationDirs段中条目等式的左边规定INF文件编写者定义的段名,这些段中的文件将会被存入等式右边指定的目录中,并且这些文件可以被INF文件中其他地方的CopyFiles、RenFiles和DelFiles命令引用。例如,范例中这两个段的定义如下:
[BULKUSB.Files.Ext]
BULKUSB.sys
[BULKUSB.Files.Inf]
BULKUSB.Inf
DestinationDirs段中条目等号右边的10是一个逻辑磁盘标志符号(Logical Disk Identifier, LDID),它规定了对文件操作的目标目录标识符,后面跟随的是子目录,作为文件操作的目标地址。范例中第一个文件BULKUSB.sys的目标地址是WinNT/System32/Drivers;第二个文件BULKUSB.Inf的目标地址是WinNT/INF。
DestinationDirs段也可以包含一个缺省目标目录DefaultDestDird的条目,为所有对文件的拷贝、删除和更名操作规定省略的目标路径,这些文件没有明确的列在其它条目所引用的文件列表中。Windows DDK的Device Information File Reference文件有其他的LDID熟知的定义,如下表。
常用LDID定义
LDID数值
目标目录
00
NULL LDID,此LDID可以用来创建新的LDID
01
源磁盘驱动器:/路径
02
临时安装文件夹,只在安装期间有效
03
解除安装目录
10
Windows目录
11
系统目录
12
IO子系统目录
13
Command目录
14
控制面板目录
15
打印机目录
16
工作类别目录
17
INF目录
18
Help目录
19
登记
20
字体
21
Viewers
22
VMM32
23
Color目录
24
应用程序目录
25
共享目录
26
WinBoot
28
主机Winboot
30
引导驱动器的根目录
31
虚拟引导驱动器的主机驱动器的根目录
5、Install段
Install段包含指导安装程序安装所需软件的实际指示。该段必须在一个设备或者型号(Model)的条目中引用。每个Models的每个Install段包括一个可选的DriverVer条目和一个或多个引用INFormation中附加命令段的命令,这些命令索引用的段包含安装驱动程序文件及向注册表写入设备专用的和驱动程序专用信息命令。这里,首先列出这个断的常用格式
[install-section-name]
[install-section-name.nt]
[install-section-name.ntx86]
[DriverVer=mm/dd/yyyy]
[CopyFiles=@filename|file-list-section]
Addreg=add-registry-section
[include=filename.inf]
… …
… …
首先,看到有3个可选的段名,在Windows 9x平台中,提供了一个无修饰的Install段名[install-section-name],其中规定设备的安装条目。在Windows 2000平台中,提供相应的
[install-section-name.nt]段名,如果还要限定在x86为基础的Windows 2000平台上,则提供[install-section-name.ntx86]段名。设备安装程序将搜索最合适后缀的install段,例如,假设有3个install段,第一个无后缀,后两个分别带有.NT和.NTx86后缀。如果安装到x86平台上的Windows 2000中,安装程序会使用.NTx86段;如果安装到非Intel平台上运行的Windows 2000中,安装程序将使用.NT段;如果安装到Windows 98中,安装程序使用无后缀段。DriverStudioVer条目就是前面叙述的版本信息。
☆[CopyFiles=@filename|file-list-section]:或者指定一个要从源媒体拷贝到目标设备的文件名,或者引用一个或多个INFormation编写者定义的段,其中列出了源媒体上要拷贝到目标设备的相关文件。这个命令是可选的,但是大多数的段都包括这个命令。
☆Addreg=add-registry-section:这个命令引用一个或多个INFormation编写者定义的段,其中规定了要写入注册表的新的子键,这些新关键字可能有初始条目,在这些段中也可以修改 已有关键字的值。范例中索引用的段如下:
[BULKUSB.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,BULKUSB.sys
HKLM,"System/Currentcontrolset/Services/BulkUsb/Parameters","MaximumTransferSize",0x10001,4096
HKLM,"System/Currentcontrolset/Services/BulkUsb/Parameters","DebugLevel",0x10001,2
HKLM是注册表的根键,它是HKEY_LOCAL_MACHINE的缩写。而HKR与注册表关键字相关,最适合于AddReg命令出现的地方。比如,注册表中每个设备的“硬件”子键:../Enum/枚举器ID/设备ID,与此相对的注册表中每个驱动程序指定的“软件”子键:..CLASS/类GUID/设备ID等。除此之外还有HKCR、HKCU、HKLM和HKU。
前面所举范例的Install段如下:
[BULKUSB.Dev]
CopyFiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf
AddReg=BULKUSB.AddReg
[BULKUSB.Dev.NT]
CopyFiles=BULKUSB.Files.Ext, BULKUSB.Files.Inf
AddReg=BULKUSB.AddReg
所需拷贝的两个文件在INF编写者定义的BULKUSB.Files.Ext和BULKUSB.Files.Inf段中,而要添加到注册表的项目则在BULKUSB.AddReg段中。
6、Install.Service段
该段包含一个或者多个AddService命令,用以控制一个特定驱动程序的服务装在的时间按和方式,控制本服务对其他服务和下一级驱动程序的依赖等,房里中的定义如下:
BULKUSB.Dev.NT.Services]
Addservice = BULKUSB, 0x00000002, BULKUSB.AddService
其中,BULKUSB是指定的所需安装服务的名称。对于一个设备,这个值通常是该设备驱动程序的属性。0x00000002是一个系统指定的标记(Flag),不同的标记有不同的服务功能。最后一项BULKUSB.AddService是INF文件编写者定义的特定段,其中包括了所需添加的服务项目,其范例的定义如下:
[BULKUSB.AddService]
DisplayName = %BULKUSB.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%/System32/Drivers/BULKUSB.sys
LoadOrderGroup = Base
8、[Strings]段
[Strings]段就是字符串段。该段定义了其他段内所指定的字符串,段内的每一个项目都符合一个在其他段内使用百分比符号(%)包括起来的字符串。范例中的定义如下:
[Strings]
MSFT="Microsoft"
MfgName="Intel"
USB/VID_045E&PID_930A.DeviceDesc="BulkUsb.Sys Intel 82930 USB Bulk IO Test Board"
BULKUSB.SvcDesc="BulkUsb.Sys i82930 Bulk IO test driver"
GenInf软件生成Inf文件
Windows 2000DDK提供了一个实用程序GenInf,他可以生成INF文件。GenInf是一个INF文件生成向导工具,可以帮助用户产生一个自定义的Windows 2000驱动程序的INF文件。用户只需要按照向导的提示填写必要的信息,他就可以自动生成一个INF文件。但是,GenInf只能生成但结构的INF文件,而并不支持多结构的INF文件。另外,GenInf并不一定总是能够生成一个完成的或者功能完备的INF文件。因此,用户号必须做一些必要的修改。

用GenInf生成INF文件之后,还可以使用Windows 2000 DDK提供的ChkInf实用程序来检查所生成的INF文件的结构和语法是否正确。ChkInf程序是一个Perl Scrip,因此,需要由Perl解释器才能运行它。检测的结果以HTML的格式保存,包括所有的错误和警告的列表。


最后附上我自己对INF的一个理解:

;
; test.inf
;整个配置文件安装成功后会在注册表生成一个实例子健 具体位置为:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum

;--------- Version Section ---------------------------------------------------

[Version]

;可以是$Chicage$、$Windows NT$(含有一个空格)、$Windows 95$(含有一个空格)之一,定界符$必不可少,且这些串是不分大小写的。
;如果Signature的值不是这些有效的串之一,该INF文件就被认为无效
Signature="$WINDOWS NT$"	

;INF文件的提供者
Provider=drsn_Device	
	
;INF文件的版本信息,时间和版本不变的情况下,修改了SYS文件,重新安装INF文件是看不到SYS变化的
;因为系统已经存根了此版本的INF和SYS,它会直接加载已有的文件,调试SYS特别要主要这个问题
;如果使用VS2012编译,它会自动帮你填写这里,比较省心
DriverVer=08/31/2013,8.33.48.258
									
;如果设备是一个标准类别,使用标准类的名称和GUID 否则创建一个自定义的类别名称,并自定义它的GUID
;自定义的类别在注册表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\ 有显示
Class=drsnDevice									
ClassGuid={BDC0EAC4-AC4B-46af-82EA-C4958B686515}		
													

;--------- SourceDiskNames and SourceDiskFiles Section -----------------------

;这里两项的设置效果是 加载INF当前目录下的SYS文件
[SourceDisksNames]					
1 = %DiskName%,,,				

[SourceDisksFiles]
Name_Files_Driver = 1,,				


;--------- ClassInstall/ClassInstall32 Section -------------------------------

;如果不是标准类别设备,这里的配置必须的
[ClassInstall32]					
Addreg=Class_AddReg

;对应的注册表是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
[Class_AddReg]  
HKR,,,,%DeviceClassName%			
HKR,,Icon,,"-5" 


;--------- DestinationDirs Section -------------------------------------------

;把文件呢复制到相应的目录下,在win2000及其以后系统,12表示%windir%/system32/drivers 
;win98中12表示%windir%/system/IoSubsys 所以为了兼容大家都写成10,System32\Drivers
[DestinationDirs]					
Name_Files_Driver = 12				


;--------- Manufacturer and Models Sections ----------------------------------  

;这里是设置模型相关的选项,注意这里VS默认生成的标准设备的配置 如:%ManufacturerName%=Standard,NT$ARCH$
;如果不是标准类别设备这里必须修改,要不然最后加载的时候会出现259错误
[Manufacturer]
%ManufacturerName%=Mfg0				
				
;这里是模型节的节名,和硬件ID 这个ID可以自定义					
[Mfg0]
%DeviceDesc%=SysInstall, PCI\VEN_8888&DEV_8888		


;---------- DDInstall Sections -----------------------------------------------

;这里需要注意WIN2000及其以上的系统这里有个.NT,如果是98这里是[SysInstall],必须要正确设置
[SysInstall.NT]						
CopyFiles=Name_Files_Driver  
AddReg=Install_NT_AddReg

;这里的drsnWDM是注册表中的服务名 具体地址是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
[SysInstall.NT.Services]  
Addservice = drsnWDM, 0x00000002, Sys_AddService	

;服务的具体选项
[Sys_AddService]  
DisplayName = %SvcDesc%								
ServiceType = 1 ; SERVICE_KERNEL_DRIVER  
StartType = 3 ; SERVICE_DEMAND_START  
ErrorControl = 1 ; SERVICE_ERROR_NORMAL  

;这个地方虽然和[Name_Files_Driver]相同但是不能引用,所以只能照实来写
ServiceBinary = %12%\test.sys	

[Install_NT_AddReg]  
HKLM, "System\CurrentControlSet\Services\drsnWDM\Parameters",\  
"BreakOnEntry", 0x00010001, 0 

; --------- Files (common) -------------  

;sys文件名 便于配置文件其它地方使用
[Name_Files_Driver]									
test.sys


;--------- Strings Section ---------------------------------------------------  

;字符串设置 便于配置文件其它地方使用
[Strings]											
ProviderName="drsn" 
ManufacturerName="drsn soft"
DiskName="test Source Disk"
DeviceDesc="test protect" 
SvcDesc="drsn" 
DeviceClassName="drsn_Device"

以上INF是对32位驱动的支持,如果要同时支持32位和64位 兼容INF如下:

;
; Ring0.inf
;整个配置文件安装成功后会在注册表生成一个实例子健 具体位置为:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum

;--------- Version Section ---------------------------------------------------

[Version]

;可以是$Chicago$、$Windows NT$(含有一个空格)、$Windows 95$(含有一个空格)之一,定界符$必不可少,且这些串是不分大小写的。
;如果Signature的值不是这些有效的串之一,该INF文件就被认为无效
Signature="$Windows NT$"	

;INF文件的提供者
Provider=drsn_Device	
	
;INF文件的版本信息,时间和版本不变的情况下,修改了SYS文件,重新安装INF文件是看不到SYS变化的
;因为系统已经存根了此版本的INF和SYS,它会直接加载已有的文件,调试SYS特别要主要这个问题
;如果使用VS2012编译,它会自动帮你填写这里,比较省心
DriverVer=
									
;如果设备是一个标准类别,使用标准类的名称和GUID 否则创建一个自定义的类别名称,并自定义它的GUID
;自定义的类别在注册表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\ 有显示
Class=drsnDevice									
ClassGuid={BDC0EAC4-AC4B-46af-82EA-C4958B686515}															

;--------- ClassInstall/ClassInstall32 Section -------------------------------

;如果不是标准类别设备,这里的配置必须的
[ClassInstall32]					
Addreg=Class_AddReg

;对应的注册表是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
[Class_AddReg]  
HKR,,,,%DeviceClassName%			
HKR,,Icon,,"-5" 


;--------- SourceDiskNames and SourceDiskFiles Section -----------------------

;这里两项的设置效果是 加载INF当前目录下的SYS文件
[SourceDisksNames]					
1 = %DiskName%,,		

[SourceDisksFiles]
Name_Driver_File = 1,,				
Name_Driver_File64 = 1,,


;--------- DestinationDirs Section -------------------------------------------

;把文件呢复制到相应的目录下,在win2000及其以后系统,12表示%windir%/system32/drivers 
;win98中12表示%windir%/system/IoSubsys 所以为了兼容大家都写成10,System32\Drivers
;由于INF同时支持32位,64位所以这里要写上2中情况
[DestinationDirs]					
Name_Driver_File = 12				
Name_Driver_File64 = 12

;--------- Manufacturer and Models Sections ----------------------------------  

;这里是设置模型相关的选项,注意这里VS默认生成的标准设备的配置 如:%ManufacturerName%=Standard,NT$ARCH$
;如果不是标准类别设备这里必须修改,要不然最后加载的时候会出现259错误
;NT表示32位,NTAMD64表示64位
[Manufacturer]
%ManufacturerName%=Device,NT,NTAMD64				
				
;这里是模型节的节名,和硬件ID 这个ID可以自定义					
[Device.NT]
%DeviceDesc%=SysInstall, PCI\VEN_8888&DEV_8888		

[Device.NTAMD64]
%DeviceDesc%=SysInstall, PCI\VEN_8888&DEV_8888	

;---------- DDInstall Sections -----------------------------------------------

;这里需要注意WIN2000及其以上的系统这里有个.NT,如果是98这里是[SysInstall],必须要正确设置
[SysInstall.NT]						
CopyFiles=Name_Driver_File  
AddReg=Install_NT_AddReg

;这里的drsnWDM是注册表中的服务名 具体地址是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
[SysInstall.NT.Services]  
Addservice = drsnWDM, 0x00000002, Sys_AddService	

;服务的具体选项
[Sys_AddService]  
DisplayName = %SvcDesc%								
ServiceType = 1 ; SERVICE_KERNEL_DRIVER  
StartType = 3 ; SERVICE_DEMAND_START  
ErrorControl = 1 ; SERVICE_ERROR_NORMAL  

;这个地方虽然和[Name_Driver_File]相同但是不能引用,所以只能照实来写
ServiceBinary = %12%\test.sys

[Install_NT_AddReg]  
HKLM, "System\CurrentControlSet\Services\drsnWDM\Parameters",\  
"BreakOnEntry", 0x00010001, 0 


;---------------------64位支持---------------
[SysInstall.NTAMD64]						
CopyFiles=Name_Driver_File64 
AddReg=Install_NT_AddReg64

[SysInstall.NTAMD64.Services]  
Addservice = drsnWDM, 0x00000002, Sys_AddService64	

[Sys_AddService64]  
DisplayName = %SvcDesc%								
ServiceType = 1 ; SERVICE_KERNEL_DRIVER  
StartType = 3 ; SERVICE_DEMAND_START  
ErrorControl = 1 ; SERVICE_ERROR_NORMAL  
ServiceBinary = %12%\test64.sys

[Install_NT_AddReg64]  
HKLM, "System\CurrentControlSet\Services\drsnWDM\Parameters",\  
"BreakOnEntry", 0x00010001, 0 

; --------- Files (common) -------------  

;sys文件名 便于配置文件其它地方使用
[Name_Driver_File]									
test.sys

[Name_Driver_File64]									
test64.sys

;--------- Strings Section ---------------------------------------------------  

;字符串设置 便于配置文件其它地方使用
[Strings]											
ProviderName="drsn" 
ManufacturerName="drsn soft"
DiskName="drsn WDM Device Source Disk"
DeviceDesc="drsn WDM Device" 
SvcDesc="drsn" 
DeviceClassName="drsn_Device"

起初对兼容性的INF有个疑问:是WDM驱动安装程序自己判断32位或64位进行安装吗?还是把2个设备从配置文件读出来系统来判断呢?

为此做了一个实验,把%ManufacturerName%=Device,NT,NTAMD64分解为 Device.NT 和 Device.NTAMD64(注意这里是点号不是逗号) 操作系统会加载2个设备配置,所以根据当前系统位数来选择安装一个合适的设备,结果印证了结论1是正确的。

对此WDM驱动安装程序也需要修改,有起初的直接读取%ManufacturerName%=Mfg0去寻找[Mfg0]块,改变为分析是否是兼容的INF,如果不是按照前边的来,如果是进行分解具体代码如下:

//兼容INF时 比如szKey为%ManufacturerName%=Device,NT,NTAMD64 分解为Device,NT 或 Device,NTAMD64 根据系统类型把 szKey设置为相应的配置 从而把兼容性INF 
//变成了单一化的INF, 如果是单一模式的INF 如果32位INF 或者 64位INF时 比如szKey为%ManufacturerName%=Mfg0 函数会直接返回不会进行处理
BOOL IsSupport64Inf(PCHAR szKey)
{
    CHAR szTmpStr[3][128]={0};

    PCHAR pStr=NULL, pSplit = ",", pNextStr = NULL;

    pStr = strtok_s(szKey, pSplit, &pNextStr);
    for(int i=0; pStr; i++)
    {
        StringCchCopyA(szTmpStr[i], 20, pStr);
        pStr=strtok_s(NULL, pSplit, &pNextStr);
    }

    //如果逗号数量少于2个 说明是32或64位的单一INF文件 
    if(szTmpStr[2][0]==0)
    {
        return FALSE;
    }

    StringCchCopyA(szKey, 128, szTmpStr[0]);
    strcat_s(szKey, 128, ",");

    //根据系统判断 需要安装的设备
    if(IsWow64())
    {
        strcat_s(szKey, 128, szTmpStr[2]);
    }
    else
    {
        strcat_s(szKey, 128, szTmpStr[1]);
    }

    return TRUE;
}
另外还需要注意的是WDM安装程序也要区分32位和64为,因为WDM安装程序会用到SetupDiCallClassInstaller函数API,此函数必须有相应位数的程序来调用,详细可见:http://blog.csdn.net/whatday/article/details/10809089




展开阅读全文

没有更多推荐了,返回首页