Создание карт ресурсов с различными изменениями
В то время как стандартные карты ресурсов могут назначать весь родительский ресурс только дочернему элементу многофункционального устройства, различные карты ресурсов позволяют разделить родительский ресурс между дочерними элементами, перечисляемыми mf.sys. Различные карты ресурсов поддерживаются в Windows XP и более поздних версиях операционной системы на основе NT.
Например, рассмотрим многопортовый последовательный карта на шине PCI. Предположим, что каждой из функций UART 16550 карта требуется набор из восьми портов ввода-вывода и одно общее прерывание. Также предположим, что карта реализована в виде одной функции PCI. В этом сценарии обычно запрашивается один блок портов ввода-вывода, а затем этот блок разбивается на восемь сегментов, по одному для каждой функции UART 16550.
Помимо порта ввода-вывода и ресурсов прерываний, необходимых для функций UART 16550 карта, предполагается, что устройству также требуются диапазоны памяти и частные ресурсы устройства.
Исходя из этих предположений, mf.sys вернет список требований к ресурсам для этого устройства, созданный следующим образом:
Resourcenumber | Ресурс |
---|---|
00 | Диапазон памяти Базовый адрес регистра (BAR) 0 |
01 | Личные данные |
02 | Диапазон памяти BAR 1 |
03 | Личные данные |
04 | Диапазон портов ввода-вывода BAR 2 |
05 | Личные данные |
06 | Прервать |
Поставщики используют директивы INF-файла, чтобы указать общий доступ к этим ресурсам среди функций UART 16550 карта. Для каждой функции, требующей сегмента ресурсов устройства, необходимо использовать запись VaryingResourceMap в INF для создания записи реестра. Ниже приведен фрагмент 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 , интерпретируется следующим образом:
Значение "1" после параметра VaryingResourceMap указывает, что тип данных записи реестра REG_BINARY.
Числа после "1" представляют собой различные значения карты ресурсов. "04" обозначает родительский ресурс, сегмент которого мы назначаем этому дочернему элементу. В этом случае мы назначаем сегмент ресурса 04 (BAR 2) дочернему элементу (то есть часть ресурса, представляющую восемь диапазонов портов ввода-вывода для каждого последовательного порта).
Следующие два DWORD указывают, во-первых, смещение ресурса и, во-вторых, длину диапазона, который должен быть выделен этому дочернему элементу. В этом случае для этого дочернего элемента выделяются восемь портов ввода-вывода, начиная со смещения 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"