다음을 통해 공유


PALLOCATE_ADAPTER_CHANNEL 콜백 함수(wdm.h)

AllocateAdapterChannel 루틴은 대상 디바이스 개체를 대신하여 DMA 작업을 위해 시스템을 준비한 다음 드라이버 제공 AdapterControl 루틴을 호출하여 DMA 작업을 수행합니다.

통사론

PALLOCATE_ADAPTER_CHANNEL PallocateAdapterChannel;

NTSTATUS PallocateAdapterChannel(
  [in] PDMA_ADAPTER DmaAdapter,
  [in] PDEVICE_OBJECT DeviceObject,
  [in] ULONG NumberOfMapRegisters,
  [in] PDRIVER_CONTROL ExecutionRoutine,
  [in] PVOID Context
)
{...}

매개 변수

[in] DmaAdapter

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

[in] DeviceObject

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

[in] NumberOfMapRegisters

전송에 사용할 지도 레지스터 수를 지정합니다. 이 값은 현재 전송 요청을 충족하는 데 필요한 맵 레지스터 수와 IoGetDmaAdapter가 반환한 사용 가능한 지도 레지스터 수보다.

[in] ExecutionRoutine

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

[in] Context

AdapterControl 루틴에 전달할 드라이버 결정 컨텍스트에 대한 포인터입니다.

반환 값

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

반환 코드 묘사
STATUS_SUCCESS
어댑터 채널이 할당되었습니다. DMA 작업이 시작되면 시스템에서 AdapterControl 루틴을 호출합니다.
STATUS_INSUFFICIENT_RESOURCES
NumberOfMapRegistersIoGetDmaAdapter반환된 값보다 큽니다. AdapterControl 루틴은 호출되지 않습니다.

발언

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

드라이버는 AllocateAdapterControl 루틴을 호출하여 드라이버에 대한 DMA 작업을 수행하는 AdapterControl 루틴을 등록합니다. AdapterControl 루틴은 시스템 DMA 컨트롤러 또는 버스 마스터 어댑터를 사용하여 DMA 작업을 수행합니다.

DMA 작업을 즉시 수행할 수 있는 경우 시스템은 AdapterControl즉시 호출합니다. 시스템 DMA 컨트롤러 또는 버스 마스터 어댑터가 현재 사용 중인 경우 AllocateAdapterChannel 어댑터를 사용할 수 있을 때까지 AdapterControl 큐에 대기합니다. 두 경우 모두 AllocateAdapterChannel STATUS_SUCCESS 반환합니다.

시스템에 DMA 작업을 수행할 리소스가 없는 경우 AllocateAdapterChannel STATUS_INSUFFICIENT_RESOURCES 반환합니다. 이 경우 AdapterControl 큐에 없으므로 드라이버는 적절한 오류 코드(예: STATUS_INSUFFICIENT_RESOURCES)로 현재 IRP를 완료해야 합니다.

이 루틴은 DMA 컨트롤러 채널에 대한 단독 액세스를 예약하고 지정된 디바이스에 대한 현재 IRP의 전송 요청을 충족하는 데 필요한 하나 이상의 DMA 작업에 대한 레지스터를 매핑합니다.

한 번에 하나의 DMA 요청만 디바이스 개체에 대해 큐에 대기할 수 있습니다. 따라서 드라이버는 AdapterControl 루틴 실행이 완료될 때까지 동일한 디바이스 개체에서 다른 DMA 작업에 대해 AllocateAdapterChannel 다시 호출해서는 안 됩니다. 또한 드라이버는 AdapterControl 루틴 내에서 AllocateAdapterChannel 호출해서는 안됩니다.

시스템은 DeviceObjectCurrentIrp 멤버의 값을 AdapterControlIrp 매개 변수로 전달합니다. AllocateAdapterChannel 드라이버의 StartIo 루틴에서 호출되는 경우 처리하도록 StartIo 호출된 IRP를 가리키도록 보장됩니다. 그렇지 않은 경우 AdapterControlIrp 매개 변수를 사용하려면 드라이버는 AllocateAdapterChannel호출하기 전에 현재 IRP를 가리키도록 CurrentIrp 설정해야 합니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 바탕 화면
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL DISPATCH_LEVEL
DDI 규정 준수 규칙 IrqlDispatch(storport), IrqlDispatch(storport), IrqlDispatch(wdm)

참고 항목

DEVICE_OBJECT

DMA_ADAPTER

DMA_OPERATIONS

FlushAdapterBuffers

freeAdapterChannel

freeMapRegisters

IoGetDmaAdapter

MapTransfer

ReadDmaCounter