Share via


Função VideoPortMapMemory (video.h)

A função VideoPortMapMemory mapeia um intervalo de endereços físicos relativos ao barramento de memória de vídeo para o espaço do sistema ou para o espaço de endereço virtual de um processo de modo de usuário. Um driver de miniporto de vídeo chama VideoPortMapMemory quando lida com IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY ou IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES.

Sintaxe

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

Parâmetros

HwDeviceExtension

Ponteiro para a extensão de dispositivo do driver de miniport.

PhysicalAddress

O endereço base relativo ao barramento do intervalo a ser mapeado.

Length

Na entrada, especifica o número de bytes de memória de vídeo a serem mapeados. Na saída, recebe o tamanho da memória realmente mapeada, que pode ser arredondada para um limite de alinhamento determinado pelo sistema. (No entanto, os drivers de miniporto e de exibição não podem acessar nenhuma memória que esteja fora do intervalo delimitado pelo valor de entrada em Length.)

InIoSpace

Ponteiro para uma variável que indica o local do intervalo. A variável pode ser um dos sinalizadores a seguir ou uma combinação compatível com ORed desses sinalizadores.

Sinalizador Significado
VIDEO_MEMORY_SPACE_DENSE Obsoleto.
VIDEO_MEMORY_SPACE_IO O intervalo de endereços está no espaço de E/S, não no espaço de memória.
VIDEO_MEMORY_SPACE_MEMORY O intervalo de endereços está no espaço de memória, não no espaço de E/S.
VIDEO_MEMORY_SPACE_P6CACHE O processador agrega uma sequência de operações de gravação, as envia para uma linha de cache e, posteriormente, libera o cache. Esse sinalizador só será significativo se VIDEO_MEMORY_SPACE_IO não estiver definido.
Designa a memória de vídeo como WC (combinação de gravação). Para obter informações sobre o cache do WC, consulte o artigo Memória de combinação de gravação no site drivers de miniporto de vídeo .
VIDEO_MEMORY_SPACE_USER_MODE O intervalo de endereços deve ser mapeado para o espaço de endereço virtual de um processo de modo de usuário, não para o espaço do sistema. Esse sinalizador só será significativo se VIDEO_MEMORY_SPACE_IO não estiver definido.

VirtualAddress

Ponteiro para uma variável que, na entrada, é NULL ou um identificador para um processo de modo de usuário. Se o valor de entrada for NULL, essa rotina mapeará a memória do vídeo para o espaço do sistema. Caso contrário, essa rotina mapeia a memória de vídeo para o espaço de endereço virtual do processo de modo de usuário identificado pelo identificador. Na saída, recebe o endereço virtual base do mapeamento.

Retornar valor

VideoPortMapMemory retornará NO_ERROR se tiver mapeado com êxito o intervalo especificado; caso contrário, retornará ERROR_INVALID_PARAMETER.

Comentários

VideoPortMapMemory é executado no modo kernel no mesmo contexto que o thread do modo de usuário que iniciou a chamada.

VideoPortGetDeviceBase e VideoPortMapMemory podem ser chamados pelo driver de miniporto de vídeo para mapear a memória de vídeo para um espaço de endereço virtual. Se você chamar essas duas funções para mapear os mesmos endereços físicos ou se chamar uma das funções mais de uma vez para mapear os mesmos endereços físicos, poderá ter mais de um intervalo de endereços virtuais mapeado para o mesmo intervalo de endereços físicos. Nesse caso, você deve definir o sinalizador VIDEO_MEMORY_SPACE_P6CACHE do parâmetro InIoSpace com o mesmo valor em todas essas chamadas.

Cada dispositivo de exibição uma (arquitetura de memória universal) usa um buffer de quadro localizado em main memória em vez de em um barramento PCI. Nesse caso, não chame VideoPortMapMemory para mapear o buffer de quadros. Para mapear um buffer de quadro UMA para o espaço do sistema, chame MmMapIoSpace. Para mapear um buffer de quadro UMA para o espaço de endereço virtual de um processo de modo de usuário, execute as seguintes etapas:

  1. Chame ZwOpenSection para obter um identificador para o objeto de seção de memória física do sistema operacional, que é chamado \Device\PhysicalMemory.
  2. Chame ZwMapViewOfSection para mapear uma exibição do buffer de quadro para o espaço de endereço virtual do processo atual.
O exemplo a seguir mostra como mapear um buffer de quadro UMA para o espaço de endereço virtual do processo atual.
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);
}

Os drivers de miniport devem usar VideoPortMapMemory para gerenciar adaptadores de vídeo que permitem que o buffer de quadro de vídeo seja completamente mapeado o tempo todo. Ou seja, os drivers de miniport para adaptadores que não estão restritos ao uso de bancos para mapear uma fatia de cada vez podem usar o VideoPortMapMemory mais eficiente.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível no Windows 2000 e versões posteriores dos sistemas operacionais Windows.
Plataforma de Destino Área de Trabalho
Cabeçalho video.h (inclua Video.h)
Biblioteca Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

Confira também

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory