다음을 통해 공유


PGET_DMA_TRANSFER_INFO 콜백 함수(wdm.h)

GetDmaTransferInfo 루틴은 분산/수집 DMA 전송에 대한 할당 요구 사항을 계산합니다.

구문

PGET_DMA_TRANSFER_INFO PgetDmaTransferInfo;

NTSTATUS PgetDmaTransferInfo(
  [in]      PDMA_ADAPTER DmaAdapter,
  [in]      PMDL Mdl,
  [in]      ULONGLONG Offset,
  [in]      ULONG Length,
  [in]      BOOLEAN WriteOnly,
  [in, out] PDMA_TRANSFER_INFO TransferInfo
)
{...}

매개 변수

[in] DmaAdapter

DMA_ADAPTER 구조체에 대한 포인터입니다. 이 구조체는 드라이버의 버스 master DMA 디바이스 또는 시스템 DMA 채널을 나타내는 어댑터 개체입니다. 호출자는 IoGetDmaAdapter 루틴에 대한 이전 호출에서 이 포인터를 얻었습니다.

[in] Mdl

전송할 메모리 페이지를 설명하는 MDL 체인에 대한 포인터입니다. 자세한 내용은 주의 섹션을 참조하세요.

[in] Offset

분산/수집 DMA 전송에 대한 시작 오프셋입니다. 이 매개 변수는 MDL 체인의 첫 번째 MDL에 있는 버퍼의 시작 부분부터의 바이트 오프셋입니다. MDL 체인의 MDL이 버퍼 공간의 총 N바이트를 지정하는 경우 Offset 의 유효한 값은 0에서 N-1 범위입니다.

[in] Length

DMA 전송의 길이(바이트)입니다. MDL 체인이 총 N바이트의 버퍼 공간을 지정하는 경우 Length 의 유효한 값은 1에서 N-오프셋까지의 범위에 있습니다.

[in] WriteOnly

전송이 쓰기 전용 작업(즉, 메모리에서 디바이스로 전송)인지 여부를 나타냅니다. WriteOnly가 TRUE이면 전송에 대해 반환된 정보가 읽기 트랜잭션에 유효하지 않을 수 있습니다. 이 매개 변수는 캐시 일관성을 적용하기 위해 버퍼 경계에서 추가 캐시 제어 작업이 필요함을 나타낼 수 있습니다.

[in, out] TransferInfo

호출자가 할당한 DMA_TRANSFER_INFO 구조체에 대한 포인터입니다. 호출자는 GetDmaTransferInfo를 호출하기 전에 구조체의 Version 멤버를 DMA_TRANSFER_INFO_VERSION1 설정해야 합니다.

반환 값

GetDmaTransferInfo 는 호출이 성공하면 STATUS_SUCCESS 반환합니다. 가능한 오류 반환 값에는 다음 상태 코드가 포함됩니다.

반환 코드 설명
STATUS_NOT_SUPPORTED
루틴은 지정된 버전의 DMA_TRANSFER_INFO_XXX 구조를 지원하지 않습니다.

설명

GetDmaTransferInfo는 이름으로 직접 호출할 수 있는 시스템 루틴이 아닙니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다 . 드라이버는 DeviceDescription 매개 변수의 Version 멤버가 DEVICE_DESCRIPTION_VERSION3 설정된 IoGetDmaAdapter를 호출하여 이 루틴의 주소를 가져옵니다. IoGetDmaAdapterNULL을 반환하는 경우 플랫폼에서 루틴을 사용할 수 없습니다.

GetDmaTransferInfo를 사용하여 BuildScatterGatherListExMapTransferEx 루틴에 할당할 분산/수집 버퍼의 크기를 계산합니다.

GetDmaTransferInfoCalculateScatterGatherList 루틴을 대체하며 BuildScatterGatherListEx와 함께 사용하는 것이 더 편리합니다.

Mdl, OffsetLength 매개 변수는 함께 분산/수집 DMA 전송을 위한 버퍼로 사용할 실제 메모리 영역의 컬렉션을 지정합니다. 각 실제 메모리 영역은 일반적으로 페이지의 페이지 또는 일부입니다. GetDmaTransferInfo 는 이 전송에 대한 할당 요구 사항을 결정합니다. 이러한 요구 사항에는 다음이 포함됩니다.

  • 분산/수집 목록의 요소 수입니다. 각 요소는 물리적으로 연속된 메모리 블록을 설명하는 SCATTER_GATHER_ELEMENT 구조체입니다.
  • 지정된 분산/수집 목록을 보관하기 위해 할당할 메모리 양입니다. (이 메모리 할당에는 I/O 버퍼를 설명하지만 I/O 버퍼 자체에는 사용되지 않는 분산/수집 목록에 필요한 공간이 포함됩니다.)
  • 분산/수집 목록의 실제 주소를 논리적 주소로 변환하는 데 필요한 맵 레지스터 수입니다.
DMA_TRANSFER_INFO_XXX 구조의 버전 1에서 제공하는 DMA 전송 정보에 대한 자세한 내용은 DMA_TRANSFER_INFO_V1.

MDL은 잠긴 연속된 가상 메모리 블록의 기반이 되는 실제 메모리 페이지를 설명합니다. 일반적으로 이러한 실제 메모리 페이지는 연속되지 않습니다. MDL 체인은 I/O 데이터를 버퍼링하는 데 사용할 수 있는 메모리를 설명하는 정렬된 MDL 컬렉션입니다. 일반적으로 체인의 MDL에서 설명하는 가상 메모리 영역은 연속되지 않습니다. MDL 및 MDL 체인에 대한 자세한 내용은 MDL 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 시작해서 사용할 수 있습니다.
대상 플랫폼 데스크톱
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL <= DISPATCH_LEVEL

추가 정보

BuildScatterGatherListEx

CalculateScatterGatherList

DMA_OPERATIONS

DMA_TRANSFER_INFO

DMA_TRANSFER_INFO_V1

IoGetDmaAdapter

MapTransferEx