次の方法で共有


VideoPortSetTrappedEmulatorPorts 関数 (video.h)

VGA 互換 (SVGA) ミニポート ドライバーは 、VideoPortSetTrappedEmulatorPorts 関数を呼び出して、x86 ベースのコンピューターで VDM (ビデオ ディスプレイ モニター) が全画面表示モードで実行されたときにトラップされる I/O ポートの一覧を動的に変更します。

構文

VIDEOPORT_DEPRECATED VIDEOPORT_API VP_STATUS VideoPortSetTrappedEmulatorPorts(
       PVOID               HwDeviceExtension,
       ULONG               NumAccessRanges,
  [in] PVIDEO_ACCESS_RANGE AccessRange
);

パラメーター

HwDeviceExtension

ミニポート ドライバーのデバイス拡張機能へのポインター。

NumAccessRanges

AccessRange 配列内の要素の数を指定します。

[in] AccessRange

VIDEO_ACCESS_RANGE要素の配列へのポインター。 各要素は、ミニポート ドライバーがVIDEO_PORT_CONFIG_INFOで設定する EmulatorAccessEntries の適切なサブ範囲を記述します。 AccessRange 要素の RangeVisible メンバーを TRUE に設定すると、全画面表示 MS-DOS アプリケーションによって I/O ポート範囲に直接アクセスできます。 RangeVisible メンバーを FALSE に設定すると、アプリケーションが発行した INsINSB/INSW/INSDOUTs、OUTSB/OUTSW/OUTSDs が、その範囲にトラップされ、検証のために対応するミニポート ドライバー SvgaHwIoPortXxx 関数に転送されます。

VideoPortSetTrappedEmulatorPorts に渡される AccessRange 配列は、VIDEO_PORT_CONFIG_INFO構造体の EmulatorAccessEntries 配列で HwVidFindAdapter 関数が設定した I/O ポート範囲の適切なサブセットである必要があります。 EmulatorAccessEntries 配列に含まれていないアクセス範囲配列内の I/O ポート範囲はすべてトラップされ、ユーザー モード VDD に反映されます。

戻り値

VideoPortSetTrappedEmulatorPorts は 、トラップされたポートが正常に変更された場合にNO_ERRORを返します。 それ以外の場合は、ERROR_INVALID_PARAMETERを返します。

注釈

既定では、全画面表示 MS-DOS アプリケーションが直接アクセスできる I/O ポートの AccessRange には、VIDEO_PORT_CONFIG_INFO構造体の EmulatorAccessEntries 配列にも対応する要素を含む I/O ポート範囲を記述するアクセス範囲配列要素は含まれます。 つまり、対応するエミュレーター アクセス エントリを含む I/O ポート範囲は、既定ではミニポート ドライバーの SvgaHwIoPortXxx 関数にフックされるため、アプリケーションが発行した命令は検証のために SvgaHwIoPortXxx 関数に転送されます。

VGA 互換の SVGA ミニポート ドライバーは、 VideoPortSetTrappedEmulatorPorts の呼び出しを使用して、必要に応じて I/O ポートの範囲を有効または無効にすることができます。 有効なポート範囲を使用すると、アプリケーションが発行したアセンブリ命令をトラップし、最初に検証のためにミニポート ドライバーの SvgaHwIoPortXxx 関数に転送することなく、全画面表示の MS-DOS アプリケーションがこれらの I/O ポートに直接アクセスできます。 このようなアプリケーションの直接 I/O ポート アクセスにより、ユーザーはビデオ I/O 応答時間を短縮できます。

VideoPortSetTrappedEmulatorPorts は、最初の要素から最後の要素までの AccessRange パラメーター配列をスキャンし、各要素の指示に応じて I/O ポートを有効または無効にします。 ミニポート ドライバーに RangeVisible メンバーが FALSE に設定されている同じ範囲の重複する説明が含まれている場合、有効なポートの範囲 (RangeVisible メンバーが TRUE に設定されている) を同じ呼び出しで再度無効にできることに注意してください。 また、ミニポート ドライバーは 、AccessRange 配列の初期要素で幅広い I/O ポートを有効にし、 VideoPortSetTrappedEmulatorPorts を呼び出すときに後続の配列要素のポートのサブ範囲を選択的に無効にできることにも注意してください。

すべての全画面 MS-DOS アプリケーションは、x86 ベースのマシンで同じ IOPM (I/O アクセス許可マップ) を使用するため、同じ有効または無効な I/O ポートのセットを使用します。 このような全画面表示アプリケーションに切り替えるたびに、VGA 互換ミニポート ドライバーの HwVidStartIO 関数が、IOCTL_VIDEO_ENABLE_VDM VRP で呼び出されます。 その後、ミニポート ドライバーは、 EmulatorAccessEntries 配列内の任意のポートを含めることができる、直接アクセス可能な I/O ポートの既定のセットを再初期化する必要があります。

x86 ベースのマシン上の全画面 MS-DOS アプリケーションにビデオ ポートへの直接アクセスを提供すると、アプリケーションによって開始されるビデオ操作が高速になりますが、VGA と互換性のあるすべての SVGA ミニポート ドライバーは、このようなアプリケーションがマシンをハングさせないように、重要な I/O ポートのサブセットをトラップし続ける必要があります。 特に、このようなミニポート ドライバーは 、常に VGA 互換アダプター シーケンサーとその他の出力レジスタにアプリケーションの I/O をトラップする必要があります。 このようなミニポート ドライバーもトラップし、I/O ポートのアダプターに依存する追加のサブセットに対してマシンがハングする可能性があるアプリケーションによって発行された直接 I/O を検証する必要があります。

VideoPortSetTrappedEmulatorPorts をもう一度呼び出し、AccessRange 要素の RangeVisible メンバーを FALSE にリセットすると、その範囲のアプリケーションによって発行された命令が、対応するミニポート ドライバー SvgaHwIoPortXxx 関数に転送されます。

要件

要件
サポートされている最小のクライアント Windows 2000 以降のバージョンの Windows オペレーティング システムで使用できます。
対象プラットフォーム デスクトップ
Header video.h (Video.h を含む)
Library Videoprt.lib
[DLL] Videoprt.sys
IRQL PASSIVE_LEVEL

こちらもご覧ください

EMULATOR_ACCESS_ENTRY

HwVidFindAdapter

HwVidStartIO

VIDEO_ACCESS_RANGE

VIDEO_PORT_CONFIG_INFO

VideoPortSynchronizeExecution