PGET_SCATTER_GATHER_LIST 콜백 함수(wdm.h)

GetScatterGatherList 루틴은 시스템 DMA 컨트롤러 또는 버스 master 어댑터를 통해 대상 디바이스 개체를 대신하여 DMA 분산/수집 작업을 위해 시스템을 준비합니다.

구문

PGET_SCATTER_GATHER_LIST PgetScatterGatherList;

NTSTATUS PgetScatterGatherList(
  [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] DmaAdapter

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

[in] DeviceObject

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

[in] Mdl

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

[in] CurrentVa

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

[in] Length

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

[in] ExecutionRoutine

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

[in] Context

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

[in] WriteToDevice

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

반환 값

이 루틴은 다음 NTSTATUS 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_SUCCESS
작업에 성공했습니다.
STATUS_INSUFFICIENT_RESOURCES
루틴에서 충분한 메모리를 할당할 수 없거나 전송에 필요한 맵 레지스터 수가 IoGetDmaAdapter에서 반환한 값보다 큽니다.
STATUS_BUFFER_TOO_SMALL
버퍼가 요청된 전송에 비해 너무 작습니다.

설명

GetScatterGatherList 루틴은 분산/수집 목록을 저장할 버퍼를 동적으로 할당합니다. 버퍼 할당이 실패할 경우 가능한 NTSTATUS 값은 반환 값을 참조하세요.

GetScatterGatherList 는 이름으로 직접 호출할 수 있는 시스템 루틴이 아닙니다. 이 루틴은 DMA_OPERATIONS 구조에서 반환된 주소의 포인터로만 호출할 수 있습니다. 드라이버는 IoGetDmaAdapter를 호출하여 이 루틴의 주소를 가져옵니다.

적절한 DMA 채널과 필요한 맵 레지스터를 사용할 수 있는 즉시 GetScatterGatherList 는 분산/수집 목록을 만들고 맵 레지스터를 초기화한 다음 드라이버 제공 AdapterListControl 루틴을 호출하여 I/O 작업을 수행합니다.

GetScatterGatherList 는 분산/수집 DMA를 수행하는 드라이버에 대한 AllocateAdapterChannelMapTransfer 루틴의 작업을 결합합니다. GetScatterGatherList 는 전송에 필요한 맵 레지스터 수를 결정하고, 맵 레지스터를 할당하고, DMA에 대한 버퍼를 매핑하고, 분산/수집 목록을 채웁니다. 그런 다음 제공된 AdapterListControl 루틴을 호출하여 ScatterGather의 분산/수집 목록에 대한 포인터를 전달합니다. 드라이버는 PutScatterGatherList를 호출할 때 사용할 이 포인터를 유지해야 합니다. GetScatterGatherList에는 AllocateAdapterChannel에 적용되는 큐 제한이 없습니다.

AdapterListControl 루틴에서 드라이버는 I/O를 수행해야 합니다. 드라이버 제공 루틴에서 반환할 때 GetScatterGatherList 는 맵 레지스터를 유지하지만 DMA 어댑터 구조를 해제합니다. 드라이버는 버퍼의 데이터에 액세스하려면 먼저 PutScatterGatherList (버퍼를 플러시)를 호출해야 합니다.

연결된 모든 MDL에 필요한 맵 레지스터의 총 수가 사용 가능한 맵 레지스터 수를 초과하지 않는 경우 이 루틴은 연결된 MDL을 처리할 수 있습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 이상 버전의 Windows에서 사용할 수 있습니다. Windows 98 또는 Windows Me에서는 지원되지 않습니다.
대상 플랫폼 데스크톱
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL DISPATCH_LEVEL
DDI 규정 준수 규칙 IrqlDispatch(storport), IrqlDispatch(storport), IrqlDispatch(wdm)

추가 정보

AllocateAdapterChannel

DEVICE_OBJECT

DMA_ADAPTER

DMA_OPERATIONS

IoGetDmaAdapter

PutScatterGatherList

SCATTER_GATHER_LIST