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 に渡す
x86 ベースのマシンの VGA 互換ミニポート ドライバーが RangeVisible メンバーを 明示的に TRUE にリセットし、 VideoPortSetTrappedEmulatorPorts を呼び出して 1 つ以上の I/O ポート範囲を有効にしない限り、I/O ポート範囲を記述するすべてのVIDEO_ACCESS_RANGE型配列要素は非表示であると見なされます。 VideoPortSetTrappedEmulatorPorts は 、入力配列の RangeSharable メンバーを無視します。VideoPortSetTrappedEmulatorPorts に渡されるVIDEO_ACCESS_RANGE型要素の配列で、 各要素の RangeVisible メンバーの値は、指定された I/O ポートに VDM (x86 ベースのコンピューター上で全画面表示で実行されている MS-DOS アプリケーション) から直接アクセスできるかどうか、またはそのようなアプリケーションが発行した I/O ストリームをトラップしてミニポート ドライバーが提供する SvgaHwIoPortXxx 関数に最初に転送するかどうかを決定します。
要件
要件 | 値 |
---|---|
Header | video.h (Video.h を含む) |
こちらもご覧ください
VideoPortGetRegistryParameters