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_MEMORY_SPACE_USER_MODE 주소 범위는 시스템 공간이 아닌 사용자 모드 프로세스의 가상 주소 공간에 매핑되어야 합니다. 이 플래그는 VIDEO_MEMORY_SPACE_IO 설정되지 않은 경우에만 의미가 있습니다.

VirtualAddress

입력 시 NULL 또는 사용자 모드 프로세스에 대한 핸들인 변수에 대한 포인터입니다. 입력 값이 NULL인 경우 이 루틴은 비디오 메모리를 시스템 공간에 매핑합니다. 그렇지 않으면 이 루틴은 비디오 메모리를 핸들로 식별되는 사용자 모드 프로세스의 가상 주소 공간에 매핑합니다. 출력에서 는 매핑의 기본 가상 주소를 받습니다.

반환 값

VideoPortMapMemory 는 지정된 범위를 성공적으로 매핑하면 NO_ERROR 반환합니다. 그렇지 않으면 ERROR_INVALID_PARAMETER 반환합니다.

설명

VideoPortMapMemory 는 호출을 시작한 사용자 모드 스레드와 동일한 컨텍스트 내에서 커널 모드로 실행됩니다.

VideoPortGetDeviceBaseVideoPortMapMemory 는 모두 비디오 미니포트 드라이버에서 호출하여 비디오 메모리를 가상 주소 공간에 매핑할 수 있습니다. 이러한 두 함수를 모두 호출하여 동일한 실제 주소를 매핑하거나 함수 중 하나를 두 번 이상 호출하여 동일한 실제 주소를 매핑하는 경우 동일한 실제 주소 범위에 매핑되는 가상 주소 범위가 두 개 이상 있을 수 있습니다. 이 경우 InIoSpace 매개 변수의 VIDEO_MEMORY_SPACE_P6CACHE 플래그를 모든 호출에서 동일한 값으로 설정해야 합니다.

모든 UMA(유니버설 메모리 아키텍처) 디스플레이 디바이스는 PCI 버스가 아닌 기본 메모리에 있는 프레임 버퍼를 사용합니다. 이 경우 VideoPortMapMemory 를 호출하여 프레임 버퍼를 매핑하지 마세요. UMA 프레임 버퍼를 시스템 공간에 매핑하려면 MmMapIoSpace를 호출합니다. UMA 프레임 버퍼를 사용자 모드 프로세스의 가상 주소 공간에 매핑하려면 다음 단계를 수행합니다.

  1. ZwOpenSection을 호출하여 \Device\PhysicalMemory라는 운영 체제의 실제 메모리 섹션 개체에 대한 핸들을 가져옵니다.
  2. ZwMapViewOfSection을 호출하여 프레임 버퍼의 보기를 현재 프로세스의 가상 주소 공간에 매핑합니다.
다음 예제에서는 UMA 프레임 버퍼를 현재 프로세스의 가상 주소 공간에 매핑하는 방법을 보여 줍니다.
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

추가 정보

IOCTL_VIDEO_MAP_VIDEO_MEMORY

VIDEO_REQUEST_PACKET

VideoPortUnmapMemory