FwpsInjectTransportReceiveAsync0 함수(fwpsk.h)
FwpsInjectTransportReceiveAsync0 함수는 전송, 데이터그램 데이터 또는 ICMP 오류 계층의 패킷 데이터를 수신 데이터 경로에 삽입합니다.
통사론
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_STATEFWPS_PACKET_INJECTED_BY_SELF 또는 FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF때 FwpsQueryPacketInjectionState0 함수를 호출하여 가져올 수 있습니다.
reserved
예약. 설명선 드라이버는 이 매개 변수를 0으로 설정해야 합니다.
[in] flags
예약. 설명선 드라이버는 이 매개 변수를 0으로 설정해야 합니다.
[in] addressFamily
다음 주소 패밀리 중 하나입니다.
AF_INET
IPv4 주소 패밀리입니다.
AF_INET6
IPv6 주소 패밀리입니다.
[in] compartmentId
패킷 데이터가 삽입되는 라우팅 구획의 식별자이며 COMPARTMENT_ID 형식으로 지정됩니다. 이 식별자는 구획Id 멤버를 통해 설명선에 제공됩니다. 설명선 드라이버의 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 코드 중 하나를 반환합니다.
반환 코드 | 묘사 |
---|---|
|
패킷 데이터 주입이 성공적으로 시작되었습니다. 필터 엔진이 패킷 데이터를 네트워크 스택에 삽입하는 작업이 완료된 후 또는 이후에 오류가 발생한 경우 필터 엔진에서 완료 함수를 호출합니다. 오류가 발생할 경우 완료된 NET_BUFFER_LIST 구조의 상태 멤버는 실패 이유를 나타냅니다. |
|
TCP/IP 네트워크 스택은 패킷 데이터 주입을 허용할 준비가 되지 않았습니다. |
|
삽입 핸들이 닫히고 있습니다. |
|
오류가 발생했습니다. |
발언
설명선 드라이버는 FwpsInjectTransportReceiveAsync0 함수를 호출하여 전송, 데이터그램 데이터 또는 ICMP 오류 계층의 패킷 데이터를 수신 데이터 경로에 삽입합니다. 이 함수는 비동기적으로 실행할 수 있습니다. 설명선 드라이버는 일반적으로 패킷 데이터를 수정할 때 네트워크 스택에 데이터를 삽입합니다. 설명선 드라이버가 패킷 데이터를 수정하는 방법에 대한 자세한 내용은 설명선 드라이버 작업참조하세요.
설명선 드라이버가 FwpsInjectTransportReceiveAsync0함께 삽입할 패킷을 수정한 경우 다음을 호출해야 합니다. FwpsConstructIpHeaderForTransportPacket0 함수를 사용하여 IP 및 상위 수준 프로토콜(TCP, UDP 및 ICMP) 체크섬을 수정합니다. FwpsConstructIpHeaderForTransportPacket0headerIncludeHeaderSize 매개 변수는 다음의 ipHeaderSize 멤버와 동일한 값이어야 합니다. 설명선 드라이버의 classifyFn 설명선 함수의 inMetaValues 매개 변수에 전달되는 FWPS_INCOMING_METADATA_VALUES0 구조체입니다.
반환 값이 STATUS_SUCCESS않으면 완료 함수가 호출되지 않습니다. 이 경우 netBufferList 가리키는 순 버퍼 목록은 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
삽입할 순 버퍼 목록은 netBufferList 인수로 FwpsCompleteOperation0 함수에 전달되어야 합니다.
삽입된 패킷을 설명선 드라이버에 다시 표시할 수 있습니다. 무한 루프를 방지하려면 드라이버가 먼저 다음을 호출해야 합니다. FwpsQueryPacketInjectionState0 함수를 classifyFn 설명선 함수에 대한 호출을 계속하기 전에 드라이버에서 삽입 상태가 FWPS_PACKET_INJECTED_BY_SELF 설정되거나 FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELFFWPS_PACKET_INJECTION_STATE 패킷이 변경되지 않은 상태로 전달되도록 허용해야 합니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista부터 사용할 수 있습니다. |
대상 플랫폼 | 보편적 |
헤더 | fwpsk.h(Fwpsk.h 포함) |
라이브러리 | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |