VideoPortMapMemory 函式 (video.h)
VideoPortMapMemory 函式會將視訊記憶體的總線相對實體位址範圍對應到系統空間或使用者模式進程的虛擬地址空間。 視訊迷你埠驅動程式會在處理IOCTL_VIDEO_MAP_VIDEO_MEMORY、IOCTL_VIDEO_SHARE_VIDEO_MEMORY或IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES時呼叫 VideoPortMapMemory。
語法
VIDEOPORT_DEPRECATED VIDEOPORT_API VP_STATUS VideoPortMapMemory(
PVOID HwDeviceExtension,
PHYSICAL_ADDRESS PhysicalAddress,
PULONG Length,
PULONG InIoSpace,
PVOID *VirtualAddress
);
參數
HwDeviceExtension
迷你埠驅動程式裝置延伸模組的指標。
PhysicalAddress
要對應之範圍的總線相對基位址。
Length
在輸入上,指定要對應的視訊記憶體位元組數目。 在輸出中,接收實際對應的記憶體大小,這可能會四捨五入為系統決定的對齊界限。 (不過,迷你埠和顯示驅動程式無法存取以 Length分隔之輸入值以外的任何記憶體。
InIoSpace
指出範圍位置之變數的指標。 變數可以是下列其中一個旗標或 ORed 相容的這些旗標組合。
旗標 | 意義 |
---|---|
VIDEO_MEMORY_SPACE_DENSE | 過時。 |
VIDEO_MEMORY_SPACE_IO | 位址範圍位於 I/O 空間中,而不是記憶體空間中。 |
VIDEO_MEMORY_SPACE_MEMORY | 位址範圍位於記憶體空間中,而不是在 I/O 空間中。 |
VIDEO_MEMORY_SPACE_P6CACHE | 處理器會匯總一連串的寫入作業、將它們傳送至快取行,然後排清快取。 只有在未設定VIDEO_MEMORY_SPACE_IO時,此旗標才有意義。 |
將視訊記憶體指定為寫入合併 (WC)。 如需 WC 快取的相關信息,請參閱影片迷你埠驅動程式 網站中的Write-Combining 記憶體一文。 | |
VIDEO_MEMORY_SPACE_USER_MODE | 位址範圍應該對應至使用者模式進程的虛擬位址空間,而不是對應到系統空間。 只有在未設定VIDEO_MEMORY_SPACE_IO時,此旗標才有意義。 |
VirtualAddress
輸入上變數的指標 NULL 或使用者模式進程的句柄。 如果輸入值 NULL,此例程會將視訊記憶體對應至系統空間。 否則,這個例程會將視訊記憶體對應至句柄所識別之使用者模式進程的虛擬位址空間。 在輸出中,接收對應的基底虛擬位址。
傳回值
VideoPortMapMemory 如果成功對應指定的範圍,則會傳回NO_ERROR;否則,它會傳回ERROR_INVALID_PARAMETER。
言論
VideoPortMapMemory 在起始呼叫的使用者模式線程相同的內容中執行。
VideoPortGetDeviceBase 和 VideoPortMapMemory 都可以由視訊迷你埠驅動程式呼叫,將視訊記憶體對應至虛擬地址空間。 如果您呼叫這兩個函式來對應相同的實體位址,或者如果您多次呼叫其中一個函式來對應相同的實體位址,您可能有多個對應至相同實體位址範圍的虛擬位址範圍。 在此情況下,您必須將所有呼叫中的 InIoSpace 參數VIDEO_MEMORY_SPACE_P6CACHE旗標設定為相同的值。
每個通用記憶體架構 (UMA) 顯示裝置都會使用位於主要記憶體中的畫面緩衝區,而不是在 PCI 總線上。 在此情況下,請勿呼叫 VideoPortMapMemory 來對應框架緩衝區。 若要將 UMA 框架緩衝區對應至系統空間,請呼叫 MmMapIoSpace。 若要將 UMA 框架緩衝區對應至使用者模式進程的虛擬位址空間,請執行下列步驟:
- 呼叫 ZwOpenSection,以取得作系統實體記憶體區段物件的句柄,此物件名為 \Device\PhysicalMemory。
- 呼叫 ZwMapViewOfSection,將框架緩衝區的檢視對應至目前進程的虛擬地址空間。
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);
}
迷你埠驅動程序應該使用 VideoPortMapMemory 來管理視訊配接器,讓視訊 畫面緩衝區 隨時完全對應。 也就是說,不限於使用 銀行 來對應配量的迷你埠驅動程式,一次可以使用更有效率的 VideoPortMapMemory。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 適用於 Windows 2000 和更新版本的 Windows作系統。 |
目標平臺 | 桌面 |
標頭 | video.h (include Video.h) |
連結庫 | Videoprt.lib |
DLL | Videoprt.sys |
IRQL | PASSIVE_LEVEL |