VIDEO_ACCESS_RANGE 结构 (video.h)

VIDEO_ACCESS_RANGE结构定义视频适配器的设备 I/O 端口或内存范围。 每个微型端口驱动程序的 HwVidFindAdapter 函数必须为微型端口驱动程序支持的每个视频适配器设置一个由VIDEO_ACCESS_RANGE类型元素构成的数组(称为 访问范围数组)。

对于 VGA 兼容的微型端口驱动程序,VIDEO_ACCESS_RANGE还会定义传递给 VideoPortSetTrappedEmulatorPorts 的 数组中的元素,以启用或禁用全屏 MS-DOS 应用程序对 I/O 端口的直接访问。

语法

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 返回的访问范围数组中的元素指定内存或 I/O 端口范围的总线相对基址。

指定要传递到 VideoPortSetTrappedEmulatorPorts 的数组的 I/O 端口范围的总线相对基址。

RangeLength

指定范围的 I/O 端口数或大小(以字节为单位)。

RangeInIoSpace

指定范围是在 I/O 空间中还是在内存空间中。 值为 TRUE (1) 表示范围在 I/O 空间中; 值为 FALSE (0) 表示该范围在内存空间中。

RangeVisible

如果微型端口驱动程序的 HwVidFindAdapter 函数正在设置访问范围数组,则忽略 。

由 VGA 兼容的微型端口驱动程序设置为 TRUE ,并传递给 VideoPortSetTrappedEmulatorPorts ,以允许全屏 MS-DOS 应用程序直接访问 I/O 端口范围。 如果设置为 FALSE,应用程序发出的指令将继续被捕获并转发到微型端口驱动程序的 SvgaHwIoXxx 函数进行验证。

RangeShareable

如果此元素描述的访问范围可以与其他驱动程序和/或设备共享,则设置为 TRUE ;如果无法共享范围,则设置为 FALSE

被 VideoPortSetTrappedEmulatorPorts 忽略。

RangePassive

指示设备是否实际使用该端口。 下表显示了此成员的值。

含义
VIDEO_RANGE_PASSIVE_DECODE 设备解码端口,但驱动程序不使用端口。
VIDEO_RANGE_10_BIT_DECODE 设备解码端口地址的 10 位。

注解

微型端口驱动程序必须在其 DriverEntryHwVidLegacyResources 函数中声明旧资源。

否则,微型端口驱动程序的 HwVidFindAdapter 函数会为适配器的 PCI 资源设置访问范围数组。 它可以使用 VideoPortGetAccessRanges 返回的信息。 作为替代方法,它可以通过使用微型端口驱动程序提供的 HwVidQueryDeviceCallback 函数调用 VideoPortGetDeviceData 或具有微型端口驱动程序提供的 HwVidQueryNamedValueCallback 函数的 VideoPortGetRegistryParameters 来使用从注册表中检索的信息。 如果调用这些 VideoPortXxx 不提供相对于总线的访问范围值, 则 HwVidFindAdapter 可以使用驱动程序提供的总线相对默认值设置访问范围元素。

在注册表中声明访问范围

微型端口驱动程序应使用从 VideoPortGetDeviceData、VideoPortGetAccessRanges 获取或微型端口驱动程序作为默认值提供的任何访问范围调用 VideoPortVerifyAccessRanges 如果 VideoPortVerifyAccessRanges 为此类访问范围数组返回NO_ERROR, 则 HwVidFindAdapterHwVidQueryDeviceCallback 函数可以使用 VideoPortGetDeviceBase 映射范围,并使用返回的映射逻辑地址访问适配器。

成功调用 VideoPortGetAccessRanges 还会声明调用方注册表中返回的相对于总线的访问范围。 如果微型端口驱动程序修改任何返回的值,则必须调用具有完整访问范围(包括任何未修改的元素)的 VideoPortVerifyAccessRanges 。 对特定视频适配器的 VideoPortGetAccessRangesVideoPortVerifyAccessRanges 的每次调用都会覆盖注册表中调用方声明的硬件资源。

