FwpsInjectTransportSendAsync0 함수(fwpsk.h)

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

참고FwpsInjectTransportSendAsync0 은 Windows Vista 이상에서 사용되는 FwpsInjectTransportSendAsync 의 특정 버전입니다. 자세한 내용은 WFP Version-Independent 이름 및 특정 버전의 Windows 대상 지정 을 참조하세요. Windows 7의 경우 FwpsInjectTransportSendAsync1 을 사용할 수 있습니다.
 

구문

NTSTATUS FwpsInjectTransportSendAsync0(
  [in]           HANDLE                      injectionHandle,
  [in, optional] HANDLE                      injectionContext,
  [in]           UINT64                      endpointHandle,
  [in]           UINT32                      flags,
  [in, optional] FWPS_TRANSPORT_SEND_PARAMS0 *sendArgs,
  [in]           ADDRESS_FAMILY              addressFamily,
  [in]           COMPARTMENT_ID              compartmentId,
  [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 함수를 호출하여 가져올 수 있습니다.

[in] endpointHandle

패킷을 삽입할 송신 데이터 경로의 스택 전송 엔드포인트를 나타내는 핸들입니다. 이 엔드포인트 핸들은 의 transportEndpointHandle 멤버를 통해 콜아웃에 제공됩니다. 설명 선 드라이버의 classifyFn 설명선 함수에 전달되는 구조체를 FWPS_INCOMING_METADATA_VALUES0. 설명선 드라이버는 제공된 핸들을 사용하여 스택 엔드포인트와 연결된 소켓이 닫히고 핸들이 더 이상 유효하지 않게 되기 전에 가능한 한 빨리 복제된 패킷을 데이터 경로에 다시 삽입해야 합니다.

[in] flags

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

[in, optional] sendArgs

에 대한 포인터입니다. 현재 아웃바운드 패킷의 속성을 지정하는 FWPS_TRANSPORT_SEND_PARAMS0 구조체입니다. 삽입할 순 버퍼 목록에 IP 헤더가 포함된 경우에만 NULL 일 수 있습니다(예: 패킷이 원시 소켓을 통해 전송되는 경우).

[in] addressFamily

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

AF_INET

IPv4 주소 패밀리입니다.

AF_INET6

IPv6 주소 패밀리입니다.

[in] compartmentId

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

[in, out] netBufferList

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

[in] completionFn

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

[in, optional] completionContext

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

반환 값

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

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

설명

설명선 드라이버는 FwpsInjectNetworkSendAsync0 함수를 호출하여 전송, 데이터그램 데이터 또는 ICMP 오류 계층의 패킷 데이터를 송신 데이터 경로에 삽입합니다. 이러한 계층에서 IP 헤더가 아직 형성되지 않았을 수 있으며 IPsec 정책이 활성화되면 패킷 데이터가 암호화되거나 서명되지 않습니다. 따라서 이 함수는 IPsec 사용 환경에서 패킷 검사에 사용하는 데 이상적입니다.

이 함수는 비동기적으로 실행할 수 있습니다.

반환 값이 STATUS_SUCCESS 않으면 완료 함수가 호출되지 않습니다. 이 경우 netBufferList 에서 가리키는 순 버퍼 목록을 FwpsFreeNetBufferList0 또는 FwpsFreeCloneNetBufferList0 호출로 해제해야 합니다.

일반적으로 콜아웃 드라이버는 패킷 데이터를 수정할 때 네트워크 스택에 데이터를 삽입합니다. 설명선 드라이버가 패킷 데이터를 수정하는 방법에 대한 자세한 내용은 설명선 드라이버 작업을 참조하세요.

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

삽입된 패킷을 콜아웃 드라이버에 다시 표시할 수 있습니다. 무한 루프를 방지하려면 드라이버는 classifyFn 설명선 함수를 호출하기 전에 먼저 FwpsQueryPacketInjectionState0 함수를 호출하고 삽입 상태가 FWPS_PACKET_INJECTION_STATE FWPS_PACKET_INJECTED_BY_SELF 또는 FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF 설정된 패킷을 허용해야 합니다.

endpointHandle 매개 변수 및 에 선언된 멤버sendArgs 매개 변수가 가리키는 FWPS_TRANSPORT_SEND_PARAMS0 구조체는 다음 네트워크 계층의 설명선에 제공됩니다.

FWPS_LAYER_OUTBOUND_TRANSPORT_V4
FWPS_LAYER_OUTBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4(FWP_DIRECTION_OUTBOUND 아웃바운드 방향을 지정한 경우)
FWPS_LAYER_DATAGRAM_DATA_V6(FWP_DIRECTION_OUTBOUND 아웃바운드 방향을 지정한 경우)
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6

다음 두 가지 모두 true인 경우 데이터그램은 원시 소켓에 속합니다.

다음 네트워크 계층에서 데이터그램이 원시 소켓에 속하는 경우 netBufferList 가 가리키는 순 버퍼 목록을 IP 헤더에서 시작하도록 조정해야 합니다(순 버퍼 목록 앞에 추가되어야 합니다).

  • FWPS_LAYER_DATAGRAM_DATA_V4(FWP_DIRECTION_OUTBOUND 아웃바운드 방향을 지정한 경우)
  • FWPS_LAYER_DATAGRAM_DATA_V6(FWP_DIRECTION_OUTBOUND 아웃바운드 방향을 지정한 경우)

요구 사항

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

추가 정보

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_TRANSPORT_SEND_PARAMS0

FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsInjectTransportSendAsync1

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn