Freigeben über


VideoPortMapMemory-Funktion (video.h)

Die VideoPortMapMemory Funktion ordnet eine Reihe von busrelativen physischen Adressen des Videospeichers in den Systemraum oder in den virtuellen Adressraum eines Benutzermodusprozesses zu. Ein Video-Miniporttreiber ruft VideoPortMapMemory auf, wenn er IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY oder IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES behandelt.

Syntax

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

Parameter

HwDeviceExtension

Zeigen Sie auf die Geräteerweiterung des Miniporttreibers.

PhysicalAddress

Die busrelative Basisadresse des bereichs, der zugeordnet werden soll.

Length

Gibt bei eingaben die Anzahl der Bytes des zuzuordnenden Videospeichers an. Bei der Ausgabe wird die Größe des tatsächlich zugeordneten Speichers empfangen, der auf eine vom System festgelegte Ausrichtungsgrenze gerundet werden kann. (Die Miniport- und Anzeigetreiber können jedoch keinen Arbeitsspeicher aufrufen, der sich außerhalb des Bereichs befindet, der durch den Eingabewert bei Lengthgetrennt ist.)

InIoSpace

Zeigen Sie auf eine Variable, die die Position des Bereichs angibt. Die Variable kann eine der folgenden Flags oder eine kompatible Kombination dieser Flags sein.

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

VirtualAddress

Zeiger auf eine Variable, die bei eingaben entweder NULL- oder ein Handle für 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 vom Handle identifizierten Benutzermodusprozesses zu. 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.

Bemerkungen

VideoPortMapMemory im Kernelmodus innerhalb desselben Kontexts ausgeführt wie der Benutzermodusthread, der den Aufruf initiiert hat.

VideoPortGetDeviceBase und VideoPortMapMemory- können beide vom Videominiporttreiber aufgerufen werden, um Videospeicher in einen virtuellen Adressraum zuzuordnen. Wenn Sie beide Funktionen aufrufen, um die gleichen physischen Adressen zuzuordnen, oder wenn Sie eine der Funktionen mehrmals aufrufen, um die gleichen physischen Adressen zuzuordnen, 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 auf denselben Wert in allen diesen Aufrufen festlegen.

Jedes UMA-Anzeigegerät (Universal Memory Architecture) verwendet einen Framepuffer, der sich im Hauptspeicher und nicht auf einem PCI-Bus befindet. Rufen Sie in diesem Fall nicht VideoPortMapMemory- auf, um den Framepuffer zuzuordnen. Rufen Sie MmMapIoSpaceauf, um einen UMA-Framepuffer in Systemraum zuzuordnen. 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 zum physischen Speicherabschnittsobjekt des Betriebssystems abzurufen, das \Device\PhysicalMemoryheißt.
  2. Rufen Sie ZwMapViewOfSection- auf, um eine Ansicht des Framepuffers dem virtuellen Adressraum des aktuellen Prozesses 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 Video-Framepuffer jederzeit vollständig zugeordnet werden kann. Das heißt, Miniporttreiber für Adapter, die nicht auf die Verwendung von Banken beschränkt sind,, um ein Segment gleichzeitig zuzuordnen, können die effizientere VideoPortMapMemoryverwenden.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar in Windows 2000 und höheren Versionen von Windows-Betriebssystemen.
Zielplattform- Desktop
Header- video.h (video.h einschließen)
Library Videoprt.lib
DLL- Videoprt.sys
IRQL- PASSIVE_LEVEL

Siehe auch

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory