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_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) 显示设备的每个通用内存体系结构都使用位于main内存而不是 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)
Library Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

另请参阅

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory