さまざまなリソース マップの作成
標準のリソース マップでは、多機能デバイスの子にのみ親リソース全体を割り当てることができますが、さまざまなリソース マップを使用すると、mf.sysによって列挙された子の間で親リソースを分割できます。 さまざまなリソース マップは、Windows XP 以降のバージョンの NT ベースのオペレーティング システムでサポートされています。
たとえば、PCI バス上のマルチポート シリアル カードについて考えてみましょう。 カードの 16550 UART 関数のそれぞれに、8 つの I/O ポートと 1 つの共有割り込みが必要であるとします。 また、カードが 1 つの PCI 関数として実装されていると仮定します。 このシナリオでは、I/O ポートの 1 つのブロックを要求してから、16550 UART 関数ごとに 1 つずつ、このブロックを 8 つのセグメントに分割するのが一般的です。
カードの 16550 UART 関数に必要な I/O ポートと割り込みリソースに加えて、デバイスにはメモリ範囲とデバイスプライベート リソースも必要であると想定します。
これらの前提に基づいて、mf.sysは、次のように構築された、このデバイスのリソース要件リストを返します。
Resourcenumber | リソース |
---|---|
00 | メモリ範囲 ベース レジスタ アドレス (BAR) 0 |
01 | プライベート データ |
02 | メモリ範囲 BAR 1 |
03 | プライベート データ |
04 | I/O ポート範囲 バー 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) のセグメントを子に割り当てます (つまり、各シリアル ポートの 8 つの I/O ポート範囲を表すリソースの一部)。
次の 2 つの DWORD は、最初にリソースへのオフセットを示し、2 番目に、この子に割り当てる必要がある範囲の長さを示します。 この場合、親リソースへのオフセット 0x10から始まる 8 つの I/O ポートがこの子に割り当てられます。
この子が別の親リソースを必要とする場合は、最初のリソースの後に、INF の同じ行にリソースの数、長さ、およびオフセットが含まれます。
ResourceMap パラメーターは、「標準リソース マップの作成」で説明されており、この子がリソース 06 の共有を取得する必要があることを示します。この場合は PCI デバイスの割り込みになります。
このデバイスのより完全な例を次に示します。4 つの子関数を指定します。
[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"