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 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 꼬리를 클라이언트에 반환합니다.
예
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 |