次の方法で共有


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

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

InIoSpace

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

フラグ 意味
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 キャッシュの詳細については、 ビデオ ミニポート ドライバーでのメモリの書き込みの組み合わせ に関する Web サイトの記事を参照してください。
VIDEO_MEMORY_SPACE_USER_MODE アドレス範囲は、システム空間ではなく、ユーザー モード プロセスの仮想アドレス空間にマップする必要があります。 このフラグは、VIDEO_MEMORY_SPACE_IOが設定されていない場合にのみ意味があります。

VirtualAddress

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

戻り値

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

注釈

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

VideoPortGetDeviceBaseVideoPortMapMemory の両方をビデオ ミニポート ドライバーによって呼び出して、ビデオ メモリを仮想アドレス空間にマップできます。 これらの両方の関数を呼び出して同じ物理アドレスをマップする場合、または 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 オペレーティング システムで使用できます。
対象プラットフォーム デスクトップ
Header video.h (Video.h を含む)
Library Videoprt.lib
[DLL] Videoprt.sys
IRQL PASSIVE_LEVEL

こちらもご覧ください

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory