다음을 통해 공유


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 프레임 버퍼를 사용자 모드 프로세스의 가상 주소 공간에 매핑하려면 다음 단계를 수행합니다.

  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