PMAP_TRANSFER 콜백 함수(wdm.h)
MapTransfer 루틴은 어댑터 개체에 대한 맵 레지스터를 설정하여 잠긴 버퍼에서 DMA 전송을 매핑합니다.
구문
PMAP_TRANSFER PmapTransfer;
PHYSICAL_ADDRESS PmapTransfer(
[in] PDMA_ADAPTER DmaAdapter,
[in] PMDL Mdl,
[in] PVOID MapRegisterBase,
[in] PVOID CurrentVa,
[in, out] PULONG Length,
[in] BOOLEAN WriteToDevice
)
{...}
매개 변수
[in] DmaAdapter
IoGetDmaAdapter에서 반환되고 현재 IRP의 전송 요청에 대해 AllocateAdapterChannel에 이전에 전달된 DMA 어댑터 개체에 대한 포인터입니다.
[in] Mdl
다음 중 하나에 대한 포인터: 현재 IRP의 MdlAddress 에서 버퍼를 설명하는 MDL 또는 종속 디바이스의 드라이버가 설정한 공통 버퍼를 설명하는 MDL(자동 초기화 모드).
[in] MapRegisterBase
DMA 작업에 할당된 맵 레지스터를 지정합니다. 시스템은 이 값을 드라이버의 AdapterControl 루틴에 전달합니다.
[in] CurrentVa
DMA 전송 작업을 위해 전송할 데이터의 현재 가상 주소에 대한 포인터입니다.
[in, out] Length
매핑할 길이(바이트)를 지정합니다. 드라이버가 IoGetDmaAdapter를 호출할 때 분산/수집 지원이 있는 버스 master 표시한 경우 MapTransfer에서 반환되는 Length 값은 매핑된 바이트 수를 나타냅니다. 그렇지 않으면 Length 의 입력 및 출력 값이 동일합니다.
[in] WriteToDevice
전송 작업의 방향을 나타냅니다. 잠긴 버퍼에서 디바이스로 전송하는 경우 TRUE 입니다.
반환 값
MapTransfer는 버스 master 어댑터의 드라이버가 사용할 수 있는 매핑된 지역의 논리적 주소를 반환합니다. 시스템 DMA 컨트롤러를 사용하는 디바이스의 드라이버는 이 값을 사용할 수 없으며 무시해야 합니다.
설명
MapTransfer는 이름으로 직접 호출할 수 있는 시스템 루틴이 아닙니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다. 드라이버는 IoGetDmaAdapter를 호출하여 이 루틴의 주소를 가져옵니다.
DmaAdapter는 드라이버가 AllocateAdapterChannel을 이전에 호출한 결과로 이미 할당되어 있어야 합니다.
설정할 수 있는 맵 레지스터 수는 드라이버가 IoGetDmaAdapter를 호출할 때 반환되는 최대값을 초과할 수 없습니다.
드라이버는 MmGetMdlVirtualAddress를 호출하여 패킷 기반 DMA 전송의 시작에 대한 초기 CurrentVa를 가져올 수 있습니다. 그러나 반환되는 값은 유효한 가상 주소가 아닌 Mdl에 대한 인덱스입니다. 드라이버가 큰 전송 요청을 둘 이상의 DMA 작업으로 분할해야 하는 경우 각 DMA 작업에 대해 CurrentVa 및 Length 를 업데이트해야 합니다.
분산/수집 지원이 있는 버스 master 디바이스의 드라이버는 반환된 논리 주소와 업데이트된 Length 값을 사용하여 분산/수집 목록을 작성할 수 있으며, 전송 작업에 사용 가능한 모든 지도 레지스터를 사용할 때까지 MapTransfer를 반복적으로 호출합니다. 그러나 이러한 드라이버는 GetScatterGatherList 루틴을 더 간단하게 사용할 수 있습니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000부터 사용할 수 있습니다. |
대상 플랫폼 | 데스크톱 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
IRQL | <= DISPATCH_LEVEL |
DDI 규정 준수 규칙 | IrqlDispatch(wdm) |