Функция 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 см. в статье Запись и объединение памяти в драйверах видео минипорта . | |
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) использует буфер кадров, расположенный в main памяти, а не в шине PCI. В этом случае не вызывайте VideoPortMapMemory для сопоставления буфера кадров. Чтобы сопоставить буфер кадров UMA с системным пространством, вызовите MmMapIoSpace. Чтобы сопоставить буфер кадров UMA с виртуальным адресным пространством процесса пользовательского режима, выполните следующие действия.
- Вызовите ZwOpenSection , чтобы получить дескриптор объекта раздела физической памяти операционной системы с именем \Device\PhysicalMemory.
- Вызовите ZwMapViewOfSection , чтобы сопоставить представление буфера кадров с виртуальным адресным пространством текущего процесса.
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 (включить Video.h) |
Библиотека | Videoprt.lib |
DLL | Videoprt.sys |
IRQL | PASSIVE_LEVEL |