структура 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.
Драйверы мини-порта SVGA, реализующие все функции VGA (объявленные в реестре как VgaCompatible, для них задано значение 1), должны утверждать, что диапазоны доступа недоступны, поэтому системный драйвер VGA не будет загружен. С другой стороны, драйверы мини-портов для адаптеров, таких как S3 или XGA, которые устанавливают VgaCompatible равным нулю в реестре, должны утверждать, что все ресурсы, которые они совместно используют с системным драйвером VGA, как общие.

Однако драйверы мини-портов для карт, которые работают со сквозным протоколом 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

EMULATOR_ACCESS_ENTRY

HwVidFindAdapter

HwVidQueryDeviceCallback

HwVidQueryNamedValueCallback

VIDEO_HW_INITIALIZATION_DATA

VideoPortGetAccessRanges

VideoPortGetDeviceBase

VideoPortGetDeviceData

VideoPortGetRegistryParameters

VideoPortInitialize

VideoPortSetTrappedEmulatorPorts

VideoPortVerifyAccessRanges