次の方法で共有


VideoPortMapMemory 関数 (video.h)

VideoPortMapMemory 関数は、ビデオ メモリのバス相対物理アドレスの範囲をシステム空間またはユーザー モード プロセスの仮想アドレス空間にマップします。 ビデオ ミニポート ドライバーは、IOCTL_VIDEO_MAP_VIDEO_MEMORY、IOCTL_VIDEO_SHARE_VIDEO_MEMORY、またはIOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGESを処理するときに VideoPortMapMemory 呼び出します。

構文

VIDEOPORT_DEPRECATED VIDEOPORT_API VP_STATUS VideoPortMapMemory(
  PVOID            HwDeviceExtension,
  PHYSICAL_ADDRESS PhysicalAddress,
  PULONG           Length,
  PULONG           InIoSpace,
  PVOID            *VirtualAddress
);

パラメーター

HwDeviceExtension

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

PhysicalAddress

マップする範囲のバス相対ベース アドレス。

Length

入力時に、マップするビデオ メモリのバイト数を指定します。 出力時に、実際にマップされたメモリのサイズを受け取ります。これは、システムによって決定された配置境界に丸められる可能性があります。 (ただし、ミニポート ドライバーとディスプレイ ドライバーは、の入力値で区切られた範囲外のメモリにアクセスできません。

InIoSpace

範囲の場所を示す変数へのポインター。 変数には、次のいずれかのフラグ、またはこれらのフラグの互換性のある ORed の組み合わせを指定できます。

フラグの 意味
VIDEO_MEMORY_SPACE_DENSE 廃れた。
VIDEO_MEMORY_SPACE_IO アドレス範囲は、メモリ領域ではなく I/O 領域にあります。
VIDEO_MEMORY_SPACE_MEMORY アドレス範囲は、I/O 領域ではなくメモリ領域にあります。
VIDEO_MEMORY_SPACE_P6CACHE プロセッサは一連の書き込み操作を集計し、キャッシュ ラインに送信し、後でキャッシュをフラッシュします。 このフラグは、VIDEO_MEMORY_SPACE_IOが設定されていない場合にのみ意味があります。
ビデオ メモリを書き込み結合 (WC) として指定します。 WC キャッシュの詳細については、ビデオ ミニポート ドライバーの Write-Combining メモリ Web サイトの記事を参照してください。
VIDEO_MEMORY_SPACE_USER_MODE アドレス範囲は、システム空間ではなく、ユーザー モード プロセスの仮想アドレス空間にマップする必要があります。 このフラグは、VIDEO_MEMORY_SPACE_IOが設定されていない場合にのみ意味があります。

VirtualAddress

入力時に NULL またはユーザー モード プロセスへのハンドル 変数へのポインター。 入力値が NULL 場合、このルーチンはビデオ メモリをシステム空間にマップします。 それ以外の場合、このルーチンは、ビデオ メモリを、ハンドルによって識別されるユーザー モード プロセスの仮想アドレス空間にマップします。 出力時に、マッピングの基本仮想アドレスを受け取ります。

戻り値

VideoPortMapMemory は、指定した範囲が正常にマップされた場合にNO_ERRORを返します。それ以外の場合は、ERROR_INVALID_PARAMETERを返します。

備考

VideoPortMapMemory は、呼び出しを開始したユーザー モード スレッドと同じコンテキスト内でカーネル モードで実行されます。

VideoPortGetDeviceBase と VideoPortMapMemory 、ビデオ ミニポート ドライバーがビデオ メモリを仮想アドレス空間にマップするために呼び出すことができます。 これらの両方の関数を呼び出して同じ物理アドレスをマップする場合、または 1 つの関数を複数回呼び出して同じ物理アドレスをマップする場合は、同じ物理アドレス範囲にマップされる複数の仮想アドレス範囲が存在する可能性があります。 その場合は、InIoSpace パラメーターのVIDEO_MEMORY_SPACE_P6CACHE フラグを、すべての呼び出しで同じ値に設定する必要があります。

すべてのユニバーサル メモリ アーキテクチャ (UMA) ディスプレイ デバイスは、PCI バスではなく、メイン メモリに配置されているフレーム バッファーを使用します。 この場合、フレーム バッファー マップするために VideoPortMapMemory を呼び出さないでください。 UMA フレーム バッファーをシステム空間にマップするには、mmMapIoSpace 呼び出します。 UMA フレーム バッファーをユーザー モード プロセスの仮想アドレス空間にマップするには、次の手順を実行します。

  1. ZwOpenSection を呼び出して、オペレーティング システムの物理メモリ セクション オブジェクトへのハンドルを取得します。このオブジェクトは、\Device\PhysicalMemory という名前です。
  2. ZwMapViewOfSection 呼び出して、フレーム バッファーのビューを現在のプロセスの仮想アドレス空間にマップします。
次の例は、UMA フレーム バッファーを現在のプロセスの仮想アドレス空間にマップする方法を示しています。
UNICODE_STRING    UnicodeString;          // Name of the section object
OBJECT_ATTRIBUTES ObjectAttributes;       // Description for the section object
HANDLE            hPhysicalMemoryHandle;  // Handle to the section object
PHYSICAL_ADDRESS  MappedLength;           // Length of the frame buffer

PHYSICAL_ADDRESS  MappedBase;             // Base physical address (CPU-relative)
                                          // of the frame buffer

// Allocate a variable to receive the base virtual address of the view.
// Set it to NULL for input to ZwMapViewOfSection, to specify that the memory
// manager (rather than the caller) should determine the base virtual address.
PVOID pViewBase = NULL;

RtlInitUnicodeString(&UnicodeString, L"\\Device\\PhysicalMemory");

InitializeObjectAttributes(
   &ObjectAttributes,
   &UnicodeString,
   OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
   (HANDLE) NULL,
   (PSECURITY_DESCRIPTOR) NULL);

// Open a handle to the physical-memory section object.
ntStatus = ZwOpenSection(&hPhysicalMemoryHandle, SECTION_ALL_ACCESS, &ObjectAttributes);

if(NT_SUCCESS(ntStatus))
{
   ntStatus = ZwMapViewOfSection(
      hPhysicalMemoryHandle,
      NtCurrentProcess(),
      &pViewBase,
      0L,
      (ULONG_PTR)MappedLength.QuadPart,
      &MappedBase,
      (PULONG_PTR)(&(MappedLength.QuadPart)),
      ViewUnmap,
      0,
      PAGE_READWRITE | PAGE_WRITECOMBINE);

   if(NT_SUCCESS(ntStatus))
   {
      // pViewBase holds the base virtual address of the view.
   }

   // Close the handle to the physical-memory section object.
   ZwClose(hPhysicalMemoryHandle);
}

ミニポート ドライバー VideoPortMapMemory を使用して、ビデオ フレーム バッファー を常に完全にマップできるようにするビデオ アダプターを管理する必要があります。 つまり、一度にスライスをマップする バンクを使用するように制限されていないアダプターのミニポート ドライバーは、VideoPortMapMemory のより効率的なを使用できます。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 以降のバージョンの Windows オペレーティング システムで使用できます。
ターゲット プラットフォーム デスクトップ
ヘッダー video.h (Video.h を含む)
ライブラリ Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

関連項目

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory