Поделиться через


Функция VideoPortMapMemory (video.h)

Функция VideoPortMapMemory сопоставляет диапазон физических адресов видеопамять относительно шины в системном пространстве или в виртуальном адресном пространстве процесса пользовательского режима. Драйвер видео-минипорта вызывает VideoPortMapMemory при обработке IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY или IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES.

Синтаксис

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 Диапазон адресов находится в пространстве ввода-вывода, а не в пространстве памяти.
VIDEO_MEMORY_SPACE_MEMORY Диапазон адресов находится в памяти, а не в пространстве ввода-вывода.
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 выполняется в режиме ядра в том же контексте, что и поток пользовательского режима, который инициировал вызов.

Драйвер видеопорта может вызывать VideoPortGetDeviceBase и VideoPortMapMemory для сопоставления видеопамяти с виртуальным адресным пространством. Если вы вызываете обе эти функции для сопоставления одних и того же физических адресов или если вы вызываете одну из функций несколько раз для сопоставления одних и того же физического адреса, возможно, у вас есть несколько диапазонов виртуальных адресов, которые сопоставляют один и тот же диапазон физических адресов. В этом случае необходимо задать для флага VIDEO_MEMORY_SPACE_P6CACHE параметра InIoSpace одинаковое значение во всех этих вызовах.

Каждое устройство отображения универсальной архитектуры памяти (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)
Библиотека Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

См. также раздел

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory