Share via


VideoPortMapMemory-Funktion (video.h)

Die VideoPortMapMemory-Funktion ordnet einen Bereich von busrelativen physischen Adressen des Videospeichers dem Systemraum oder dem virtuellen Adressraum eines Benutzermodusprozesses zu. Ein Videominiporttreiber ruft VideoPortMapMemory auf, wenn er IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY oder IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES verarbeitet.

Syntax

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

Parameter

HwDeviceExtension

Zeiger auf die Geräteerweiterung des Miniporttreibers.

PhysicalAddress

Die busrelative Basisadresse des zu zuordnenden Bereichs.

Length

Gibt bei der Eingabe die Anzahl der zuzuordnenden Bytes des Videospeichers an. Empfängt bei der Ausgabe die Größe des tatsächlich zugeordneten Arbeitsspeichers, der möglicherweise auf eine systembestimmte Ausrichtungsgrenze gerundet wird. (Die Miniport- und Anzeigetreiber können jedoch nicht auf Speicher zugreifen, der außerhalb des durch den Eingabewert bei Length getrennten Bereichs liegt.)

InIoSpace

Zeiger auf eine Variable, die die Position des Bereichs angibt. Die Variable kann eines der folgenden Flags oder eine ORed-kompatible Kombination dieser Flags sein.

Kennzeichnen Bedeutung
VIDEO_MEMORY_SPACE_DENSE Veraltet.
VIDEO_MEMORY_SPACE_IO Der Adressbereich befindet sich im E/A-Bereich, nicht im Speicherplatz.
VIDEO_MEMORY_SPACE_MEMORY Der Adressbereich befindet sich im Arbeitsspeicher, nicht im E/A-Bereich.
VIDEO_MEMORY_SPACE_P6CACHE Der Prozessor aggregiert eine Sequenz von Schreibvorgängen, sendet sie an eine Cachezeile und löscht später den Cache. Dieses Flag ist nur dann sinnvoll, wenn VIDEO_MEMORY_SPACE_IO nicht festgelegt ist.
Legt den Videospeicher als write-combined (WC) fest. Informationen zum WC-Zwischenspeichern finden Sie im Websiteartikel Schreibkombinierender Arbeitsspeicher in Video-Miniporttreibern .
VIDEO_MEMORY_SPACE_USER_MODE Der Adressbereich sollte dem virtuellen Adressraum eines Benutzermodusprozesses und nicht dem Systembereich zugeordnet werden. Dieses Flag ist nur dann sinnvoll, wenn VIDEO_MEMORY_SPACE_IO nicht festgelegt ist.

VirtualAddress

Zeiger auf eine Variable, die bei der Eingabe entweder NULL oder ein Handle auf einen Benutzermodusprozess ist. Wenn der Eingabewert NULL ist, ordnet diese Routine den Videospeicher dem Systemspeicher zu. Andernfalls ordnet diese Routine den Videospeicher dem virtuellen Adressraum des Benutzermodusprozesses zu, der durch das Handle identifiziert wird. Empfängt bei der Ausgabe die virtuelle Basisadresse der Zuordnung.

Rückgabewert

VideoPortMapMemory gibt NO_ERROR zurück, wenn der angegebene Bereich erfolgreich zugeordnet wurde. andernfalls wird ERROR_INVALID_PARAMETER zurückgegeben.

Hinweise

VideoPortMapMemory wird im Kernelmodus im selben Kontext wie der Benutzermodusthread ausgeführt, der den Aufruf initiiert hat.

VideoPortGetDeviceBase und VideoPortMapMemory können beide vom Videominiporttreiber aufgerufen werden, um den Videospeicher einem virtuellen Adressraum zuzuordnen. Wenn Sie beide Funktionen aufrufen, um dieselben physischen Adressen zuzuordnen, oder wenn Sie eine der Funktionen mehrmals aufrufen, um dieselben physischen Adressen zu zuordnen, verfügen Sie möglicherweise über mehrere virtuelle Adressbereiche, die demselben physischen Adressbereich zugeordnet sind. In diesem Fall müssen Sie das VIDEO_MEMORY_SPACE_P6CACHE Flag des InIoSpace-Parameters in allen aufrufen auf denselben Wert festlegen.

Jedes Uma-Anzeigegerät (Universal Memory Architecture) verwendet einen Framepuffer, der sich in Standard Arbeitsspeicher und nicht auf einem PCI-Bus befindet. Rufen Sie in diesem Fall VideoPortMapMemory nicht auf, um den Framepuffer zuzuordnen. Um einen UMA-Framepuffer dem Systemraum zuzuordnen, rufen Sie MmMapIoSpace auf. Führen Sie die folgenden Schritte aus, um einen UMA-Framepuffer dem virtuellen Adressraum eines Benutzermodusprozesses zuzuordnen:

  1. Rufen Sie ZwOpenSection auf, um ein Handle für das Physical-Memory-Abschnittsobjekt des Betriebssystems mit dem Namen \Device\PhysicalMemory abzurufen.
  2. Rufen Sie ZwMapViewOfSection auf, um dem virtuellen Adressraum des aktuellen Prozesses eine Ansicht des Framepuffers zuzuordnen.
Das folgende Beispiel zeigt, wie sie einen UMA-Framepuffer dem virtuellen Adressraum des aktuellen Prozesses zuordnen.
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);
}

Miniporttreiber sollten VideoPortMapMemory verwenden, um Grafikkarten zu verwalten, mit denen der Videoframepuffer jederzeit vollständig zugeordnet werden kann. Das heißt, Miniporttreiber für Adapter, die nicht auf die Verwendung von Banken zum Gleichzeitigen Zuordnen eines Slices beschränkt sind, können das effizientere VideoPortMapMemory verwenden.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows 2000 und höheren Versionen der Windows-Betriebssysteme.
Zielplattform Desktop
Kopfzeile video.h (einschließen von Video.h)
Bibliothek Videoprt.lib
DLL Videoprt.sys
IRQL PASSIVE_LEVEL

Weitere Informationen

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory