使用系统提供的多功能总线驱动程序
如果设备的基础总线支持多功能总线标准(如 PC 卡),则基于 NT 的平台上的多功能设备的供应商可以使用系统提供的多功能总线驱动程序 (mf.sys) 来支持该设备。
mf.sys总线驱动程序处理设备函数的 PnP 枚举,并在函数之间仲裁 I/O 端口和 IRQ 等资源。 mf.sys驱动程序通过电源管理父多功能设备来处理子函数的电源管理。
若要使用mf.sys,多功能设备必须满足以下要求:
设备的基础总线必须具有多功能标准。
子函数 DEVICE_CAPABILITIES 必须相同,并且必须与父设备匹配。 当查询子函数 (IRP_MN_QUERY_CAPABILITIES) 的设备功能时,mf.sys驱动程序会报告父设备的设备功能。
多功能设备所在的总线的驱动程序(例如pcmcia.sys)必须处理任何 IRP_MN_READ_CONFIG 和 IRP_MN_WRITE_CONFIG 请求。 mf.sys驱动程序只是将这些 IRP 传递给父总线驱动程序。
函数必须独立:它们不能具有起始顺序依赖项;一个函数的资源要求不能用另一个函数的资源来表示 (例如,function1 使用 I/O 端口 X,function2 使用 portX + 200) :和 每个函数都必须能够作为单独的设备运行,即使它由与另一个函数相同的驱动程序 () 提供服务。
若要使用mf.sys,供应商为多功能设备提供 INF,将mf.sys指定为设备的驱动程序。 如果设备完全准确地符合其基础总线的多功能标准,则此类设备的供应商可以使用系统提供的 mf.inf。 如果设备不完全符合标准,供应商必须提供自定义 INF。
无论哪种情况,供应商都为设备上的单个功能提供驱动程序和 INF 文件。
自定义多功能 INF 的以下框架演示了将 mf.sys 指定为多功能设备的驱动程序所需的语法:
[Version]
; ...
Class = Multifunction ; the system-defined class for MF devices
ClassGUID = {4d36e971-e325-11ce-bfc1-08002be10318} ; GUID for MF
; ...
; ...
[ControlFlags]
ExcludeFromSelect = * ; don't include PnP devices in a displayed list of
; devices available for manual installation
[Manufacturer]
; ...
; ...
[ModelsSection.NTamd64] ; models section
; ...
; ...
[DDInstall.NT] ; install section
Include = mf.inf ; specify that this device requires mf.sys
Needs = MFINSTALL.mf
; ...
[DDinstall.NT.Services]
Include = mf.inf
Needs = MFINSTALL.mf.Services
[DDInstall.NT.HW]
AddReg=DDInstall.RegHW
[DDInstall.RegHW]
; put entries with child function hardware IDs here
; ...
; put override sections here...
; ...
[Strings]
; ...
请考虑结合使用 LAN/调制解调器电脑卡设备。 如果没有任何特殊的多功能支持,PCMCIA 总线驱动程序可能会将此类设备报告为单个调制解调器设备。 借助多功能 INF 和 mf.sys 总线驱动程序的额外支持,将枚举设备的这两个功能。 下图显示了可能为具有所需多功能支持的此类组合电脑卡创建的示例设备堆栈。
如上图所示,多功能设备所在的总线的驱动程序枚举一个设备。 多功能 INF 文件中的硬件 ID 会导致 PnP 管理器加载mf.sys总线驱动程序作为设备的函数驱动程序。 mf.sys总线驱动程序枚举两个子设备:一个 LAN 设备和一个调制解调器。
PnP 管理器将每个子设备视为典型设备,查找 INF 文件、加载适当的驱动程序、调用其 AddDevice 例程等,直到为每个设备创建设备堆栈。 mf.sys总线驱动程序仲裁子设备的资源,并管理设备的任何其他多功能方面。 多功能卡的供应商为 LAN 和调制解调器) (多个功能提供功能驱动程序和 INF,就像它们是单独的设备一样。
此图重点介绍函数驱动程序和父总线驱动程序及其关联的 FDO 和 PDO。 为简单起见,将省略 (和筛选器DO) 的任何筛选器驱动程序。