PBUILD_SCATTER_GATHER_LIST 콜백 함수(wdm.h)

BuildScatterGatherList 루틴은 드라이버 제공 버퍼를 사용하여 분산/수집 목록을 빌드하여 DMA 작업을 위해 시스템을 준비합니다.

구문

PBUILD_SCATTER_GATHER_LIST PbuildScatterGatherList;

NTSTATUS PbuildScatterGatherList(
  [in] PDMA_ADAPTER DmaAdapter,
  [in] PDEVICE_OBJECT DeviceObject,
  [in] PMDL Mdl,
  [in] PVOID CurrentVa,
  [in] ULONG Length,
  [in] PDRIVER_LIST_CONTROL ExecutionRoutine,
  [in] PVOID Context,
  [in] BOOLEAN WriteToDevice,
  [in] PVOID ScatterGatherBuffer,
  [in] ULONG ScatterGatherLength
)
{...}

매개 변수

[in] DmaAdapter

버스 마스터 어댑터 또는 DMA 컨트롤러를 나타내는 IoGetDmaAdapter에서 반환된 DMA_ADAPTER 구조체에 대한 포인터입니다.

[in] DeviceObject

DMA 작업의 대상 디바이스를 나타내는 디바이스 개체에 대한 포인터입니다.

[in] Mdl

현재 IRP의 MdlAddress 멤버가 지정한 버퍼를 설명하는 MDL에 대한 포인터입니다.

[in] CurrentVa

DMA 전송 작업에 매핑할 버퍼에 대한 MDL의 현재 가상 주소에 대한 포인터입니다.

[in] Length

매핑할 버퍼의 길이(바이트)를 지정합니다.

[in] ExecutionRoutine

시스템 DMA 컨트롤러 또는 버스 마스터 어댑터를 사용할 수 있을 때 IRQL = DISPATCH_LEVEL 호출되는 드라이버 제공 AdapterListControl 루틴에 대한 포인터입니다.

[in] Context

호출될 때 ExecutionRoutine 에 전달된 드라이버 결정 컨텍스트에 대한 포인터입니다.

[in] WriteToDevice

DMA 전송 방향을 나타냅니다. 버퍼에서 디바이스로 전송하는 경우 TRUE 이고 그렇지 않으면 FALSE 입니다.

[in] ScatterGatherBuffer

루틴이 SCATTER_GATHER_LIST 구조로 채우는 호출자 제공 버퍼에 대한 포인터입니다.

[in] ScatterGatherLength

ScatterGatherBuffer 매개 변수에 전달된 버퍼의 크기(바이트)를 지정합니다.

반환 값

BuildScatterGatherList 는 다음 값 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS 작업이 성공적으로 완료되었습니다.
STATUS_INSUFFICIENT_RESOURCES 시스템에 전송에 사용할 수 있는 맵 레지스터가 부족합니다.
STATUS_BUFFER_TOO_SMALL 지정된 길이 가 너무 커서 버퍼 내에 맞지 않습니다.

설명

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

BuildScatterGatherListScatterGatherBuffer 매개 변수에 제공된 버퍼를 사용하여 만든 분산/수집 목록을 보유한다는 점을 제외하고 GetScatterGatherList와 동일한 작업을 수행합니다. 반면 GetScatterGatherList 는 분산/수집 목록을 저장할 버퍼를 동적으로 할당합니다. 메모리가 부족하여 버퍼를 할당할 수 없는 경우 GetScatterGatherList 는 STATUS_INSUFFICIENT_RESOURCES 오류로 실패할 수 있습니다. 이 시나리오를 피해야 하는 드라이버는 버퍼를 미리 할당하여 분산/수집 목록을 저장하고 대신 BuildScatterGatherList 를 사용할 수 있습니다.

드라이버는 CalculateScatterGatherList 루틴을 사용하여 분산/수집 목록을 보관하기 위해 할당할 버퍼의 크기를 결정할 수 있습니다.

드라이버는 드라이버가 PutScatterGatherList를 호출할 때 사용할 ScatterGatherBuffer의 분산/수집 목록에 대한 포인터를 유지해야 합니다. 드라이버는 목록의 데이터에 액세스하기 전에 PutScatterGatherList (목록을 플러시)를 호출해야 합니다.

요구 사항

   
지원되는 최소 클라이언트 Windows XP 이상 버전의 Windows에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 wdm.h(Wdm.h 포함)
IRQL DISPATCH_LEVEL
DDI 규정 준수 규칙 IrqlDispatch(wdm)

추가 정보

BuildMdlFromScatterGatherList

CalculateScatterGatherList

DEVICE_DESCRIPTION

DEVICE_OBJECT

DMA_ADAPTER

DMA_OPERATIONS

GetScatterGatherList

IoGetDmaAdapter

PutScatterGatherList

SCATTER_GATHER_LIST