FwpsInjectTransportReceiveAsync0 함수(fwpsk.h)

FwpsInjectTransportReceiveAsync0 함수는 전송, 데이터그램 데이터 또는 ICMP 오류 계층의 패킷 데이터를 수신 데이터 경로에 삽입합니다.

참고FwpsInjectTransportReceiveAsync0특정 버전의 FwpsInjectTransportReceiveAsync입니다. 자세한 내용은 WFP Version-Independent 이름 및 특정 버전의 Windows 대상 지정 을 참조하세요.
 

구문

NTSTATUS FwpsInjectTransportReceiveAsync0(
  [in]           HANDLE                injectionHandle,
  [in, optional] HANDLE                injectionContext,
                 PVOID                 reserved,
  [in]           UINT32                flags,
  [in]           ADDRESS_FAMILY        addressFamily,
  [in]           COMPARTMENT_ID        compartmentId,
  [in]           IF_INDEX              interfaceIndex,
  [in]           IF_INDEX              subInterfaceIndex,
  [in, out]      NET_BUFFER_LIST       *netBufferList,
  [in]           FWPS_INJECT_COMPLETE0 completionFn,
  [in, optional] HANDLE                completionContext
);

매개 변수

[in] injectionHandle

에 대한 호출로 이전에 만든 삽입 핸들 FwpsInjectionHandleCreate0 함수입니다.

[in, optional] injectionContext

삽입 컨텍스트에 대한 선택적 핸들입니다. 지정된 경우 패킷 삽입 상태 FWPS_PACKET_INJECTION_STATE FWPS_PACKET_INJECTED_BY_SELF 또는FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELFFwpsQueryPacketInjectionState0 함수를 호출하여 가져올 수 있습니다.

reserved

예약되어 있습니다. 콜아웃 드라이버는 이 매개 변수를 0으로 설정해야 합니다.

[in] flags

예약되어 있습니다. 콜아웃 드라이버는 이 매개 변수를 0으로 설정해야 합니다.

[in] addressFamily

다음 주소 패밀리 중 하나입니다.

AF_INET

IPv4 주소 패밀리입니다.

AF_INET6

IPv6 주소 패밀리입니다.

[in] compartmentId

패킷 데이터가 삽입되는 라우팅 구획의 식별자이며 COMPARTMENT_ID 형식으로 지정됩니다. 이 식별자는 의 compartmentId 멤버를 통해 콜아웃에 제공됩니다. 설명 선 드라이버의 classifyFn 설명선 함수에 전달되는 구조체를 FWPS_INCOMING_METADATA_VALUES0. compartmentId 멤버를 설명선에 사용할 수 있는 경우 FWPS_METADATA_FIELD_COMPARTMENT_IDcurrentMetadataValues 멤버에 설정됩니다. 그렇지 않으면 이 매개 변수를 UNSPECIFIED_COMPARTMENT_ID 설정합니다.

[in] interfaceIndex

원래 패킷 데이터를 받은 인터페이스의 인덱스입니다. 원래 패킷이 표시된 동일한 인터페이스에 패킷을 삽입하는 경우 설명선 드라이버는 들어오는 데이터 값 중 하나로 이 매개 변수에 대한 classifyFn 설명선 함수에 전달되는 인터페이스 인덱스의 값을 사용해야 합니다.

[in] subInterfaceIndex

원래 패킷 데이터를 받은 하위 표면의 인덱스입니다. 원래 패킷이 표시된 동일한 하위 서체에 패킷을 삽입하는 경우 설명선 드라이버는 들어오는 데이터 값 중 하나로 이 매개 변수의 classifyFn 설명선 함수에 전달되는 하위 표면 인덱스의 값을 사용해야 합니다.

[in, out] netBufferList

삽입되는 패킷 데이터를 설명하는 NET_BUFFER_LIST 구조체에 대한 포인터입니다. 설명선 드라이버는 FwpsAllocateCloneNetBufferList0 함수 또는 FwpsAllocateNetBufferAndNetBufferList0 함수를 호출하여 패킷 데이터를 삽입하는 데 사용할 NET_BUFFER_LIST구조를 할당합니다. NET_BUFFER_LIST 구조는 IP 헤더로 시작해야 합니다.

[in] completionFn

콜아웃 드라이버에서 제공하는 completionFn 콜아웃 함수에 대한 포인터입니다. 필터 엔진은 netBufferList 매개 변수에 설명된 패킷 데이터가 네트워크 스택에 삽입된 후 이 함수를 호출합니다.

[in, optional] completionContext

completionFn 매개 변수가 가리키는 설명선 함수에 전달되는 설명선 드라이버 제공 컨텍스트에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

반환 값

FwpsInjectTransportReceiveAsync0 함수는 다음 NTSTATUS 코드 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS
패킷 데이터 삽입이 성공적으로 시작되었습니다. 필터 엔진이 네트워크 스택에 패킷 데이터 삽입을 완료한 후 또는 이후에 오류가 발생한 경우 필터 엔진은 완료 함수를 호출합니다. 오류가 발생할 경우 완료된 NET_BUFFER_LIST 구조체의 상태 멤버는 실패 이유를 나타냅니다.
STATUS_FWP_TCPIP_NOT_READY
TCP/IP 네트워크 스택이 패킷 데이터 삽입을 허용할 준비가 되지 않았습니다.
STATUS_FWP_INJECT_HANDLE_CLOSING
삽입 핸들이 닫혀 있습니다.
기타 상태 코드
오류가 발생했습니다.

