Share via


NDIS_PD_POST_AND_DRAIN_BUFFER_LIST 콜백 함수(ndis.h)

PD(PacketDirect) 플랫폼은 PD 지원 미니포트 드라이버의 PDPostAndDrainBufferList 함수를 호출하여 PD_BUFFER 구조를 PD 전송/수신 큐에 게시하고 이전에 게시된 PD_BUFFER 구조체를 드레이닝합니다.

참고NDIS_PD_POST_AND_DRAIN_BUFFER_LIST 형식을 사용하여 함수를 선언해야 합니다. 자세한 내용은 다음 예제 섹션을 참조하세요.

 

구문

NDIS_PD_POST_AND_DRAIN_BUFFER_LIST NdisPdPostAndDrainBufferList;

VOID() NdisPdPostAndDrainBufferList(
  [in, out] NDIS_PD_QUEUE *Queue,
  [in, out] PD_BUFFER **PostBufferListHead,
  [in, out] PD_BUFFER ***DrainBufferListTail,
  [in]      ULONG MaxDrainCount
)
{...}

매개 변수

[in, out] Queue

게시된 버퍼를 수신하고 완료된 버퍼가 제거되는 전송 또는 수신 큐에 대한 포인터입니다.

[in, out] PostBufferListHead

게시물 목록의 머리입니다. 공급자는 이 목록의 버퍼를 제거하고 에 추가합니다.

[in, out] DrainBufferListTail

드레이닝 목록의 꼬리입니다. 공급자는 에서 완료된 버퍼를 제거하고 이 목록에 추가합니다.

[in] MaxDrainCount

드레이닝할 PD_BUFFER 구조체의 최대 양입니다. 공급자는 이 금액을 초과하지 않아야 합니다. 단일 L2 패킷 수를 구성하는 부분 PD_BUFFER 구조 집합은 1입니다.

반환 값

이 콜백 함수는 값을 반환하지 않습니다.

설명

공급자는 PostBufferList에서 버퍼를 제거하고 목록의 헤드 버퍼로 시작하여 PostBufferList가 비어 있거나 큐가 가득 차거나 거의 가득 찼을 때까지 다음 버퍼로 진행하여 큐에 배치합니다. 공급자가 PostListHead로 고급화되고 새 목록 헤드를 호출자에게 반환합니다. 또한 공급자는 큐에서 완료된 버퍼를 제거하고 DrainBufferList의 꼬리에 삽입하고 새 DrainBufferList 꼬리를 클라이언트에 반환합니다.

참고 공급자는 게시되는 버퍼에 대한 공간을 열기 위해 가능한 한 많은 버퍼를 드레이닝해야 합니다. PostBufferList 및 DrainBufferList는 연결되지 않은 버퍼 목록으로 보장됩니다(클라이언트는 버퍼 목록의 헤드를 PostBufferListHead로 제공하지 않으며 DrainBufferListTail과 동일한 목록의 꼬리를 제공하지 않음).
 
또한 클라이언트는 빈 포스트 버퍼 목록을 전달하여 새 버퍼를 게시하지 않고 완료된 버퍼를 드레이닝할 수 있습니다. 또한 클라이언트는 완료된 버퍼를 드레이닝하지 않고 새 버퍼를 게시하도록 MaxDrainCount를 0으로 설정할 수도 있습니다. 드물게 클라이언트는 빈 포스트 버퍼 목록과 MaxDrainCount를 모두 0으로 사용하여 호출을 호출할 수 있습니다. 공급자는 달리 가정하고 이러한 호출을 작업 없음과 같이 제대로 처리해서는 안됩니다.

PDPostAndDrainBufferList 함수를 정의하려면 먼저 정의 중인 함수의 형식을 식별하는 함수 선언을 제공해야 합니다. Windows는 드라이버에 대한 함수 형식 집합을 제공합니다. 함수 형식을 사용하여 함수를 선언하면 드라이버에 대한 코드 분석, SDV( 정적 드라이버 검증 도구 ) 및 기타 확인 도구에서 오류를 찾는 데 도움이 되며 Windows 운영 체제용 드라이버를 작성하기 위한 요구 사항입니다.

예를 들어 " MyPDPostAndDrainBufferList"라는 PDPostAndDrainBufferList 함수를 정의하려면 다음 코드 예제와 같이 NDIS_PD_POST_AND_DRAIN_BUFFER_LIST 형식을 사용합니다.

NDIS_PD_POST_AND_DRAIN_BUFFER_LIST MyPDPostAndDrainBufferList;

그런 다음 다음과 같이 함수를 구현합니다.

_Use_decl_annotations_
VOID
 MyPDPostAndDrainBufferList(
    NDIS_PD_QUEUE*  Queue,
    PD_BUFFER**  PostBufferListHead,
    PD_BUFFER*** DrainBufferListTail,
    ULONG  MaxDrainCount
    )
  {...}

NDIS_PD_POST_AND_DRAIN_BUFFER_LIST 함수 형식은 Ntddndis.h 헤더 파일에 정의되어 있습니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 Use_decl_annotations 주석을 추가해야 합니다. Use_decl_annotations 주석은 헤더 파일의 NDIS_PD_POST_AND_DRAIN_BUFFER_LIST 함수 형식에 적용되는 주석이 사용되도록 합니다. 함수 선언 요구 사항에 대한 자세한 내용은 NDIS 드라이버에 함수 역할 형식을 사용하여 함수 선언을 참조하세요.

Use_decl_annotations 대한 자세한 내용은 함수 동작에 주석을 추가를 참조하세요.

다음은 이 함수에 대한 포인터 간접 작업을 보여 주는 예제 코드 조각입니다.

PD_BUFFER* PostHead = NULL;
PD_BUFFER** PostTail = &PostHead;
PD_BUFFER* DrainHead = NULL;
PD_BUFFER** DrainTail = &DrainHead;

PD_BUFFER* bufX = <allocated PD_BUFFER>;

bufX->NextPDBuffer = NULL;
*PostTail = bufX;
PostTail = &bufX->NextPDBuffer;

// BEFORE:
//PostHead == bufX
//PostTail == &bufZ->NextPDBuffer
//DrainHead == NULL
//DrainTail == &DrainHead

NDIS_PD_POST_AND_DRAIN_BUFFER_LIST(
          Queue,
          &PostHead,
          &DrainTail,
          32);

// AFTER:
//PostHead == bufY
//PostTail == &bufZ->NextPDBuffer
//DrainHead == buf1
//DrainTail == &buf5->NextPDBuffer

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10
지원되는 최소 서버 Windows Server 2016
대상 플랫폼 Windows
헤더 ndis.h
IRQL <= DISPATCH_LEVEL