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

指出範圍位置的變數指標。 變數可以是下列其中一個旗標,或是這些旗標的 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 快取的相關信息,請參閱 Video Miniport Drivers 網站中的寫入合併記憶體 一文。
VIDEO_MEMORY_SPACE_USER_MODE 位址範圍應該對應至使用者模式進程的虛擬位址空間,而不是對應至系統空間。 只有在未設定VIDEO_MEMORY_SPACE_IO時,此旗標才有意義。

VirtualAddress

輸入上的變數指標為 NULL 或使用者模式進程的句柄。 如果輸入值為 NULL,此例程會將視訊記憶體對應至系統空間。 否則,此例程會將視訊記憶體對應至句柄所識別之使用者模式進程的虛擬位址空間。 在輸出中,接收對應的基底虛擬位址。

傳回值

VideoPortMapMemory 如果已成功對應指定的範圍,則會傳回NO_ERROR;否則會傳回ERROR_INVALID_PARAMETER。

備註

VideoPortMapMemory 會在與起始呼叫的使用者模式線程相同的內容中,以核心模式執行。

VideoPortGetDeviceBaseVideoPortMapMemory 可由視訊迷你埠驅動程式呼叫,以將視訊記憶體對應到虛擬地址空間。 如果您呼叫這兩個函式來對應相同的實體位址,或多次呼叫其中一個函式來對應相同的實體位址,您可能有多個虛擬位址範圍對應至相同的實體地址範圍。 在此情況下,您必須將所有呼叫中的 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