대기 시간은 일부 네트워크 작업에 내재되어 있습니다. 이러한 대기 시간으로 인해 미니포트 드라이버에서 제공하는 대부분의 상위 에지 함수와 프로토콜 드라이버의 하위 에지 함수는 비동기 작업을 지원하도록 설계되었습니다. 시간이 많이 걸리는 작업이 완료될 때까지 루프에서 대기하는 CPU 주기를 낭비하거나 하드웨어 이벤트를 신호로 알리는 대신 네트워크 드라이버는 대부분의 작업을 비동기적으로 처리하는 기능을 사용합니다.
비동기 네트워크 I/O는 완성 함수를 사용하여 지원 됩니다 . 다음 예제에서는 네트워크 보내기 작업에 완료 함수를 사용하는 방법을 보여 주지만 프로토콜 또는 미니포트 드라이버에서 수행하는 다른 많은 작업에 대해 동일한 메커니즘이 존재합니다.
프로토콜 드라이버가 NDIS를 호출하여 패킷을 보내면 미니포트 드라이버의 MiniportSendNetBufferLists 함수를 호출하면 미니포트 드라이버는 이 요청을 즉시 완료하고 적절한 상태 값을 반환할 수 있습니다. 동기 작업의 경우 데이터 전송이 성공적으로 완료되면 NDIS_STATUS_SUCCESS, 자원이 부족할 때는 NDIS_STATUS_RESOURCES, 특정 실패가 발생하면 NDIS_STATUS_FAILURE 응답이 가능합니다.
그러나 미니포트 드라이버(또는 NDIS)가 패킷을 큐에 대기하고 NIC가 보내기 작업의 결과를 나타낼 때까지 기다리는 동안 보내기 작업을 완료하는 데 다소 시간이 걸릴 수 있습니다. 미니포트 드라이버 MiniportSendNetBufferLists 함수는 NDIS_STATUS_PENDING 상태 값을 반환하여 이 작업을 비동기적으로 처리할 수 있습니다. 미니포트 드라이버가 보내기 작업을 완료하면 완료 함수 인 NdisMSendNetBufferListsComplete를 호출하여 전송된 패킷 설명자에 포인터를 전달합니다. 이 정보는 프로토콜 드라이버에 전달되어 완료를 알 수 있습니다.
대부분의 드라이버 작업은 유사한 완료 함수를 통해 비동기 작업을 지원하여 완료하는 데 시간이 오래 걸릴 수 있습니다. 이러한 함수에는 NdisMXxxComplete 형식의 이름이 있습니다.
완성 함수는 다음 목적을 위해서도 제공됩니다.
구성을 설정하고 조회합니다.
하드웨어를 다시 설정합니다.
상태를 나타냅니다.
받은 데이터를 나타냅니다.
받은 데이터를 전송합니다.