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 캐싱에 대한 자세한 내용은 Video Miniport Drivers 웹 사이트의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(Video.h 포함) |
라이브러리 | Videoprt.lib |
DLL | Videoprt.sys |
IRQL | PASSIVE_LEVEL |