다음을 통해 공유


WdfDmaEnablerGetFragmentLength 함수(wdfdmaenabler.h)

[KMDF에만 적용]

WdfDmaEnablerGetFragmentLength 메서드는 운영 체제가 단일 DMA 전송에 대해 지원하는 최대 전송 길이를 반환합니다.

구문

size_t WdfDmaEnablerGetFragmentLength(
  [in] WDFDMAENABLER     DmaEnabler,
  [in] WDF_DMA_DIRECTION DmaDirection
);

매개 변수

[in] DmaEnabler

드라이버가 WdfDmaEnablerCreate에 대한 이전 호출에서 가져온 DMA 인에이블러 개체에 대한 핸들입니다.

[in] DmaDirection

DMA 전송 작업의 방향을 지정하는 WDF_DMA_DIRECTION 형식의 값입니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

반환 값

WdfDmaEnablerGetFragmentLength 는 운영 체제에서 지원할 수 있는 DMA 전송의 최대 길이(바이트)를 반환하거나 DmaDirection 매개 변수의 값이 잘못된 경우 0을 반환합니다.

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

설명

운영 체제에서 지원할 수 있는 최대 DMA 전송 길이는 사용 가능한 지도 레지스터 수에 따라 달라집니다. 충분한 맵 레지스터를 사용할 수 있는 경우 WdfDmaEnablerGetFragmentLengthWdfDmaEnablerGetMaximumLength 가 반환하는 것과 동일한 값을 반환합니다. 그렇지 않으면 WdfDmaEnablerGetFragmentLength 가 반환하는 값이 WdfDmaEnablerGetMaximumLength 가 반환하는 값보다 작습니다.

드라이버는 다음과 같이 BYTE_TO_PAGES 매크로를 사용하여 사용할 수 있는 지도 레지스터 수를 확인할 수 있습니다.

BYTE_TO_PAGES(WdfDmaEnablerGetFragmentLength()) + 1

드라이버가 WdfDmaEnablerCreate를 호출할 때 이중 프로필을 지정한 경우 DmaDirection 매개 변수의 값은 읽기 작업의 최대 전송 길이를 가져오려면 WdfDmaDirectionReadFromDevice 이고 쓰기 작업의 최대 전송 길이를 얻으려면 WdfDmaDirectionWriteToDevice 여야 합니다. 드라이버에서 이중 프로필을 지정하지 않은 경우 드라이버는 DmaDirection에 WdfDmaDirectionReadFromDevice 또는 WdfDmaDirectionWriteToDevice를 지정할 수 있습니다.

드라이버의 디바이스가 이중 작업을 지원하는 경우 WdfDmaEnablerGetFragmentLengthDmaDirection 매개 변수가 지정하는 읽기 및 쓰기 방향에 대해 다른 값을 반환할 수 있습니다. 이 차이점은 프레임워크가 각 방향에 대해 별도의 어댑터 개체 를 만들고 운영 체제가 각 어댑터 개체에 다른 수의 지도 레지스터를 제공할 수 있기 때문입니다.

예제

다음 코드 예제에서는 NIC 디바이스의 읽기 작업을 처리하는 데 필요한 최소 맵 레지스터 수를 결정하고, 사용 가능한 지도 레지스터 수를 계산하고, 할당된 맵 레지스터 수가 부족한 경우 오류를 보고합니다.

ULONG  minimumMapRegisters;
ULONG  maxLengthSupported;
ULONG  mapRegistersAllocated;

miniMapRegisters = BYTES_TO_PAGES(NIC_MAX_PACKET_SIZE) + 1;

maxLengthSupported = 
    (ULONG) WdfDmaEnablerGetFragmentLength(
                                           FdoData->WdfDmaEnabler,
                                           WdfDmaDirectionReadFromDevice
                                           );

mapRegistersAllocated = BYTES_TO_PAGES(maxLengthSupported) + 1;

if (mapRegistersAllocated < minimumMapRegisters) {
    status = STATUS_INSUFFICIENT_RESOURCES;
    return status;
}

요구 사항

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

추가 정보

WDF_DMA_DIRECTION

WdfDmaEnablerCreate

WdfDmaEnablerGetMaximumLength