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 :
- 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.
- Appelez ZwMapViewOfSection pour mapper une vue de la mémoire tampon de trame 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 |