Funzione VideoPortMapMemory (video.h)

La funzione VideoPortMapMemory esegue il mapping di un intervallo di indirizzi fisici relativi al bus di memoria video nello spazio di sistema o nello spazio indirizzi virtuale di un processo in modalità utente. Un driver miniport video chiama VideoPortMapMemory quando gestisce IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY o IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES.

Sintassi

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

Parametri

HwDeviceExtension

Puntatore all'estensione del dispositivo del driver miniport.

PhysicalAddress

Indirizzo di base relativo al bus dell'intervallo da mappare.

Length

In input specifica il numero di byte di memoria video da mappare. Nell'output riceve le dimensioni della memoria effettivamente mappate, che potrebbero essere arrotondate a un limite di allineamento determinato dal sistema. Tuttavia, i driver miniport e display non possono accedere a qualsiasi memoria esterna all'intervallo delimitato dal valore di input in Lunghezza.

InIoSpace

Puntatore a una variabile che indica la posizione dell'intervallo. La variabile può essere uno dei flag seguenti o una combinazione compatibile con ORed di questi flag.

Bandiera Significato
VIDEO_MEMORY_SPACE_DENSE Obsoleta.
VIDEO_MEMORY_SPACE_IO L'intervallo di indirizzi è nello spazio di I/O, non nello spazio di memoria.
VIDEO_MEMORY_SPACE_MEMORY L'intervallo di indirizzi è nello spazio di memoria, non nello spazio di I/O.
VIDEO_MEMORY_SPACE_P6CACHE Il processore aggrega una sequenza di operazioni di scrittura, li invia a una riga della cache e successivamente scarica la cache. Questo flag è significativo solo se VIDEO_MEMORY_SPACE_IO non è impostato.
Designa la memoria video come combinazione di scrittura (WC). Per informazioni sulla memorizzazione nella cache WC, vedere l'articolo Relativo alla combinazione di memoria in Video Miniport Driver .
VIDEO_MEMORY_SPACE_USER_MODE L'intervallo di indirizzi deve essere mappato nello spazio indirizzi virtuale di un processo in modalità utente, non nello spazio di sistema. Questo flag è significativo solo se VIDEO_MEMORY_SPACE_IO non è impostato.

VirtualAddress

Puntatore a una variabile che, in input, è NULL o un handle per un processo in modalità utente. Se il valore di input è NULL, questa routine esegue il mapping della memoria video nello spazio di sistema. In caso contrario, questa routine esegue il mapping della memoria video nello spazio indirizzi virtuale del processo in modalità utente identificato dall'handle. Nell'output riceve l'indirizzo virtuale di base del mapping.

Valore restituito

VideoPortMapMemory restituisce NO_ERROR se ha eseguito correttamente il mapping dell'intervallo specificato; in caso contrario, restituisce ERROR_INVALID_PARAMETER.

Commenti

VideoPortMapMemory viene eseguito in modalità kernel nello stesso contesto del thread in modalità utente che ha avviato la chiamata.

VideoPortGetDeviceBase e VideoPortMapMemory possono essere chiamati dal driver video miniport per eseguire il mapping della memoria video in uno spazio indirizzi virtuale. Se si chiamano entrambe queste funzioni per eseguire il mapping degli stessi indirizzi fisici o se si chiama una delle funzioni più di una volta per eseguire il mapping degli stessi indirizzi fisici, potrebbe essere presente più di un intervallo di indirizzi virtuali che esegue il mapping allo stesso intervallo di indirizzi fisici. In tal caso, è necessario impostare il flag VIDEO_MEMORY_SPACE_P6CACHE del parametro InIoSpace sullo stesso valore in tutte le chiamate.

Ogni dispositivo di visualizzazione UMA (Universal Memory Architecture) usa un buffer frame che si trova nella memoria principale anziché in un bus PCI. In questo caso, non chiamare VideoPortMapMemory per eseguire il mapping del buffer del frame. Per eseguire il mapping di un buffer frame UMA nello spazio di sistema, chiamare MmMapIoSpace. Per eseguire il mapping di un buffer frame UMA nello spazio indirizzi virtuale di un processo in modalità utente, seguire questa procedura:

  1. Chiamare ZwOpenSection per ottenere un handle all'oggetto sezione di memoria fisica del sistema operativo, denominato \Device\PhysicalMemory.
  2. Chiamare ZwMapViewOfSection per eseguire il mapping di una visualizzazione del buffer del frame nello spazio indirizzi virtuale del processo corrente.
Nell'esempio seguente viene illustrato come eseguire il mapping di un buffer frame UMA nello spazio indirizzi virtuale del processo corrente.
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);
}

I driver miniport devono usare VideoPortMapMemory per gestire schede video che consentono il mapping completo del buffer dei fotogrammi video in ogni momento. Vale a dire, i driver miniport per gli adattatori che non sono limitati all'uso delle banche per mappare una sezione alla volta possono usare videoPortMapMemory più efficiente.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Windows 2000 e versioni successive dei sistemi operativi Windows.
Piattaforma di destinazione Desktop
Intestazione video.h (includere Video.h)
Libreria Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

Vedi anche

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory