Fonction VideoPortMapMemory (video.h)

La fonction VideoPortMapMemory mappe une plage d’adresses physiques relatives de bus de la mémoire vidéo dans l’espace système ou dans l’espace d’adressage virtuel d’un processus en mode utilisateur. Un pilote de miniport vidéo appelle VideoPortMapMemory lorsqu’il gère IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY ou IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES.

Syntaxe

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

Paramètres

HwDeviceExtension

Pointeur vers l’extension de périphérique du pilote miniport.

PhysicalAddress

Adresse de base relative du bus de la plage à mapper.

Length

En entrée, spécifie le nombre d’octets de mémoire vidéo à mapper. À la sortie, reçoit la taille de la mémoire réellement mappée, qui peut être arrondie à une limite d’alignement déterminée par le système. (Toutefois, le miniport et les pilotes d’affichage ne peuvent pas accéder à la mémoire qui se trouve en dehors de la plage délimitée par la valeur d’entrée en longueur.)

InIoSpace

Pointeur vers une variable qui indique l’emplacement de la plage. La variable peut être l’un des indicateurs suivants ou une combinaison compatible ORed de ces indicateurs.

Indicateur Signification
VIDEO_MEMORY_SPACE_DENSE Obsolète.
VIDEO_MEMORY_SPACE_IO La plage d’adresses se trouve dans l’espace d’E/S, et non dans l’espace mémoire.
VIDEO_MEMORY_SPACE_MEMORY La plage d’adresses se trouve dans l’espace mémoire, et non dans l’espace d’E/S.
VIDEO_MEMORY_SPACE_P6CACHE Le processeur agrège une séquence d’opérations d’écriture, les envoie à une ligne de cache, puis vide le cache. Cet indicateur n’est significatif que si VIDEO_MEMORY_SPACE_IO n’est pas défini.
Désigne la mémoire vidéo comme écriture combinée (WC). Pour plus d’informations sur la mise en cache wc, consultez l’article du site web Write-Combining Memory in Video Miniport Drivers .
VIDEO_MEMORY_SPACE_USER_MODE La plage d’adresses doit être mappée dans l’espace d’adressage virtuel d’un processus en mode utilisateur, et non dans l’espace système. Cet indicateur n’est significatif que si VIDEO_MEMORY_SPACE_IO n’est pas défini.

VirtualAddress

Pointeur vers une variable qui, en entrée, est NULL ou un handle vers un processus en mode utilisateur. Si la valeur d’entrée est NULL, cette routine mappe la mémoire vidéo dans l’espace système. Sinon, cette routine mappe la mémoire vidéo dans l’espace d’adressage virtuel du processus en mode utilisateur identifié par le handle. À la sortie, reçoit l’adresse virtuelle de base du mappage.

Valeur retournée

VideoPortMapMemory retourne NO_ERROR s’il a mappé correctement la plage spécifiée ; sinon, il retourne ERROR_INVALID_PARAMETER.

Remarques

VideoPortMapMemory s’exécute en mode noyau dans le même contexte que le thread en mode utilisateur qui a lancé l’appel.

VideoPortGetDeviceBase et VideoPortMapMemory peuvent tous deux être appelés par le pilote de miniport vidéo pour mapper la mémoire vidéo dans un espace d’adressage virtuel. Si vous appelez ces deux fonctions pour mapper les mêmes adresses physiques, ou si vous appelez l’une des fonctions plusieurs fois pour mapper les mêmes adresses physiques, vous pouvez avoir plusieurs plages d’adresses virtuelles qui correspondent à la même plage d’adresses physiques. Dans ce cas, vous devez définir l’indicateur VIDEO_MEMORY_SPACE_P6CACHE du paramètre InIoSpace sur la même valeur dans tous ces appels.

Chaque périphérique d’affichage de l’architecture de mémoire universelle (UMA) utilise une mémoire tampon d’image qui se trouve dans main mémoire plutôt que dans un bus PCI. Dans ce cas, n’appelez pas VideoPortMapMemory pour mapper la mémoire tampon d’image. Pour mapper une mémoire tampon de trame UMA dans l’espace système, appelez MmMapIoSpace. Pour mapper une mémoire tampon de trame UMA dans l’espace d’adressage virtuel d’un processus en mode utilisateur, effectuez les étapes suivantes :

  1. Appelez ZwOpenSection pour obtenir un handle de l’objet de section de mémoire physique du système d’exploitation, qui est nommé \Device\PhysicalMemory.
  2. Appelez ZwMapViewOfSection pour mapper une vue de la mémoire tampon de trame dans l’espace d’adressage virtuel du processus actuel.
L’exemple suivant montre comment mapper une mémoire tampon de trame UMA dans l’espace d’adressage virtuel du processus actuel.
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);
}

Les pilotes miniport doivent utiliser VideoPortMapMemory pour gérer les cartes vidéo qui permettent à la mémoire tampon d’images vidéo d’être entièrement mappée à tout moment. Autrement dit, les pilotes miniport pour les adaptateurs qui ne sont pas limités à l’utilisation de banques pour mapper une tranche à la fois peuvent utiliser le VideoPortMapMemory plus efficace.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible dans Windows 2000 et versions ultérieures des systèmes d’exploitation Windows.
Plateforme cible Desktop (Expérience utilisateur)
En-tête video.h (inclure Video.h)
Bibliothèque Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

Voir aussi

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory