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:
- Llame a ZwOpenSection para obtener un identificador del objeto de sección memoria física del sistema operativo, denominado \Device\PhysicalMemory.
- Llame a ZwMapViewOfSection para asignar una vista del búfer de fotogramas 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 |