次の方法で共有


さまざまなリソース マップの作成

標準のリソース マップでは、多機能デバイスの子にのみ親リソース全体を割り当てることができますが、さまざまなリソース マップを使用すると、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"