创建可变资源映射

虽然标准资源映射只能将整个父资源分配给多功能设备的子级,但通过不同的资源映射,可以在mf.sys枚举的子资源之间细分父资源。 Windows XP 和更高版本的基于 NT 的操作系统支持不同的资源映射。

例如,请考虑 PCI 总线上的多端口串行卡。 假设每个卡的 16550 UART 函数都需要一组八个 I/O 端口和一个共享中断。 此外,假设卡作为单个 PCI 函数实现。 在此方案中,通常请求单个 I/O 端口块,然后将此块拆分为八个段,每个段对应 16550 UART 函数。

除了卡的 16550 UART 函数所需的 I/O 端口和中断资源外,假定设备还需要内存范围和设备专用资源。

根据这些假设,mf.sys将返回此设备的资源要求列表,其构造如下:

Resourcenumber 资源
00 内存范围 基寄存器地址 (BAR) 0
01 专用数据
02 内存范围 条形图 1
03 专用数据
04 I/O 端口范围 BAR 2
05 专用数据
06 中断

供应商使用 INF 文件指令指定在卡的 16550 UART 函数之间共享这些资源。 对于每个需要设备资源段的函数,必须使用 INF 中的 VaryingResourceMap 条目来创建注册表项。 下面是此设备的 INF 文件的摘录:

[DDInstall.RegHW]
; for each "child" function list hardware ID and resource map
; and/or varying resource map
HKR,Child0002,HardwareID,, child0002-hardware ID
HKR,Child0002,VaryingResourceMap,1,04, 10,00,00,00, 08,00,00,00
HKR,Child0002,ResourceMap,1,06

包含 VaryingResourceMap 的行解释如下:

  • VaryingResourceMap 参数后面的“1”指定注册表项的数据类型REG_BINARY。

  • “1”后面的数字是不同的资源映射值。 “04”表示父资源,即我们要分配给此子资源的段。 在本例中,我们将资源 04 (BAR 2) 分配给子 (,即表示每个串行端口) 八个 I/O 端口范围的资源的一部分。

  • 接下来的两个 DWORD 指示第一个是资源的偏移量,第二个是应分配给此子级的范围的长度。 在这种情况下,将八个 I/O 端口分配给此子级,从偏移量开始0x10到父资源。

  • 如果此子级需要另一个父资源,则资源的数量、长度和偏移量将包含在 INF 的同一行中,紧跟在第一个资源之后。

ResourceMap 参数在创建标准资源映射中介绍,并指示此子级应获得资源 06 的一部分,在本例中,这是 PCI 设备的中断。

下面是此设备的更完整示例,指定四个子函数:

[Version]
Signature="$Windows NT$"
Class=MultiFunction
ClassGUID={4d36e971-e325-11ce-bfc1-08002be10318}
Provider=%MYCOMPANY%
DriverVer=1/20/2000
CatalogFile=ExampleCatalog.cat
PnpLockdown=1

[ControlFlags]
ExcludeFromSelect=*

[Manufacturer]
%MYCOMPANY%=MYCOMPANY,NTamd64

[MYCOMPANY.NTamd64]
%MYCOMPANY_4PORT%=MYCOMPANY4PORT_inst, PCI\VEN_10B5&DEV_9050&SUBSYS_003112E0

[MYCOMPANY4PORT_inst]
Include = mf.inf
Needs = MFINSTALL.mf

[MYCOMPANY4PORT_inst.HW]
AddReg=MYCOMPANY4PORT_inst.RegHW

[MYCOMPANY4PORT_inst.Services]
Include = mf.inf
Needs = MFINSTALL.mf.Services

[MYCOMPANY4PORT_inst.RegHW]
HKR,Child0000,HardwareID,,*PNP0501
HKR,Child0000,VaryingResourceMap,1,04, 00,00,00,00, 08,00,00,00
HKR,Child0000,ResourceMap,1,06
HKR,Child0001,HardwareID,,*PNP0501
HKR,Child0001,VaryingResourceMap,1,04, 08,00,00,00, 08,00,00,00
HKR,Child0001,ResourceMap,1,06
HKR,Child0002,HardwareID,,*PNP0501
HKR,Child0002,VaryingResourceMap,1,04, 10,00,00,00, 08,00,00,00
HKR,Child0002,ResourceMap,1,06
HKR,Child0003,HardwareID,,*PNP0501
HKR,Child0003,VaryingResourceMap,1,04, 18,00,00,00, 08,00,00,00
HKR,Child0003,ResourceMap,1,06

[Strings]
MYCOMPANY= "MYCOMPANY Inc."
MYCOMPANY_4PORT="MYCOMPANY 4PORT"