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


Функция 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 см. в статье о Write-Combining памяти в драйверах видео минипорта веб-сайте.
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) использует буфер кадров, расположенный в основной памяти, а не на шине 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 (include Video.h)
библиотеки Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

См. также

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory