Bagikan melalui


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:

  1. Panggil ZwOpenSection untuk mendapatkan handel ke objek bagian memori fisik sistem operasi, yang diberi nama \Device\PhysicalMemory.
  2. Panggil ZwMapViewOfSection untuk memetakan tampilan buffer bingkai ke ruang alamat virtual proses saat ini.
Contoh berikut menunjukkan cara memetakan buffer bingkai UMA 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

Lihat juga

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory