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:
- Rufen Sie ZwOpenSection- auf, um ein Handle zum physischen Speicherabschnittsobjekt des Betriebssystems abzurufen, das \Device\PhysicalMemoryheißt.
- Rufen Sie ZwMapViewOfSection- auf, um eine Ansicht des Framepuffers dem virtuellen Adressraum des aktuellen Prozesses 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 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 |