Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1783965
  • 博文数量: 272
  • 博客积分: 1272
  • 博客等级: 少尉
  • 技术积分: 1866
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-09 15:51
文章分类

全部博文(272)

文章存档

2016年(16)

2015年(28)

2014年(97)

2013年(59)

2012年(25)

2011年(47)

分类: WINDOWS

2014-03-17 17:03:24


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


  1. ;  
  2. ; test.inf  
  3. ;整个配置文件安装成功后会在注册表生成一个实例子健 具体位置为:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum  
  4.   
  5. ;--------- Version Section ---------------------------------------------------  
  6.   
  7. [Version]  
  8.   
  9. ;可以是$Chicage$、$Windows NT$(含有一个空格)、$Windows 95$(含有一个空格)之一,定界符$必不可少,且这些串是不分大小写的。  
  10. ;如果Signature的值不是这些有效的串之一,该INF文件就被认为无效  
  11. Signature="$WINDOWS NT$"      
  12.   
  13. ;INF文件的提供者  
  14. Provider=drsn_Device      
  15.       
  16. ;INF文件的版本信息,时间和版本不变的情况下,修改了SYS文件,重新安装INF文件是看不到SYS变化的  
  17. ;因为系统已经存根了此版本的INF和SYS,它会直接加载已有的文件,调试SYS特别要主要这个问题  
  18. ;如果使用VS2012编译,它会自动帮你填写这里,比较省心  
  19. DriverVer=08/31/2013,8.33.48.258  
  20.                                       
  21. ;如果设备是一个标准类别,使用标准类的名称和GUID 否则创建一个自定义的类别名称,并自定义它的GUID  
  22. ;自定义的类别在注册表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\ 有显示  
  23. Class=drsnDevice                                      
  24. ClassGuid={BDC0EAC4-AC4B-46af-82EA-C4958B686515}          
  25.                                                       
  26.   
  27. ;--------- SourceDiskNames and SourceDiskFiles Section -----------------------  
  28.   
  29. ;这里两项的设置效果是 加载INF当前目录下的SYS文件  
  30. [SourceDisksNames]                    
  31. 1 = %DiskName%,,,                 
  32.   
  33. [SourceDisksFiles]  
  34. Name_Files_Driver = 1,,               
  35.   
  36.   
  37. ;--------- ClassInstall/ClassInstall32 Section -------------------------------  
  38.   
  39. ;如果不是标准类别设备,这里的配置必须的  
  40. [ClassInstall32]                      
  41. Addreg=Class_AddReg  
  42.   
  43. ;对应的注册表是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\  
  44. [Class_AddReg]    
  45. HKR,,,,%DeviceClassName%              
  46. HKR,,Icon,,"-5"   
  47.   
  48.   
  49. ;--------- DestinationDirs Section -------------------------------------------  
  50.   
  51. ;把文件呢复制到相应的目录下,在win2000及其以后系统,12表示%windir%/system32/drivers   
  52. ;win98中12表示%windir%/system/IoSubsys 所以为了兼容大家都写成10,System32\Drivers  
  53. [DestinationDirs]                     
  54. Name_Files_Driver = 12                
  55.   
  56.   
  57. ;--------- Manufacturer and Models Sections ----------------------------------    
  58.   
  59. ;这里是设置模型相关的选项,注意这里VS默认生成的标准设备的配置 如:%ManufacturerName%=Standard,NT$ARCH$  
  60. ;如果不是标准类别设备这里必须修改,要不然最后加载的时候会出现259错误  
  61. [Manufacturer]  
  62. %ManufacturerName%=Mfg0               
  63.                   
  64. ;这里是模型节的节名,和硬件ID 这个ID可以自定义                    
  65. [Mfg0]  
  66. %DeviceDesc%=SysInstall, PCI\VEN_8888&DEV_8888        
  67.   
  68.   
  69. ;---------- DDInstall Sections -----------------------------------------------  
  70.   
  71. ;这里需要注意WIN2000及其以上的系统这里有个.NT,如果是98这里是[SysInstall],必须要正确设置  
  72. [SysInstall.NT]                       
  73. CopyFiles=Name_Files_Driver    
  74. AddReg=Install_NT_AddReg  
  75.   
  76. ;这里的drsnWDM是注册表中的服务名 具体地址是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services  
  77. [SysInstall.NT.Services]    
  78. Addservice = drsnWDM, 0x00000002, Sys_AddService      
  79.   
  80. ;服务的具体选项  
  81. [Sys_AddService]    
  82. DisplayName = %SvcDesc%                               
  83. ServiceType = 1 ; SERVICE_KERNEL_DRIVER    
  84. StartType = 3 ; SERVICE_DEMAND_START    
  85. ErrorControl = 1 ; SERVICE_ERROR_NORMAL    
  86.   
  87. ;这个地方虽然和[Name_Files_Driver]相同但是不能引用,所以只能照实来写  
  88. ServiceBinary = %12%\test.sys     
  89.   
  90. [Install_NT_AddReg]    
  91. HKLM, "System\CurrentControlSet\Services\drsnWDM\Parameters",\    
  92. "BreakOnEntry", 0x00010001, 0   
  93.   
  94. ; --------- Files (common) -------------    
  95.   
  96. ;sys文件名 便于配置文件其它地方使用  
  97. [Name_Files_Driver]                                   
  98. test.sys  
  99.   
  100.   
  101. ;--------- Strings Section ---------------------------------------------------    
  102.   
  103. ;字符串设置 便于配置文件其它地方使用  
  104. [Strings]                                             
  105. ProviderName="drsn"   
  106. ManufacturerName="drsn soft"  
  107. DiskName="test Source Disk"  
  108. DeviceDesc="test protect"   
  109. SvcDesc="drsn"   
  110. DeviceClassName="drsn_Device"  



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


  1. ;  
  2. ; Ring0.inf  
  3. ;整个配置文件安装成功后会在注册表生成一个实例子健 具体位置为:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum  
  4.   
  5. ;--------- Version Section ---------------------------------------------------  
  6.   
  7. [Version]  
  8.   
  9. ;可以是$Chicago$、$Windows NT$(含有一个空格)、$Windows 95$(含有一个空格)之一,定界符$必不可少,且这些串是不分大小写的。  
  10. ;如果Signature的值不是这些有效的串之一,该INF文件就被认为无效  
  11. Signature="$Windows NT$"      
  12.   
  13. ;INF文件的提供者  
  14. Provider=drsn_Device      
  15.       
  16. ;INF文件的版本信息,时间和版本不变的情况下,修改了SYS文件,重新安装INF文件是看不到SYS变化的  
  17. ;因为系统已经存根了此版本的INF和SYS,它会直接加载已有的文件,调试SYS特别要主要这个问题  
  18. ;如果使用VS2012编译,它会自动帮你填写这里,比较省心  
  19. DriverVer=  
  20.                                       
  21. ;如果设备是一个标准类别,使用标准类的名称和GUID 否则创建一个自定义的类别名称,并自定义它的GUID  
  22. ;自定义的类别在注册表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\ 有显示  
  23. Class=drsnDevice                                      
  24. ClassGuid={BDC0EAC4-AC4B-46af-82EA-C4958B686515}                                                              
  25.   
  26. ;--------- ClassInstall/ClassInstall32 Section -------------------------------  
  27.   
  28. ;如果不是标准类别设备,这里的配置必须的  
  29. [ClassInstall32]                      
  30. Addreg=Class_AddReg  
  31.   
  32. ;对应的注册表是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\  
  33. [Class_AddReg]    
  34. HKR,,,,%DeviceClassName%              
  35. HKR,,Icon,,"-5"   
  36.   
  37.   
  38. ;--------- SourceDiskNames and SourceDiskFiles Section -----------------------  
  39.   
  40. ;这里两项的设置效果是 加载INF当前目录下的SYS文件  
  41. [SourceDisksNames]                    
  42. 1 = %DiskName%,,          
  43.   
  44. [SourceDisksFiles]  
  45. Name_Driver_File = 1,,                
  46. Name_Driver_File64 = 1,,  
  47.   
  48.   
  49. ;--------- DestinationDirs Section -------------------------------------------  
  50.   
  51. ;把文件呢复制到相应的目录下,在win2000及其以后系统,12表示%windir%/system32/drivers   
  52. ;win98中12表示%windir%/system/IoSubsys 所以为了兼容大家都写成10,System32\Drivers  
  53. ;由于INF同时支持32位,64位所以这里要写上2中情况  
  54. [DestinationDirs]                     
  55. Name_Driver_File = 12                 
  56. Name_Driver_File64 = 12  
  57.   
  58. ;--------- Manufacturer and Models Sections ----------------------------------    
  59.   
  60. ;这里是设置模型相关的选项,注意这里VS默认生成的标准设备的配置 如:%ManufacturerName%=Standard,NT$ARCH$  
  61. ;如果不是标准类别设备这里必须修改,要不然最后加载的时候会出现259错误  
  62. ;NT表示32位,NTAMD64表示64位  
  63. [Manufacturer]  
  64. %ManufacturerName%=Device,NT,NTAMD64                  
  65.                   
  66. ;这里是模型节的节名,和硬件ID 这个ID可以自定义                    
  67. [Device.NT]  
  68. %DeviceDesc%=SysInstall, PCI\VEN_8888&DEV_8888        
  69.   
  70. [Device.NTAMD64]  
  71. %DeviceDesc%=SysInstall, PCI\VEN_8888&DEV_8888    
  72.   
  73. ;---------- DDInstall Sections -----------------------------------------------  
  74.   
  75. ;这里需要注意WIN2000及其以上的系统这里有个.NT,如果是98这里是[SysInstall],必须要正确设置  
  76. [SysInstall.NT]                       
  77. CopyFiles=Name_Driver_File    
  78. AddReg=Install_NT_AddReg  
  79.   
  80. ;这里的drsnWDM是注册表中的服务名 具体地址是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\  
  81. [SysInstall.NT.Services]    
  82. Addservice = drsnWDM, 0x00000002, Sys_AddService      
  83.   
  84. ;服务的具体选项  
  85. [Sys_AddService]    
  86. DisplayName = %SvcDesc%                               
  87. ServiceType = 1 ; SERVICE_KERNEL_DRIVER    
  88. StartType = 3 ; SERVICE_DEMAND_START    
  89. ErrorControl = 1 ; SERVICE_ERROR_NORMAL    
  90.   
  91. ;这个地方虽然和[Name_Driver_File]相同但是不能引用,所以只能照实来写  
  92. ServiceBinary = %12%\test.sys  
  93.   
  94. [Install_NT_AddReg]    
  95. HKLM, "System\CurrentControlSet\Services\drsnWDM\Parameters",\    
  96. "BreakOnEntry", 0x00010001, 0   
  97.   
  98.   
  99. ;---------------------64位支持---------------  
  100. [SysInstall.NTAMD64]                          
  101. CopyFiles=Name_Driver_File64   
  102. AddReg=Install_NT_AddReg64  
  103.   
  104. [SysInstall.NTAMD64.Services]    
  105. Addservice = drsnWDM, 0x00000002, Sys_AddService64    
  106.   
  107. [Sys_AddService64]    
  108. DisplayName = %SvcDesc%                               
  109. ServiceType = 1 ; SERVICE_KERNEL_DRIVER    
  110. StartType = 3 ; SERVICE_DEMAND_START    
  111. ErrorControl = 1 ; SERVICE_ERROR_NORMAL    
  112. ServiceBinary = %12%\test64.sys  
  113.   
  114. [Install_NT_AddReg64]    
  115. HKLM, "System\CurrentControlSet\Services\drsnWDM\Parameters",\    
  116. "BreakOnEntry", 0x00010001, 0   
  117.   
  118. ; --------- Files (common) -------------    
  119.   
  120. ;sys文件名 便于配置文件其它地方使用  
  121. [Name_Driver_File]                                    
  122. test.sys  
  123.   
  124. [Name_Driver_File64]                                      
  125. test64.sys  
  126.   
  127. ;--------- Strings Section ---------------------------------------------------    
  128.   
  129. ;字符串设置 便于配置文件其它地方使用  
  130. [Strings]                                             
  131. ProviderName="drsn"   
  132. ManufacturerName="drsn soft"  
  133. DiskName="drsn WDM Device Source Disk"  
  134. DeviceDesc="drsn WDM Device"   
  135. SvcDesc="drsn"   
  136. DeviceClassName="drsn_Device"  




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

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

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


  1. //兼容INF时 比如szKey为%ManufacturerName%=Device,NT,NTAMD64 分解为Device,NT 或 Device,NTAMD64 根据系统类型把 szKey设置为相应的配置 从而把兼容性INF   
  2. //变成了单一化的INF, 如果是单一模式的INF 如果32位INF 或者 64位INF时 比如szKey为%ManufacturerName%=Mfg0 函数会直接返回不会进行处理  
  3. BOOL IsSupport64Inf(PCHAR szKey)  
  4. {  
  5.     CHAR szTmpStr[3][128]={0};  
  6.   
  7.     PCHAR pStr=NULL, pSplit = ",", pNextStr = NULL;  
  8.   
  9.     pStr = strtok_s(szKey, pSplit, &pNextStr);  
  10.     for(int i=0; pStr; i++)  
  11.     {  
  12.         StringCchCopyA(szTmpStr[i], 20, pStr);  
  13.         pStr=strtok_s(NULL, pSplit, &pNextStr);  
  14.     }  
  15.   
  16.     //如果逗号数量少于2个 说明是32或64位的单一INF文件   
  17.     if(szTmpStr[2][0]==0)  
  18.     {  
  19.         return FALSE;  
  20.     }  
  21.   
  22.     StringCchCopyA(szKey, 128, szTmpStr[0]);  
  23.     strcat_s(szKey, 128, ",");  
  24.   
  25.     //根据系统判断 需要安装的设备  
  26.     if(IsWow64())  
  27.     {  
  28.         strcat_s(szKey, 128, szTmpStr[2]);  
  29.     }  
  30.     else  
  31.     {  
  32.         strcat_s(szKey, 128, szTmpStr[1]);  
  33.     }  
  34.   
  35.     return TRUE;  
  36. }  


另外还需要注意的是WDM安装程序也要区分32位和64为,因为WDM安装程序会用到SetupDiCallClassInstaller函数API,此函数必须有相应位数的程序来调用,详细可见:http://blog.csdn.net/whatday/article/details/10809089
阅读(7126) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~