설명

설명선 드라이버는 FwpsInjectTransportReceiveAsync0 함수를 호출하여 전송, 데이터그램 데이터 또는 ICMP 오류 계층의 패킷 데이터를 수신 데이터 경로에 삽입합니다. 이 함수는 비동기적으로 실행할 수 있습니다. 일반적으로 콜아웃 드라이버는 패킷 데이터를 수정할 때 네트워크 스택에 데이터를 삽입합니다. 설명선 드라이버가 패킷 데이터를 수정하는 방법에 대한 자세한 내용은 설명선 드라이버 작업을 참조하세요.

설명선 드라이버가 FwpsInjectTransportReceiveAsync0과 함께 삽입할 패킷을 수정한 경우 를 호출해야 합니다. FwpsConstructIpHeaderForTransportPacket0 함수는 IP 및 상위 수준 프로토콜(TCP, UDP 및 ICMP) 체크섬을 수정합니다. FwpsConstructIpHeaderForTransportPacket0headerIncludeHeaderSize 매개 변수는 의 ipHeaderSize 멤버와 동일한 값이어야 합니다. FWPS_INCOMING_METADATA_VALUES0 설명선 드라이버의 classifyFn 설명선 함수의 inMetaValues 매개 변수에 전달되는 구조체입니다.

반환 값이 STATUS_SUCCESS 않으면 완료 함수가 호출되지 않습니다. 이 경우 netBufferList 가 가리키는 net 버퍼 목록은 FwpsFreeNetBufferList0 또는 를 호출하여 해제해야 합니다. FwpsFreeCloneNetBufferList0.

원래 인바운드 패킷 데이터가 전송 계층에서 원래 처리되었을 때 IPsec 정책 적용을 받은 경우 이 함수에 의해 주입된 복제된 패킷은 네트워크 스택을 다시 입력할 때 IPsec 확인을 무시합니다. FwpsAllocateNetBufferAndNetBufferList0 함수를 사용하는 로컬로 생성된 인바운드 패킷도 IPsec 확인을 무시합니다.

IPsec이 먼저 인바운드 패킷을 처리할 수 있도록 하려면 전송 계층 데이터를 검사하는 설명선에 범용 하위 계층보다 FWPS_FILTER0 구조에서 subLayerWeight 값이 낮아야 합니다. 또한 설명선 드라이버는 의 조합이 있는 터널 모드 패킷을 가로채서는 안 됩니다. FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 멤버( isTunnelMode && ! isDeTunneled ) 은 에서 반환됩니다. FwpsGetPacketListSecurityInformation0 함수입니다. 설명선 드라이버는 패킷이 detunneled될 때까지 기다린 다음 전송 계층 또는 정방향 계층에서 패킷을 가로채야 합니다.

TCP 프로토콜 잠금 의미 체계로 인해 TCP는 모든 전송 계층 또는 동등한 계층에서만 Out of Band를 삽입할 수 있으므로 FwpsInjectTransportReceiveAsync0 및 FwpsInjectTransportSendAsync0은 DPC에서 큐에 대기하고 실행해야 합니다.

FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED 메타데이터 플래그가 설정되지 않은 경우 다음 전송 계층 중 하나에서 이 함수를 호출할 수 있습니다.

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

FWPS_LAYER_DATAGRAM_DATA_V4 ( FWP_DIRECTION_INBOUND 인바운드 방향을 지정한 경우)

FWPS_LAYER_DATAGRAM_DATA_V6 ( FWP_DIRECTION_INBOUND 인바운드 방향을 지정한 경우)

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

그렇지 않으면 보류 중인 ALE 작업이 FwpsPendOperation0 호출로 시작되고 FwpsCompleteOperation0 호출로 완료된 후 다음 ALE(애플리케이션 계층 적용) 계층에서 이 함수를 호출해야 합니다.

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

삽입할 net 버퍼 목록은 netBufferList 인수로 FwpsCompleteOperation0 함수에 전달되어야 합니다.

삽입된 패킷을 콜아웃 드라이버에 다시 표시할 수 있습니다. 무한 반복을 방지하려면 드라이버가 먼저 를 호출해야 합니다. FwpsQueryPacketInjectionState0 함수는 classifyFn 설명선 함수 호출을 진행하기 전에 함수이며, 드라이버는 삽입 상태가 FWPS_PACKET_INJECTION_STATE FWPS_PACKET_INJECTED_BY_SELF 또는 FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF 설정되지 않은 패킷을 통과하도록 허용해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 fwpsk.h(Fwpsk.h 포함)
라이브러리 Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

추가 정보

FWPS_FILTER0

FWPS_FILTER_CONDITION0

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCompleteOperation0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsGetPacketListSecurityInformation0

FwpsInjectNetworkSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsPendOperation0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn