Compartir a través de


Función VideoPortMapMemory (video.h)

La función VideoPortMapMemory asigna un intervalo de direcciones físicas relativas al bus de la memoria de vídeo en el espacio del sistema o en el espacio de direcciones virtuales de un proceso en modo de usuario. Un controlador de minipuerto de vídeo llama a VideoPortMapMemory cuando controla IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY o IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES.

Sintaxis

VIDEOPORT_DEPRECATED VIDEOPORT_API VP_STATUS VideoPortMapMemory(
  PVOID            HwDeviceExtension,
  PHYSICAL_ADDRESS PhysicalAddress,
  PULONG           Length,
  PULONG           InIoSpace,
  PVOID            *VirtualAddress
);

Parámetros

HwDeviceExtension

Puntero a la extensión del dispositivo del controlador de minipuerto.

PhysicalAddress

Dirección base relativa al bus del intervalo que se va a asignar.

Length

En la entrada, especifica el número de bytes de memoria de vídeo que se van a asignar. En la salida, recibe el tamaño de la memoria asignada realmente, que podría redondearse a un límite de alineación determinado por el sistema. (Sin embargo, los controladores de minipuerto y visualización no pueden tener acceso a ninguna memoria que esté fuera del intervalo delimitado por el valor de entrada en Length).

InIoSpace

Puntero a una variable que indica la ubicación del intervalo. La variable puede ser una de las marcas siguientes o una combinación compatible con ORed de estas marcas.

Marcar Significado
VIDEO_MEMORY_SPACE_DENSE Obsoleto.
VIDEO_MEMORY_SPACE_IO El intervalo de direcciones está en el espacio de E/S, no en el espacio de memoria.
VIDEO_MEMORY_SPACE_MEMORY El intervalo de direcciones está en espacio de memoria, no en el espacio de E/S.
VIDEO_MEMORY_SPACE_P6CACHE El procesador agrega una secuencia de operaciones de escritura, las envía a una línea de caché y, posteriormente, vacía la memoria caché. Esta marca solo es significativa si no se establece VIDEO_MEMORY_SPACE_IO.
Designa la memoria de vídeo como combinada de escritura (WC). Para obtener información sobre el almacenamiento en caché de WC, consulte el artículo Sobre la combinación de memoria en el sitio web controladores de miniportador de vídeo .
VIDEO_MEMORY_SPACE_USER_MODE El intervalo de direcciones debe asignarse al espacio de direcciones virtual de un proceso en modo de usuario, no al espacio del sistema. Esta marca solo es significativa si no se establece VIDEO_MEMORY_SPACE_IO.

VirtualAddress

Puntero a una variable que, en la entrada, es NULL o un identificador para un proceso en modo de usuario. Si el valor de entrada es NULL, esta rutina asigna la memoria de vídeo al espacio del sistema. De lo contrario, esta rutina asigna la memoria de vídeo al espacio de direcciones virtuales del proceso en modo de usuario identificado por el identificador. En la salida, recibe la dirección virtual base de la asignación.

Valor devuelto

VideoPortMapMemory devuelve NO_ERROR si ha asignado correctamente el intervalo especificado; de lo contrario, devuelve ERROR_INVALID_PARAMETER.

Comentarios

VideoPortMapMemory se ejecuta en modo kernel en el mismo contexto que el subproceso en modo de usuario que inició la llamada.

VideoPortGetDeviceBase y VideoPortMapMemory pueden llamarlo el controlador de miniporte de vídeo para asignar la memoria de vídeo a un espacio de direcciones virtual. Si llama a ambas funciones para asignar las mismas direcciones físicas, o si llama a una de las funciones más de una vez para asignar las mismas direcciones físicas, es posible que tenga más de un intervalo de direcciones virtuales que se asigne al mismo intervalo de direcciones físicas. En ese caso, debe establecer la marca VIDEO_MEMORY_SPACE_P6CACHE del parámetro InIoSpace en el mismo valor en todas esas llamadas.

Cada dispositivo de visualización de arquitectura de memoria universal (UMA) usa un búfer de fotogramas que se encuentra en la memoria principal en lugar de en un bus PCI. En este caso, no llame a VideoPortMapMemory para asignar el búfer de fotogramas. Para asignar un búfer de fotogramas de UMA al espacio del sistema, llame a MmMapIoSpace. Para asignar un búfer de fotogramas de UMA al espacio de direcciones virtuales de un proceso en modo de usuario, realice los pasos siguientes:

  1. Llame a ZwOpenSection para obtener un identificador del objeto de sección memoria física del sistema operativo, denominado \Device\PhysicalMemory.
  2. Llame a ZwMapViewOfSection para asignar una vista del búfer de fotogramas al espacio de direcciones virtuales del proceso actual.
En el ejemplo siguiente se muestra cómo asignar un búfer de fotogramas de UMA al espacio de direcciones virtuales del proceso actual.
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);
}

Los controladores de minipuerto deben usar VideoPortMapMemory para administrar adaptadores de vídeo que permiten asignar completamente el búfer de fotogramas de vídeo en todo momento. Es decir, los controladores de minipuerto para adaptadores que no están restringidos al uso de bancos para asignar un segmento a la vez pueden usar el VideoPortMapMemory más eficaz.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows 2000 y versiones posteriores de los sistemas operativos Windows.
Plataforma de destino Escritorio
Encabezado video.h (incluir Video.h)
Library Videoprt.lib
Archivo DLL Videoprt.sys
IRQL PASSIVE_LEVEL

Consulte también

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory