| ryvius |
2007-10-07 07:40 |
研发过程: nForce网卡的HWID分析过程就略了,再提俺要吐了... http://bbs.wuyou.com/viewthread.php?tid=113275 NVIDIA nForce Ethernet硬件ID分析
当你down接近1G的芯片组驱动,最后发现有用的东西(Ethernet IDE SMBus SMU,Display无视)用WINRAR压缩成固实的RAR文件,大小才3.26MB时... 我想你会有拿起板凳猛拍NVIDIA的猪头工程师的冲动吧
一、从硬件结构入手 二、驱动程序文件进一步分析 三、插曲:神秘的nvtcp.sys 四、对比Vista驱动,HWID补完计划 五、MCP73的迷惑,通吃? 六、闲话后继研究
一、从硬件结构入手
第一步是从nForce芯片组的网络部分入手,寻找其网卡驱动在WINPE上为何如此难缠的原因
完整的网卡在硬件上包含两部分:MAC(媒体访问控制)和PHY(Physical Layer 物理层) 从nForce3开始 NVIDIA在南桥(NVIDIA称之为MCP)上集成了千兆网卡的MAC (nForce芯片组的板载PHY芯片有Realtek、Marvell、Visse等) 为了满足其数据传输量,NVIDIA还开辟了一条特殊的PCI总线连接MAC部分与南桥(MCP) 惹事的就是这条特殊PCI总线
从nForce3的网卡驱动开始 芯片组驱动的Ethernet这个文件夹内其实是放了两个驱动 按照安装顺序 第一个是总线驱动nvnetbus.inf (bus部分) 第二个才是网卡驱动nvenetfd.inf (fd部分)
所以我在处理网卡驱动时
一是要让两个INF内的对应HWID的一一对应 严禁捞过界的行为——例如装了nForce3的bus部分,却配套nForce4的fd部分,那就彻底乱套了,很大机会见到亲切的蓝屏画面

二是根据WINPE下驱动安装的特性 把nForce2之外的网卡驱动拆分成总线驱动bus、网卡驱动fd两部分,然后用XCAB处理(一定要勾选处理INF)
------------------------
二、驱动程序文件进一步分析 开始时我也以为只要按照pecmd的固有机制 INF文件解压到X:\WXPE\INF sys文件解压到X:\WXPE\system32\drivers 其它文件解压到X:\WXPE\system32 结果证明光这样做是不行的,因为手工进行这系列操作也无效
于是在那台C61的机器上继续研究 配置如下图

此机器安装了deepinxp lite v58 test 网卡驱动已经安装好 在驱动程序详细信息那里看到两件诡异的事情:
(一)、配套DLL文件的蛊惑
 
驱动文件详细信息:

资源:

HWID:
 
 
服务和枚举:
 
总线关系和设备协同安装
 
NVIDIA Network Bus Enumerator的驱动调用的dll文件居然不是两个而是三个 多出了一个bdco1ins.dll 同样NVIDIA nForce Networking Controller的驱动程序详细信息里面多出了fdco1ins.dll 打开对应的INF文件搜索bdco1ins.dll或fdco1ins.dll 另外比较原版nvnetbus.inf和XCAB处理后的nvnetbus.inf中 发现此字段有蛊惑:
[nvnetBus_Device_CoInstaller_CopyFiles] bdco1.dll bdco1ins.dll,bdco1.dll nvconrm.dll
也就是说,bus驱动的安装过程,bdco1.dll会拷贝多一份,重命名为bdco1ins.dll 同样,fd驱动的安装过程,fdco1ins.dll会拷贝多一份,重命名为fdco1ins.dll
而调用[nvnetBus_Device_CoInstaller_CopyFiles]的恰好是 [nvnetBus_Device.NT.CoInstallers]
但是原版nvnetbus.inf中 [nvnetBus_Device.NT.CoInstallers] AddReg=CoInstaller_AddReg copyFiles=nvnetBus_Device_CoInstaller_CopyFiles 这行是能够被XP驱动安装组件认可并且执行驱动程序文件的拷贝和重命名
而XCAB处理后的nvnetbus.inf中 [nvnetBus_Device.NT.CoInstallers] AddReg=CoInstaller_AddReg ;opyFiles=nvnetBus_Device_CoInstaller_CopyFiles 分号;在INF文件中起的是注释作用 也就是说这行是没作用的
nvenetfd.inf也有同样的情况
 
驱动文件详细信息:
 
资源和电源管理:
 
HWID:
 

服务和枚举:
 
类别安装程序和设备协同安装
 
pecmd安装驱动的特性之一是要求INF文件废掉copyFiles操作! 而我那个只分拆了bus跟fd后就直接用XCAB处理的的驱动包,内里没有bdco1ins.dll和fdco1ins.dll 缺少这两个辅助dll,网卡驱动装得上才怪 于是除了nForce2的网卡驱动,其它都补上bdco1ins.dll和fdco1ins.dll
(二)、sys文件的猫腻 NVIDIA nForce Networking Controller的驱动程序详细信息里面 驱动核心文件的名称是NVENETFD.sys
 原驱动包里面则是nvefdxp.sys(nvefd2k.sys已经干掉了,呵呵) 查看原版nvenetfd.inf
调用[NVENET_XP.CopyFiles]的是[NVENET_XP.NDI.NT]
[NVENET_XP.NDI.NT] Characteristics = 0x84 ; NCF_PHYSICAL | NCF_HAS_UI BusType = 1 ; Pretend ISA AddReg = NVENET_XP.reg, SpeedSetting.reg, ASF.reg, JumboFrameSize.reg, ChecksumOffload.reg, SegOffload.reg,\ LowPowerStateLinkSpeed.reg, FlowControl.reg copyFiles = NVENET_XP.CopyFiles
[NVENET_XP.CopyFiles] NVENETFD.sys,nvefdxp.sys,,2
[NVENET_2K.CopyFiles] NVENETFD.sys,nvefd2k.sys,,2
也就是说,驱动的安装过程,nvefdxp.sys(nvefd2k.sys)都会改名为NVENETFD.sys
经过XCAB处理后的nvenetfd.inf [NVENET_XP.NDI.NT] Characteristics = 0x84 ; NCF_PHYSICAL | NCF_HAS_UI BusType = 1 ; Pretend ISA AddReg = NVENET_XP.reg, SpeedSetting.reg, ASF.reg, JumboFrameSize.reg, ChecksumOffload.reg, SegOffload.reg,\ LowPowerStateLinkSpeed.reg, FlowControl.reg ;opyFiles = NVENET_XP.CopyFiles 这里已经变成了注释,没有拷贝和改名的作用 所以驱动安装失败
nvefd2k.sys早已删除 剩下的nvefdxp.sys都改名为NVENETFD.sys 其实一些驱动包只支持WINXP,文件名直接就是NVENETFD.sys,不需要改了 不过我也得庆幸C61没有这个情况 不需要日后肯定要做的再度Debug
经过上述两步折腾,驱动能成功安装了,ADSL拨号+IE6上网成功了 但技术追求是没有止境的...
------------------------
三、插曲:神秘的nvtcp.sys
(一)、干掉nvtcp.sys 还是那台C61机器 NVIDIA Network Bus Enumerator和NVIDIA nForce Networking Controller 的驱动程序详细信息里面都没有nvtcp.sys、 INF里面查过,是属于nvnetbus.inf的,但搜到唯一的一处 只是在注册表条目里面写入了一个信息
[CoInstaller_AddReg] HKR,,CoInstallers32,0x00010000, \ "bdco1ins.dll,BDCoInstaller", \ "nvconrm.dll,NVCoInstaller"
HKR, Uninstall, Script,0,"nvnrm.nvu" HKR, Uninstall, Name,0,"NVIDIA Ethernet Driver Components" HKR, Uninstall, INFSrcDir, 0, %1% HKR, Uninstall, Uninstaller,0,"nvunrm.exe" HKR, Uninstall, CopyFiles, %REG_MULTI_SZ%, "nvtcp.sys"
从这段文件看来,是关于设备卸载的 nvnetbus.inf文件里面,nvtcp.sys没有起到其它作用 后来nForce4、C51上的安装测试也证明了这一点 在网上搜索,得知nvtcp.sys应该是跟NVIDIA在其芯片组驱动包里面提供的网络防火墙有关 所以nvtcp.sys完全可以精简掉
(二)、进一步精简驱动
还有两个未知作用的文件:nvnrm.sys、nvsnpu.sys 是否可以一并干掉? 经过我在C51平台上的进一步确认 (C61的研究和测试是熬通宵的,因为机器重灌系统后要交货,于是厚脸皮找人弄了台C51) 删除这两个文件的话 NVIDIA Network Bus Enumerator驱动会安装失败,而且是报告驱动损坏的那一种(绝对没商量)
nvnrm.nvu其实是个纯文本 nvunrm.exe是NV的专用设备卸载程序 都可以灭了
还有INF文件里面根本没提到的nvphy.bin文件 nForce 650i(南桥部分是nForce 430、410)、nForce 520/560、nForce 630a的Ethernet驱动内各带有一个 这个文件从名字来看比较诡异 删掉后在C51上的测试暂时正常 如有问题请兄弟姐妹们反馈
nvenetfd.tag、nvnetbus.tag只是在[SourceDisksNames]字段存在 如nvenetfd.inf [SourceDisksNames] 1 = %DiskId1%, NVENETFD.tag,, 把, NVENETFD.tag,,变成,,, 完事 至于CAT文件,早就干掉了,留着碍事...
经过一番减肥后 驱动的体积成功缩小40% 不过意外参考了一些资料 发觉有必要继续upgrade
------------------------
四、对比Vista驱动,HWID补完计划 http://bbs.wuyou.com/viewthread.php?tid=113275 NVIDIA nForce Ethernet硬件ID分析 提取了Vista中nForce系列网卡的驱动 两特点:
(一)、很简洁!只有netnvm32.inf+nvm60x32.sys!看得口水直流...
后来分析了一下,觉得应该没什么可能移植了 WINXP中,两个INF文件
nvnetbus.inf [Version] Signature="$WINDOWS NT$" ;Class=System ;ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318} Class=%Vendor_ClassName% ClassGuid={1a3e09be-1e45-494b-9174-d7385b45bbf5}
nvenetfd.inf [version] Class = Net ClassGUID = {4D36E972-E325-11CE-BFC1-08002BE10318}
另外综合到 nForce系列网卡在安装nvnetbus.inf之前 在设备管理器里的设备类别是“其它PCI桥设备” 安装nvnetbus.inf后设备类别才变成“网络适配器” 设备类别的差别,很难搞(Mission Impossible...)
(二)、HWID多一倍! 看来还有很多网卡的HWID,在NVIDIA官网提供的驱动里面根本没有
 从Vista的驱动注释看来,大多数是NoteBook平台的 另外参考一下老毛桃WINPE里头的nForce网卡驱动 根据nForce芯片组的演化进程 同步修改一下nvnetbus.inf、nvenetfd.inf,加入缺少的HWID(依旧注意一一对应!) 增强通用性
------------------------
五、MCP73的迷惑,通吃?
这事情在这里提过了 http://bbs.wuyou.com/viewthread.php?tid=112734 82楼
新增了不少网卡的HWID之余(蓝色字部分) 更奇怪的是,似乎7CH提供的这个网卡驱动,能通吃nForce3和之后的所有nForce芯片组的网卡? 到现在为止,NVIDIA虽然发布了MCP73芯片组,但是官网依然尚未提供对应驱动的官方下载 以下仅列出nvnetbus.inf部分 nvenetfd.inf也是一一对应的,这里略了
DriverVer = 09/10/2007, 67.6.2
[Standard] %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_008C %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_00DF %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0038 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0057 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0269 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0373 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0389 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_03EF %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_03E6 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0452 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0453 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_054E %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_054F %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0086 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_00E6 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0037 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0056 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0268 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0372 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_03E5 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_03EE %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0450 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0451 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_054C %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_054D %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_07DC %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_07DE %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_07DD %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_07DF %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0760 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0761 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0762 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0763 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0AB0 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0AB1 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0AB2 %nvnetbus.DeviceDesc%=nvnetBus_Device, PCI\VEN_10DE&DEV_0AB3
这里也按之前的做法提供了MCP73的驱动(分拆、增加dll、sys改名、精简无用文件) 如果有兄弟姐妹已经摸到MCP73的板子,可以帮忙测试一下 还有就是——手头有nForce3和之后的芯片组的平台兄弟姐妹,也请在测试上面的驱动之余,试试这个MCP73的驱动 如果确认是完全通用,那么之前的七个驱动完全可以放弃掉六个,大大减少驱动的体积!
------------------------
六、闲话后继研究
1、大规模广泛测试...各种nForce芯片组的都试试... 需要注意两个小问题:继续确认一些文件的删除是否有影响;MCP73网卡驱动的通用性
2、如开头所说的,这些驱动如果都集中在一个cab内压缩(能节省很多空间),就会互相干扰而无法成功安装驱动,也请试用者帮忙再度验证
3、日后有继续有这种架构的nForce网卡驱动出现,当前的处理手法是否继续奏效?新驱动的通用性如何?
4、鉴于PECMD的驱动安装机制特性,XCAB处理后的INF文件,如果安装出现问题,建议检查copyfiles=的字段,看看有无猫腻
顺带一提 光棍节次日,nForce 780i要来了
http://news.mydrivers.com/1/92/92268.htm 三卡SLI芯片组11月12日发布
除了G92、G92两款新显卡将在11月12日发售之外,NVIDIA还会在同一天推出代号“C72”的“nForce 780i SLI”芯片组,支持三卡SLI。
nForce 780i SLI芯片组支持全系列Intel LGA775处理器,包括最新登场的1333MHz前端总线型号和未来的45nm Yorkfield、Wolfdale。
nForce 780i SLI将具备三条PCI-E x16插槽,支持“Tri-SLI”技术,以此对抗AMD-ATI即将放出的四卡Quad CrossFire。不过需要注意的是,该芯片组虽然支持PCI-E 2.0规范,但并非原生支持,而是通过额外加装的BR04芯片达成的。
此外,nForce 780i SLI依然支持DDR2内存,而对DDR3的支持要等到2008年第一季度的“C73”。
nForce 780i SLI还有两个千兆以太网控制器、六个SATA 3Gbps接口。

Xpreview.com提供的nForce 780i SLI主板实物图,可以明显看到三条PCI-E x16插槽、45度斜向摆放的北桥芯片和旁边的BR04芯片。 | |