다음을 통해 공유


공통 버퍼 사용

[KMDF에만 적용]

DMA 디바이스용 드라이버는 디바이스와 드라이버가 모두 액세스할 수 있는 버퍼 공간을 할당해야 하는 경우가 있습니다. 예를 들어 디바이스는 바이트 수와 같은 전송 정보를 이 버퍼 공간에 쓸 수 있으며 드라이버는 이를 읽고 전송된 바이트 수를 확인할 수 있습니다. 이 유형의 버퍼 공간을 공통 버퍼라고 합니다.

공통 버퍼를 할당하려면 드라이버의 EvtDriverDeviceAdd 콜백 함수:

다음 코드 예제는 PLX9x5x 샘플의 Init.c 파일에서 가져옵니다. 이 코드는 KMDF 드라이버가 공통 버퍼 공간을 할당하는 방법을 보여 줍니다.

// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize = 
         sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
                                DevExt->WriteCommonBufferSize,
                                WDF_NO_OBJECT_ATTRIBUTES, 
                                &DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
    . . . //Error-handling code omitted 
    }
DevExt->WriteCommonBufferBase = 
             WdfCommonBufferGetAlignedVirtualAddress(
                      DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA = 
             WdfCommonBufferGetAlignedLogicalAddress(
                      DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);

드라이버가 WdfDmaEnablerCreate를 호출하기 전에 WdfDeviceSetAlignmentRequirement를 호출하는 경우 WdfDmaEnablerCreate가 만드는 버퍼는 드라이버가 WdfDeviceSetAlignmentRequirement에 지정한 메모리 주소 경계에 맞춰집니다. 그렇지 않으면 공통 버퍼가 단어 주소 경계에 맞춰집니다. 또는 드라이버가 WdfCommonBufferCreateWithConfig 를 호출하여 단일 버퍼에 대한 맞춤을 지정할 수 있습니다.

드라이버가 할당한 공통 버퍼의 길이를 가져오기 위해 드라이버는 WdfCommonBufferGetLength를 호출할 수 있습니다.

드라이버가 공통 버퍼 사용을 마치면 드라이버는 WdfObjectDelete를 호출합니다.