最后附上我自己对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"
;
; 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"
;
; 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,如果不是按照前边的来,如果是进行分解具体代码如下:
-
-
-
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);
-
}
-
-
-
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;
-
}
//兼容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
阅读(7232) | 评论(0) | 转发(0) |