структура VIDEO_ACCESS_RANGE (video.h)
Структура VIDEO_ACCESS_RANGE определяет порт ввода-вывода устройства или диапазон памяти для видеоадаптера. Функция HwVidFindAdapter каждого драйвера мини-порта должна настроить массив элементов типа VIDEO_ACCESS_RANGE, называемых массивом диапазонов доступа, для каждого видеоадаптера, который поддерживает драйвер минипорта.
Для драйверов мини-портов, совместимых с VGA, VIDEO_ACCESS_RANGE также определяет элемент в массиве, передаваемом в VideoPortSetTrappedEmulatorPorts , чтобы включить или отключить прямой доступ к портам ввода-вывода полноэкранными приложениями MS-DOS.
Синтаксис
typedef struct _VIDEO_ACCESS_RANGE {
PHYSICAL_ADDRESS RangeStart;
ULONG RangeLength;
UCHAR RangeInIoSpace;
UCHAR RangeVisible;
UCHAR RangeShareable;
UCHAR RangePassive;
} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
Члены
RangeStart
Указывает базовый адрес относительно шины диапазона портов памяти или ввода-вывода для элемента в массиве диапазонов доступа, переданного в VideoPortVerifyAccessRanges или возвращаемого VideoPortGetAccessRanges.
Указывает базовый адрес диапазона портов ввода-вывода относительно шины для массива, передаваемого в VideoPortSetTrappedEmulatorPorts.
RangeLength
Указывает количество портов ввода-вывода или размер в байтах для диапазона.
RangeInIoSpace
Указывает, находится ли диапазон в пространстве ввода-вывода или в памяти. Значение TRUE (1) указывает, что диапазон находится в пространстве ввода-вывода; значение FALSE (0) указывает, что диапазон находится в памяти.
RangeVisible
Игнорируется, если функция HwVidFindAdapter драйвера мини-порта настраивает массив диапазонов доступа.
Устанавливается в значение TRUE драйверами мини-порта, совместимыми с VGA, и передается в VideoPortSetTrappedEmulatorPorts , чтобы обеспечить прямой доступ к диапазону портов ввода-вывода с помощью полноэкранного приложения MS-DOS. Если задано значение FALSE, инструкции, выданные приложением, по-прежнему перехватываются и пересылаются в функцию SvgaHwIoXxx драйвера мини-порта для проверки.
RangeShareable
Имеет значение TRUE , если диапазон доступа, описанный в этом элементе, может использоваться совместно с другим драйвером и (или) устройством, или значение FALSE , если невозможно предоставить общий доступ к диапазону.
Игнорируется VideoPortSetTrappedEmulatorPorts.
RangePassive
Указывает, использует ли устройство порт. Значения для этого элемента приведены в следующей таблице.
Значение | Значение |
---|---|
VIDEO_RANGE_PASSIVE_DECODE | Устройство декодирует порт, но драйвер не использует его. |
VIDEO_RANGE_10_BIT_DECODE | Устройство декодирует десять битов адреса порта. |
Комментарии
Драйвер мини-порта должен запрашивать устаревшие ресурсы в своей функции DriverEntry или HwVidLegacyResources .
В противном случае функция HwVidFindAdapter драйвера мини-порта настраивает массив диапазонов доступа для ресурсов PCI адаптера. Он может использовать сведения, возвращаемые VideoPortGetAccessRanges. В качестве альтернативы можно использовать сведения, полученные из реестра, путем вызова VideoPortGetDeviceData с функцией HwVidQueryDeviceCallback , предоставленной драйвером мини-порта, или VideoPortGetRegistryParameters с функцией HwVidQueryNamedValueCallback , предоставленной драйвером мини-порта. Если вызов этого VideoPortXxx не предоставляет значения диапазона доступа относительно шины, HwVidFindAdapter может настроить элементы диапазонов доступа с помощью значений по умолчанию относительно шины, предоставленных драйвером.
Запрос диапазонов доступа в реестре
Драйвер мини-порта должен вызывать VideoPortVerifyAccessRanges с любыми диапазонами доступа, полученными из VideoPortGetDeviceData, VideoPortGetAccessRanges или предоставленными драйвером мини-порта в качестве значений по умолчанию. Если VideoPortVerifyAccessRanges возвращает NO_ERROR для такого массива диапазонов доступа, функция HwVidFindAdapter или HwVidQueryDeviceCallback может сопоставить диапазоны с VideoPortGetDeviceBase и использовать возвращенные сопоставленные логические адреса для доступа к адаптеру.При успешном вызове VideoPortGetAccessRanges также запрашиваются возвращенные диапазоны доступа относительно шины в реестре для вызывающей стороны. Если драйвер минипорта изменяет любое из возвращаемых значений, он должен вызвать VideoPortVerifyAccessRanges с полным диапазоном доступа, включая все неизмененные элементы. Каждый вызов VideoPortGetAccessRanges или VideoPortVerifyAccessRanges для определенного видеоадаптера перезаписывает запрошенные аппаратные ресурсы вызывающего объекта в реестре.
Драйвер мини-порта не должен пытаться использовать диапазон, для которого VideoPortVerifyAccessRanges или VideoPortGetAccessRanges не возвращает NO_ERROR.
Сопоставление диапазонов доступа для связи с адаптером
После того как драйвер мини-порта запросит ресурсы в реестре для адаптера, он не сможет использовать связанные с шиной адреса для доступа к адаптеру или настройки адаптера, так как HAL может переназначить все адреса устройств, относящихся к шине, в системное пространство.Функция HwVidFindAdapter драйвера мини-порта должна вызвать VideoPortGetDeviceBase , чтобы получить сопоставленные логические адреса для диапазонов доступа. Только после этого драйвер мини-порта может взаимодействовать с видеоадаптером, передав возвращенные адреса сопоставленного логического диапазона в VideoPortRead/WritePortXxx для доступа к памяти устройства в пространстве ввода-вывода и (или ) VideoPortRead/WriteRegisterXxx для доступа к памяти устройства в памяти.
Определение того, является ли диапазон доступа общим
Следуйте этим рекомендациям, чтобы определить, можно ли предоставить общий доступ к диапазону доступа:- Если диапазон портов памяти или операций ввода-вывода должен принадлежать этому драйверу и/или доступ к этому диапазону любым другим драйвером может вызвать проблему, задайте для параметра RangeSharableзначение FALSE.
- Если диапазон можно совместно использовать совместно с драйвером устройства, задайте для свойства RangeSharable значение TRUE.
Однако драйверы мини-портов для карт, которые работают со сквозным протоколом IOCTL и могут быть подключены к любым карта VGA или SVGA, не должны использовать системные порты VGA или диапазоны памяти. В этом случае такой драйвер не должен пытаться запросить какие-либо диапазоны доступа VGA в реестре. Попытки запросить ресурсы VGA с помощью такого драйвера мини-порта, скорее всего, вызовут конфликт ресурсов, так как драйвер любой карта SVGA на компьютере будет утверждать, что эти диапазоны доступа не являются недоступными.
Передача элементов диапазона портов ввода-вывода в VideoPortSetTrappedEmulatorPorts
Все элементы массива VIDEO_ACCESS_RANGE типа, описывающие диапазоны портов ввода-вывода, считаются невидимыми, если драйвер мини-порта, совместимый с VGA, на компьютере под управлением x86 явно не сбрасывает элементы RangeVisible в значение TRUE и не вызывает VideoPortSetTrappedEmulatorPorts , чтобы включить один или несколько диапазонов портов ввода-вывода. VideoPortSetTrappedEmulatorPorts игнорирует элементы RangeSharable входного массива.В массиве элементов типа VIDEO_ACCESS_RANGE, передаваемых в VideoPortSetTrappedEmulatorPorts, значение элемента RangeVisible каждого элемента определяет, могут ли указанные порты ввода-вывода быть доступны напрямую VDM (приложение MS-DOS, работающее в полноэкранном режиме на компьютере с архитектурой x86), или же такой поток ввода-вывода, выданный приложением, перехватывается и перенаправлен в предоставленную драйвером мини-порта функцию SvgaHwIoPortXxx для первой проверки.
Требования
Требование | Значение |
---|---|
Заголовок | video.h (включить Video.h) |
См. также раздел
DriverEntry of Video Miniport Driver
VideoPortGetRegistryParameters