다음을 통해 공유


WdfDmaTransactionDmaCompletedWithLength 함수(wdfdmatransaction.h)

[KMDF에만 적용]

WdfDmaTransactionDmaCompletedWithLength 메서드는 디바이스의 DMA 전송 작업이 완료되었음을 프레임워크에 알리고 완료된 전송 길이를 제공합니다.

구문

BOOLEAN WdfDmaTransactionDmaCompletedWithLength(
  [in]  WDFDMATRANSACTION DmaTransaction,
  [in]  size_t            TransferredLength,
  [out] NTSTATUS          *Status
);

매개 변수

[in] DmaTransaction

드라이버가 WdfDmaTransactionCreate에 대한 이전 호출에서 가져온 DMA 트랜잭션 개체에 대한 핸들입니다.

[in] TransferredLength

디바이스가 현재 DMA 전송에서 전송한 바이트 수입니다.

[out] Status

DMA 전송의 상태 수신하는 위치에 대한 포인터입니다. 자세한 내용은 WdfDmaTransactionDmaCompleted에 대한 설명 섹션을 참조하세요.

반환 값

WdfDmaTransactionDmaCompletedWithLengthFALSE 를 반환하고 DMA 트랜잭션을 완료하기 위해 추가 전송이 필요한 경우 상태가 STATUS_MORE_PROCESSING_REQUIRED 받습니다. 메서드는 추가 전송이 필요하지 않은 경우 TRUE 를 반환합니다.

드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.

설명

드라이버가 WdfDmaTransactionDmaCompletedWithLength 메서드를 호출하면 프레임워크는 현재 전송을 종료하고 필요한 경우 새 전송을 시작합니다.

WdfDmaTransactionDmaCompletedWithLength 메서드는 드라이버가 전송된 바이트 수를 보고하는 디바이스에 대해 WdfDmaTransactionDmaCompletedWithLength를 호출한다는 점을 제외하고 WdfDmaTransactionDmaCompleted와 동일하게 동작합니다. 프레임워크는 보고된 바이트 수를 사용하여 트랜잭션을 완료하기 위해 여러 전송이 필요한 경우 지정된 DMA 트랜잭션에 대한 다음 DMA 전송의 시작을 결정합니다.

DMA 전송을 완료하는 방법에 대한 자세한 내용은 DMA 전송 완료를 참조하세요.

예제

다음 코드 예제는 PLX9x5x 샘플 드라이버에서 가져옵니다. 이 예제에서는 WdfDmaTransactionGetCurrentDmaTransferLength 를 호출하여 현재 전송의 원래 길이를 확인한 다음 실제 전송 길이를 계산합니다. 다음으로, 이 예제에서는 WdfDmaTransactionDmaCompletedWithLength 를 호출하여 프레임워크에 실제 전송 길이를 보고합니다. 현재 전송이 트랜잭션의 마지막 전송인 경우 이 예제에서는 I/O 요청을 완료하는 프라이빗 루틴을 호출합니다.

BOOLEAN  hasTransitioned;
PDMA_TRANSFER_ELEMENT  dteVA;
ULONG  length;
//
// Use "DMA Clear-Count Mode" to get the complementary 
// transferred byte count.
//
length = WdfDmaTransactionGetCurrentDmaTransferLength(dmaTransaction);
dteVA = (PDMA_TRANSFER_ELEMENT) devExt->ReadCommonBufferBase;
while(dteVA->DescPtr.LastElement == FALSE) {
    length -= dteVA->TransferSize;
    dteVA++;
}
length -= dteVA->TransferSize;
//
// Indicate that this DMA operation has completed.
//
hasTransitioned = 
    WdfDmaTransactionDmaCompletedWithLength(
                                            dmaTransaction,
                                            length,
                                            &status
                                            ); 
if (hasTransitioned) {
    //
    // Complete this DMA transaction.
    //
    devExt->CurrentReadDmaTransaction = NULL;
    PLxReadRequestComplete(
                           dmaTransaction,
                           status
                           );
}

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
머리글 wdfdmatransaction.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조)
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

추가 정보

WdfDmaTransactionCreate

WdfDmaTransactionDmaCompleted

WdfDmaTransactionGetCurrentDmaTransferLength