다음을 통해 공유


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 메서드는 WdfDmaTransactionDmaCompleted동일하게 동작합니다. 단, 드라이버는 전송된 바이트 수를 보고하는 디바이스에 대해 WdfDmaTransactionDmaCompletedWithLength 호출합니다. 프레임워크는 보고된 바이트 수를 사용하여 트랜잭션을 완료하기 위해 여러 전송이 필요한 경우 지정된 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