微型端口驱动程序不得尝试使用 VideoPortVerifyAccessRangesVideoPortGetAccessRanges 不返回NO_ERROR的范围。

映射访问范围以与适配器通信

微型端口驱动程序在适配器的注册表中声明资源后,它无法使用相对于总线的地址来访问或配置适配器,因为 HAL 可以将所有相对于总线的设备地址重新映射到 系统空间

微型端口驱动程序的 HwVidFindAdapter 函数必须调用 VideoPortGetDeviceBase 以获取其访问范围的映射逻辑地址。 只有这样,微型端口驱动程序才能与视频适配器通信,方法是将返回的映射逻辑范围地址传递给 VideoPortRead/WritePortXxx 以访问 I/O 空间中的设备内存,或 VideoPortRead/WriteRegisterXxx 访问内存空间中的设备内存。

确定访问范围是否可共享

请遵循以下准则来确定是否可以共享访问范围:
  • 如果内存或 I/O 端口的范围应由此驱动程序“拥有”,并且/或由任何其他驱动程序访问此范围可能会导致问题,请将 RangeSharable 设置为 FALSE
  • 如果范围可以与协作设备驱动程序共享,请将 RangeSharable 设置为 TRUE
实现所有 VGA 功能的 SVGA 微型端口驱动程序 (在注册表中声明为 VgaCompatible 设置为一个) 应声明其访问范围不可共享,因此系统 VGA 驱动程序将不会加载。 另一方面,在注册表中将 VgaCompatible 设置为零的适配器(如 S3 或 XGA)的微型端口驱动程序应将其与系统 VGA 驱动程序共享的所有资源声明为可共享资源。

但是,适用于使用直通 IOCTL 且可连接到任何 VGA 或 SVGA 卡的卡的微型端口驱动程序不应使用任何系统 VGA 端口或内存范围。 如果这样做,则此类驱动程序不应尝试在注册表中声明任何 VGA 访问范围。 尝试通过此类微型端口驱动程序声明 VGA 资源可能会导致资源冲突,因为计算机中任何 SVGA 卡的驱动程序都将声明这些访问范围不可共享。

将 I/O 端口范围元素传递到 VideoPortSetTrappedEmulatorPorts

所有描述 I/O 端口范围的VIDEO_ACCESS_RANGE类型数组元素都假定为不可见,除非基于 x86 的计算机中 VGA 兼容的微型端口驱动程序将 RangeVisible 成员 () 显式重置为 TRUE 并调用 VideoPortSetTrappedEmulatorPorts 以启用一个或多个 I/O 端口范围。 VideoPortSetTrappedEmulatorPorts 忽略输入数组的 RangeSharable 成员。

在传递给 VideoPortSetTrappedEmulatorPorts 的VIDEO_ACCESS_RANGE类型元素数组中, 每个元素的 RangeVisible 成员的值确定在基于 x86 的计算机上全屏运行的 VDM (MS-DOS 应用程序是否可以直接访问给定的 I/O 端口) () ,或者是否首先捕获此类应用程序颁发的 I/O 流并将其转发到微型端口驱动程序提供的 SvgaHwIoPortXxx 函数进行验证。

要求

要求
Header video.h (包括 Video.h)

另请参阅

视频微型端口驱动程序的驱动程序入口

EMULATOR_ACCESS_ENTRY

HwVidFindAdapter

HwVidQueryDeviceCallback

HwVidQueryNamedValueCallback

VIDEO_HW_INITIALIZATION_DATA

VideoPortGetAccessRanges

VideoPortGetDeviceBase

VideoPortGetDeviceData

VideoPortGetRegistryParameters

VideoPortInitialize

VideoPortSetTrappedEmulatorPorts

VideoPortVerifyAccessRanges