Erstellen unterschiedlicher Ressourcenzuordnungen
Während Standardressourcenzuordnungen nur eine gesamte übergeordnete Ressource einem untergeordneten Element eines Multifunktionsgeräts zuweisen können, können Sie mit unterschiedlichen Ressourcenzuordnungen eine übergeordnete Ressource auf untergeordnete Ressourcen unterteilen, die nach mf.sys aufgelistet werden. Unterschiedliche Ressourcenzuordnungen werden unter Windows XP und höheren Versionen des NT-basierten Betriebssystems unterstützt.
Betrachten Sie beispielsweise einen seriellen Multiport-Karte auf dem PCI-Bus. Angenommen, jede der 16550-UART-Funktionen des Karte erfordert einen Satz von acht E/A-Ports und einen einzelnen freigegebenen Interrupt. Außerdem wird davon ausgegangen, dass die Karte als einzelne PCI-Funktion implementiert ist. In diesem Szenario ist es typisch, einen einzelnen Block von E/A-Ports anzufordern und diesen Block dann in acht Segmente aufzuteilen, eines für jede 16550-UART-Funktion.
Zusätzlich zu den E/A-Port- und Interruptressourcen, die für die 16550-UART-Funktionen des Karte erforderlich sind, wird davon ausgegangen, dass das Gerät auch Speicherbereiche und geräteprivate Ressourcen benötigt.
Basierend auf diesen Annahmen gibt mf.sys eine Liste der Ressourcenanforderungen für dieses Gerät zurück, die wie folgt erstellt wird:
Ressourcennummer | Resource |
---|---|
00 | Arbeitsspeicherbereich Basisregisteradresse (BAR) 0 |
01 | Private Daten |
02 | Arbeitsspeicherbereich BAR 1 |
03 | Private Daten |
04 | E/A-Portbereich BAR 2 |
05 | Private Daten |
06 | Interrupt |
Anbieter verwenden INF-Dateidirektiven, um die Freigabe dieser Ressourcen unter den UART-Funktionen 16550 des Karte anzugeben. Für jede Funktion, die ein Segment der Geräteressourcen erfordert, müssen Sie einen VaryingResourceMap-Eintrag im INF verwenden, um einen Registrierungseintrag zu erstellen. Es folgt ein Auszug aus der INF-Datei für dieses Gerät:
[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
Die Zeile, die VaryingResourceMap enthält, wird wie folgt interpretiert:
Die "1" nach dem VaryingResourceMap-Parameter gibt an, dass der Datentyp des Registrierungseintrags REG_BINARY ist.
Die Zahlen nach "1" sind die unterschiedlichen Ressourcenzuordnungswerte. "04" gibt die übergeordnete Ressource an, ein Segment, das wir diesem untergeordneten Element zuweisen. In diesem Fall weisen wir dem untergeordneten Element ein Segment der Ressource 04 (BAR 2) zu (d. h. ein Teil der Ressource, der die acht E/A-Portbereiche für jeden seriellen Port darstellt).
Die nächsten beiden DWORDs geben erstens den Offset in die Ressource und zweitens die Länge des Bereichs an, der diesem untergeordneten Element zugeordnet werden soll. In diesem Fall werden diesem untergeordneten Element acht E/A-Ports zugeordnet, beginnend beim Offset 0x10 in die übergeordnete Ressource.
Wenn für dieses untergeordnete Element eine weitere übergeordnete Ressource erforderlich ist, werden nummer, länge und offset der Ressource in derselben Zeile des INF nach der ersten Ressource enthalten.
Der ResourceMap-Parameter wird unter Erstellen von Standardressourcenzuordnungen beschrieben und gibt an, dass dieses untergeordnete Element eine Freigabe von Ressource 06 erhalten soll, was in diesem Fall der Interrupt des PCI-Geräts ist.
Im Folgenden finden Sie ein vollständiges Beispiel für dieses Gerät, das vier untergeordnete Funktionen angibt:
[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"