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 位。 |
注解
微型端口驱动程序必须在其 DriverEntry 或 HwVidLegacyResources 函数中声明旧资源。
否则,微型端口驱动程序的 HwVidFindAdapter 函数会为适配器的 PCI 资源设置访问范围数组。 它可以使用 VideoPortGetAccessRanges 返回的信息。 作为替代方法,它可以通过使用微型端口驱动程序提供的 HwVidQueryDeviceCallback 函数调用 VideoPortGetDeviceData 或具有微型端口驱动程序提供的 HwVidQueryNamedValueCallback 函数的 VideoPortGetRegistryParameters 来使用从注册表中检索的信息。 如果调用这些 VideoPortXxx 不提供相对于总线的访问范围值, 则 HwVidFindAdapter 可以使用驱动程序提供的总线相对默认值设置访问范围元素。
在注册表中声明访问范围
微型端口驱动程序应使用从 VideoPortGetDeviceData、VideoPortGetAccessRanges 获取或微型端口驱动程序作为默认值提供的任何访问范围调用 VideoPortVerifyAccessRanges。 如果 VideoPortVerifyAccessRanges 为此类访问范围数组返回NO_ERROR, 则 HwVidFindAdapter 或 HwVidQueryDeviceCallback 函数可以使用 VideoPortGetDeviceBase 映射范围,并使用返回的映射逻辑地址访问适配器。成功调用 VideoPortGetAccessRanges 还会声明调用方注册表中返回的相对于总线的访问范围。 如果微型端口驱动程序修改任何返回的值,则必须调用具有完整访问范围(包括任何未修改的元素)的 VideoPortVerifyAccessRanges 。 对特定视频适配器的 VideoPortGetAccessRanges 或 VideoPortVerifyAccessRanges 的每次调用都会覆盖注册表中调用方声明的硬件资源。
微型端口驱动程序不得尝试使用 VideoPortVerifyAccessRanges 或 VideoPortGetAccessRanges 不返回NO_ERROR的范围。
映射访问范围以与适配器通信
微型端口驱动程序在适配器的注册表中声明资源后,它无法使用相对于总线的地址来访问或配置适配器,因为 HAL 可以将所有相对于总线的设备地址重新映射到 系统空间。微型端口驱动程序的 HwVidFindAdapter 函数必须调用 VideoPortGetDeviceBase 以获取其访问范围的映射逻辑地址。 只有这样,微型端口驱动程序才能与视频适配器通信,方法是将返回的映射逻辑范围地址传递给 VideoPortRead/WritePortXxx 以访问 I/O 空间中的设备内存,或 VideoPortRead/WriteRegisterXxx 访问内存空间中的设备内存。
确定访问范围是否可共享
请遵循以下准则来确定是否可以共享访问范围:- 如果内存或 I/O 端口的范围应由此驱动程序“拥有”,并且/或由任何其他驱动程序访问此范围可能会导致问题,请将 RangeSharable 设置为 FALSE。
- 如果范围可以与协作设备驱动程序共享,请将 RangeSharable 设置为 TRUE。
但是,适用于使用直通 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) |
另请参阅
VideoPortGetRegistryParameters