[KMDF에만 적용]
일반적으로 프레임워크 기반 드라이버는 미리 맵 레지스터를 예약하지 않습니다. 그러나 특정 상황에서 드라이버는 이러한 리소스를 미리 예약해야 할 수 있습니다.
Windows 8 이상에서 실행되는 프레임워크 기반 드라이버는 패킷 또는 시스템 프로필을 지정하는 DMA 인에이블러에 대해 지정된 수의 맵 레지스터를 예약할 수 있습니다. 이렇게 하려면 드라이버가 WdfDmaTransactionAllocateResources 호출하고 EvtReserveDma 콜백 함수를 등록합니다.
프레임워크는 맵 레지스터 및 WDM DMA 어댑터의 잠금을 예약한 경우 드라이버의 EvtReserveDma 함수를 호출합니다. 그런 다음 드라이버는 트랜잭션 개체를 마지막으로 해제하기 전에 동일한 트랜잭션 개체를 사용하여 트랜잭션을 여러 번 초기화하고 시작할 수 있습니다. DMA 리소스를 시스템에 다시 릴리스하기 위해 드라이버는 WdfDmaTransactionFreeResources호출합니다.
트랜잭션에 필요한 맵 레지스터 수를 확인하기 위해 드라이버는 WdfDmaTransactionAllocateResources호출하기 전에 WdfDmaTransactionGetTransferInfo 호출할 수 있습니다. 드라이버는 WdfDmaTransactionGetTransferInfo호출하기 전에 트랜잭션을 초기화해야 합니다.
다음 단계에서는 드라이버가 지정된 트랜잭션에서 단독으로 사용하기 위해 DMA 인에이블러를 예약하고 해제하는 방법을 보여 줍니다.
드라이버는 I/O 요청을 받습니다.
드라이버의 요청 처리기는 WdfDmaTransactionCreate 호출하여 요청에 대한 DMA 트랜잭션 개체를 만들 있습니다.
드라이버의 요청 처리기는 리소스를 예약하기 위해 WdfDmaTransactionAllocateResources를 호출합니다.
프레임워크는 요청된 리소스를 예약한 경우 EvtReserveDma 호출합니다.
EvtReserveDma드라이버는 WdfDmaTransactionInitializeUsingRequest 호출하거나 WdfDmaTransactionInitialize 호출하여 트랜잭션 개체를 초기화합니다.
EvtReserveDma드라이버는 WdfDmaTransactionExecute 메서드를 호출하여 트랜잭션을 시작합니다. 트랜잭션에 예약된 리소스가 있으므로 프레임워크는 즉시 드라이버의 EvtProgramDma 콜백 함수를 호출합니다.
EvtInterruptDpc 또는 EvtDmaTransactionDmaTransferComplete에서 드라이버는 WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength또는 WdfDmaTransactionDmaCompletedFinal를 호출한 후에 WdfObjectDelete 또는 WdfDmaTransactionRelease를 호출합니다. 드라이버는 트랜잭션이 완료되거나 취소될 때까지 트랜잭션을 삭제하거나 해제해서는 안됩니다. 이 단계가 완료되면 맵 레지스터는 예약된 상태로 유지됩니다.
드라이버는 필요에 따라 5~7단계를 반복할 수 있습니다.
드라이버에 더 이상 예약이 필요하지 않은 경우, 드라이버는 WdfDmaTransactionFreeResources를 EvtInterruptDpc 또는 EvtDmaTransactionDmaTransferComplete에서 호출합니다. 또는 드라이버는 EvtReserveDma 이벤트 콜백 함수에서 WdfDmaTransactionFreeResources를 호출할 수 있습니다.