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:
- Rufen Sie ZwOpenSection auf, um ein Handle für das Physical-Memory-Abschnittsobjekt des Betriebssystems mit dem Namen \Device\PhysicalMemory abzurufen.
- Rufen Sie ZwMapViewOfSection auf, um dem virtuellen Adressraum des aktuellen Prozesses eine Ansicht des Framepuffers zuzuordnen.
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 |