Fungsi VideoPortMapMemory (video.h)
Fungsi VideoPortMapMemory memetakan berbagai alamat fisik memori video relatif bus ke dalam ruang sistem atau ke ruang alamat virtual proses mode pengguna. Driver miniport video memanggil VideoPortMapMemory saat menangani IOCTL_VIDEO_MAP_VIDEO_MEMORY, IOCTL_VIDEO_SHARE_VIDEO_MEMORY, atau IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES.
Sintaks
VIDEOPORT_DEPRECATED VIDEOPORT_API VP_STATUS VideoPortMapMemory(
PVOID HwDeviceExtension,
PHYSICAL_ADDRESS PhysicalAddress,
PULONG Length,
PULONG InIoSpace,
PVOID *VirtualAddress
);
Parameter
HwDeviceExtension
Arahkan ke ekstensi perangkat driver miniport.
PhysicalAddress
Alamat dasar relatif bus dari rentang untuk dipetakan.
Length
Pada input, menentukan jumlah byte memori video yang akan dipetakan. Pada output, menerima ukuran memori yang benar-benar dipetakan, yang mungkin dibulatkan ke batas perataan yang ditentukan sistem. (Namun, driver miniport dan tampilan tidak dapat mengakses memori apa pun yang berada di luar rentang yang dibatasi oleh nilai input pada Panjang.)
InIoSpace
Penunjuk ke variabel yang menunjukkan lokasi rentang. Variabel dapat berupa salah satu bendera berikut atau ORed, kombinasi bendera ini yang kompatibel.
Bendera | Makna |
---|---|
VIDEO_MEMORY_SPACE_DENSE | Kedaluwarsa. |
VIDEO_MEMORY_SPACE_IO | Rentang alamat berada di ruang I/O, bukan di ruang memori. |
VIDEO_MEMORY_SPACE_MEMORY | Rentang alamat berada di ruang memori, bukan di ruang I/O. |
VIDEO_MEMORY_SPACE_P6CACHE | Prosesor menggabungkan urutan operasi tulis, mengirimkannya ke baris cache, dan kemudian menghapus cache. Bendera ini bermakna hanya jika VIDEO_MEMORY_SPACE_IO tidak diatur. |
Menunjuk memori video sebagai write-combined (WC). Untuk informasi tentang penembolokan WC, lihat artikel situs web Write-Combining Memory in Video Miniport Drivers . | |
VIDEO_MEMORY_SPACE_USER_MODE | Rentang alamat harus dipetakan ke ruang alamat virtual dari proses mode pengguna, bukan ke ruang sistem. Bendera ini bermakna hanya jika VIDEO_MEMORY_SPACE_IO tidak diatur. |
VirtualAddress
Penunjuk ke variabel yang, pada input, adalah NULL atau handel ke proses mode pengguna. Jika nilai input adalah NULL, rutinitas ini memetakan memori video ke dalam ruang sistem. Jika tidak, rutinitas ini memetakan memori video ke ruang alamat virtual dari proses mode pengguna yang diidentifikasi oleh handel. Pada output, menerima alamat virtual dasar pemetaan.
Mengembalikan nilai
VideoPortMapMemory mengembalikan NO_ERROR jika berhasil memetakan rentang yang ditentukan; jika tidak, ia mengembalikan ERROR_INVALID_PARAMETER.
Keterangan
VideoPortMapMemory berjalan dalam mode kernel dalam konteks yang sama dengan utas mode pengguna yang memulai panggilan.
VideoPortGetDeviceBase dan VideoPortMapMemory keduanya dapat dipanggil oleh driver miniport video untuk memetakan memori video ke ruang alamat virtual. Jika Anda memanggil kedua fungsi ini untuk memetakan alamat fisik yang sama, atau jika Anda memanggil salah satu fungsi lebih dari sekali untuk memetakan alamat fisik yang sama, Anda mungkin memiliki lebih dari satu rentang alamat virtual yang memetakan ke rentang alamat fisik yang sama. Dalam hal ini, Anda harus mengatur bendera VIDEO_MEMORY_SPACE_P6CACHE parameter InIoSpace ke nilai yang sama di semua panggilan tersebut.
Setiap perangkat tampilan arsitektur memori universal (UMA) menggunakan buffer bingkai yang terletak di memori utama daripada di bus PCI. Dalam hal ini, jangan panggil VideoPortMapMemory untuk memetakan buffer bingkai. Untuk memetakan buffer bingkai UMA ke ruang sistem, panggil MmMapIoSpace. Untuk memetakan buffer bingkai UMA ke ruang alamat virtual proses mode pengguna, lakukan langkah-langkah berikut:
- Panggil ZwOpenSection untuk mendapatkan handel ke objek bagian memori fisik sistem operasi, yang diberi nama \Device\PhysicalMemory.
- Panggil ZwMapViewOfSection untuk memetakan tampilan buffer bingkai ke ruang alamat virtual proses saat ini.
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);
}
Driver Miniport harus menggunakan VideoPortMapMemory untuk mengelola adaptor video yang memungkinkan buffer bingkai video dipetakan sepenuhnya setiap saat. Artinya, driver miniport untuk adaptor yang tidak dibatasi untuk menggunakan bank untuk memetakan ipotong pada satu waktu dapat menggunakan VideoPortMapMemory yang lebih efisien.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia di Windows 2000 dan versi yang lebih baru dari sistem operasi Windows. |
Target Platform | Desktop |
Header | video.h (sertakan Video.h) |
Pustaka | Videoprt.lib |
DLL | Videoprt.sys |
IRQL | PASSIVE_LEVEL |