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 함수 또는 VideoPortGetRegistryParameters를 미니포트 드라이버 제공 HwVidQueryNamedValueCallback 함수와 함께 VideoPortGetDeviceData를 호출하여 레지스트리에서 검색된 정보를 사용할 수 있습니다. 이러한 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 포트의 범위를 이 드라이버가 "소유"해야 하고 다른 드라이버가 이 범위에 액세스하면 문제가 발생할 수 있는 경우 RangeSharableFALSE로 설정합니다.
  • 범위를 협력 디바이스 드라이버와 공유할 수 있는 경우 RangeSharableTRUE로 설정합니다.
모든 VGA 기능을 구현하는 SVGA 미니포트 드라이버(레지스트리에서 VgaCompatible 로 1로 선언됨)는 시스템 VGA 드라이버가 로드되지 않도록 해당 액세스 범위를 공유할 수 없음으로 주장해야 합니다. 반면에 레지스트리에서 VgaCompatible 을 0으로 설정한 S3 또는 XGA와 같은 어댑터용 미니포트 드라이버는 시스템 VGA 드라이버와 공유하는 모든 리소스를 공유 가능으로 클레임해야 합니다.

그러나 통과 IOCTL로 작동하고 모든 VGA 또는 SVGA 카드 연결할 수 있는 카드용 미니포트 드라이버는 시스템 VGA 포트 또는 메모리 범위를 사용하지 않아야 합니다. 이 경우 이러한 드라이버는 레지스트리에서 VGA 액세스 범위를 클레임하려고 시도해서는 안 됩니다. 이러한 미니포트 드라이버에서 VGA 리소스를 클레임하려는 시도는 컴퓨터의 모든 SVGA 카드 드라이버가 이러한 액세스 범위를 공유할 수 없다고 주장했기 때문에 리소스 충돌을 일으킬 수 있습니다.

VideoPortSetTrappedEmulatorPorts에 I/O 포트 범위 요소 전달

x86 기반 컴퓨터의 VGA 호환 미니포트 드라이버가 RangeVisible 멤버를 TRUE 로 명시적으로 다시 설정하고 VideoPortSetTrappedEmulatorPorts 를 호출하여 하나 이상의 I/O 포트 범위를 사용하도록 설정하지 않는 한 I/O 포트 범위를 설명하는 모든 VIDEO_ACCESS_RANGE 형식 배열 요소는 보이지 않는 것으로 간주됩니다. VideoPortSetTrappedEmulatorPorts는 입력 배열의 RangeSharable 멤버를 무시합니다.

VideoPortSetTrappedEmulatorPorts에 전달된 VIDEO_ACCESS_RANGE 형식 요소의 배열에서 각 요소의 RangeVisible 멤버 값은 VDM(x86 기반 컴퓨터의 전체 화면에서 실행되는 MS-DOS 애플리케이션)에서 지정된 I/O 포트에 직접 액세스할 수 있는지 또는 이러한 애플리케이션에서 발급한 I/O 스트림이 먼저 유효성 검사를 위해 미니포트 드라이버 제공 SvgaHwIoPortXxx 함수에 트래핑되어 전달되는지 여부를 결정합니다.

요구 사항

요구 사항
헤더 video.h(Video.h 포함)

추가 정보

비디오 미니포트 드라이버의 DriverEntry

EMULATOR_ACCESS_ENTRY

HwVidFindAdapter

HwVidQueryDeviceCallback

HwVidQueryNamedValueCallback

VIDEO_HW_INITIALIZATION_DATA

VideoPortGetAccessRanges

VideoPortGetDeviceBase

VideoPortGetDeviceData

VideoPortGetRegistryParameters

VideoPortInitialize

VideoPortSetTrappedEmulatorPorts

VideoPortVerifyAccessRanges