다음을 통해 공유


FwpsConstructIpHeaderForTransportPacket0 함수(fwpsk.h)

FwpsConstructIpHeaderForTransportPacket0 함수는 설명선에 의해 호출되어 새 IP 헤더를 생성하거나 하나의 net 버퍼에 대한 기존 IP 패킷 헤더를 다시 빌드합니다.

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

통사론

NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
  [in, out]      NET_BUFFER_LIST  *netBufferList,
                 ULONG            headerIncludeHeaderLength,
  [in]           ADDRESS_FAMILY   addressFamily,
  [in]           const UCHAR      *sourceAddress,
  [in]           const UCHAR      *remoteAddress,
  [in]           IPPROTO          nextProtocol,
  [in, optional] UINT64           endpointHandle,
  [in, optional] const WSACMSGHDR *controlData,
  [in]           ULONG            controlDataLength,
  [in]           UINT32           flags,
                 PVOID            reserved,
  [in, optional] IF_INDEX         interfaceIndex,
  [in, optional] IF_INDEX         subInterfaceIndex
);

매개 변수

[in, out] netBufferList

새 IP 헤더를 생성하거나 다시 작성할 복제된 전송 계층 패킷 데이터를 설명하는 NET_BUFFER_LIST 구조체에 대한 포인터입니다. 새 IP 헤더를 생성하려면 전송 헤더의 시작 부분에서 복제된 NET_BUFFER_LIST 구조체의 오프셋을 찾습니다. 기존 IP 패킷 헤더를 다시 빌드하려면 IP 헤더의 시작 부분에서 오프셋을 찾습니다.

headerIncludeHeaderLength

NetBufferList 가리키는 NET_BUFFER_LIST 구조에 IP 헤더가 이미 포함되어 있는 경우 기존 IP 헤더의 총 크기(바이트)를 나타냅니다(있는 경우). NetBufferList IP 헤더가 없는 경우 headerIncludeHeaderSize 0입니다. 그렇지 않으면 이 매개 변수의 값이 다음의 ipHeaderSize 멤버와 같습니다. 설명선 드라이버의 classifyFn 설명선 함수에 전달되는 FWPS_INCOMING_METADATA_VALUES0 구조체입니다. IPv4 옵션은 유지되지만 이 함수가 호출되면 기존 IPv6 헤더에 대한 확장 헤더가 제거됩니다. 자세한 내용은 비고를 참조하세요.

[in] addressFamily

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

AF_INET

IPv4 주소 패밀리입니다.

AF_INET6

IPv6 주소 패밀리입니다.

[in] sourceAddress

생성할 IP 헤더의 일부가 될 원본 IP 주소에 대한 포인터입니다. IPv4의 경우 주소는 4바이트입니다. IPv6의 경우 주소는 16바이트입니다. 원본 주소 바이트는 항상 네트워크 바이트 순서입니다.

[in] remoteAddress

생성할 IP 헤더의 일부가 될 원격 IP 주소를 지정하는 버퍼에 대한 포인터입니다.

버퍼는 IPv4 주소(4바이트) 또는 IPv6 주소(16바이트)를 포함할 수 있으며 주소는 네트워크 바이트 순서로 지정해야 합니다. IP 버전은 addressFamily 매개 변수와 일치해야 합니다.

[in] nextProtocol

생성할 새 IP 헤더의 IPPROTO 프로토콜 형식을 지정합니다. IPPROTO 열거형에 대한 자세한 내용은 AF_INET 또는 AF_INET6참조하세요.

[in, optional] endpointHandle

패킷을 삽입할 송신 데이터 경로의 스택 전송 엔드포인트를 나타내는 선택적 핸들입니다. 이 엔드포인트 핸들은 transportEndpointHandle 멤버를 통해 설명선에 제공됩니다. 설명선 드라이버의 classifyFn 설명선 함수에 전달되는 FWPS_INCOMING_METADATA_VALUES0 구조체입니다.

[in, optional] controlData

Microsoft Windows SDK 설명서에 설명된 WSASendMsg 함수에서 지정한 소켓 제어 데이터를 포함하는 버퍼에 대한 선택적 포인터입니다. WSACMSGHDR 형식에 대한 자세한 내용은 CMSGHDR참조하세요.

있는 경우 소켓 제어 데이터는 controlData 멤버를 사용하여 설명선에 제공됩니다. 설명선 드라이버의 classifyFn 설명선 함수에 전달되는 FWPS_INCOMING_METADATA_VALUES0 구조체입니다.

소켓 제어 데이터가 NULL 않은 경우 classifyFn 함수의 설명선 드라이버 구현에서 깊이 복사해야 하며, controlData 버퍼는 삽입 완료 함수가 호출될 때까지 유효하게 유지되어야 합니다.

[in] controlDataLength

controlData 매개 변수의 길이(바이트)입니다.

[in] flags

NBL이 송신 또는 수신 경로용인지 여부를 지정하는 플래그입니다. 플래그 매개 변수에는 다음 값이 있을 수 있습니다.

의미
FWPS_CONSTRUCT_IPHEADER_FOR_SEND 이 플래그를 설정하면 NBL이 송신 경로용으로 지정됩니다.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE 이 플래그를 설정하면 NBL이 수신 경로용으로 지정됩니다.

USO 또는 URO를 지원하는 설명선 드라이버의 경우 이 매개 변수를 이러한 값 중 하나로 설정해야 합니다. 다른 설명선 드라이버는 이 매개 변수를 0 설정할 수 있습니다. 이러한 플래그는 Windows Server 2022 23H2 이상에서만 지원됩니다. Windows 이전 릴리스에서 설명선 드라이버는 항상 이 매개 변수를 0 설정해야 합니다.

reserved

예약. 설명선 드라이버는 NULL 이 매개 변수를 설정해야 합니다.

[in, optional] interfaceIndex

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

[in, optional] subInterfaceIndex

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

반환 값

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

반환 코드 묘사
STATUS_SUCCESS
새 IP 헤더가 성공적으로 생성되었습니다.
기타 상태 코드
오류가 발생했습니다.

발언

FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx(WFP 아웃바운드 전송 계층)에 복제된 순 버퍼 목록에서 FwpsConstructIpHeaderForTransportPacket0 순 버퍼 목록 체인의 일부인 각 net 버퍼에 대해 새 헤더를 생성합니다. 이 함수를 사용하여 패킷의 기존 IP 헤더를 다시 작성할 수도 있습니다. 이 경우 순 버퍼 목록에는 하나의 net 버퍼만 포함되어야 합니다.

이 함수는 IP 헤더가 아직 만들어지지 않았지만 원본 IP 주소 또는 원본 포트를 전송 계층에서 수정해야 하는 경우에 유용합니다. 일반적으로 패킷이 네트워크 계층에 도달할 때까지 이러한 수정을 수행할 때까지 기다릴 수 있지만 IP 패킷이 암호화되거나 디지털 서명된 IPsec 환경에서는 네트워크 계층에 도달하기 전에 이 작업을 수행할 수 없습니다.

원본 IP 주소는 로컬로 정의된 다른 IP 주소 또는 로컬 컴퓨터에 없는 다른 주소로 수정할 수 있습니다. 수정된 패킷은 수신 또는 전달 데이터 경로에 보내거나 삽입할 수 있습니다.

0이 아닌 endpointHandle 매개 변수를 지정하면 소켓과 연결된 세션 상태(소켓 옵션)가 있는 경우 각 새 IP 헤더를 생성하는 데 사용됩니다. 마찬가지로 controlDatacontrolDataLength 매개 변수를 사용하여 추가 소켓 옵션을 지정하는 경우 이러한 옵션을 사용하여 각 새 IP 헤더를 생성합니다.

입력 순 버퍼 목록이 인바운드 WFP 전송 계층에서 복제되었거나 원시 송신 작업의 결과로 만들어진 경우 net 버퍼에는 이미 IP 헤더가 포함됩니다. 이 경우 이 함수가 호출되면 새 IP 헤더에 IPv4 옵션이 유지되지만 AH/ESP 헤더 및 IPv6 확장 헤더는 제거됩니다. TCP/IP 스택은 IPsec 처리 후에 AH/ESP 헤더를 유지하므로 WFP에서 표시하고 설명선에 의해 복제된 패킷은 수신 데이터 경로에 쉽게 삽입할 수 없습니다. 따라서 이 함수는 FwpsInjectTransportReceiveAsync0 함수를 사용하여 수신 데이터 경로에 삽입할 IPsec 처리 패킷을 다시 빌드하는 데 유용합니다.

헤더 포함 세션의 경우 예를 들어 아웃바운드 전송 계층에서 원시 소켓에 전송된 GRE(일반 라우팅 캡슐화) 트래픽(IP 프로토콜 47)을 필터링하려면 FwpsConstructIpHeaderForTransportPacket0호출하기 전에 다음 절차를 사용합니다.

  1. 다음을 호출하여 순 버퍼 목록을 복제합니다. FwpsAllocateCloneNetBufferList0 함수입니다.
  2. headerIncludeHeaderLength가 classifyFn 함수의 inMetaValues 매개 변수가 가리키는 FWPS_INCOMING_METADATA_VALUES0 구조의 멤버를 경우 복제된 순 버퍼 목록을 해당 양만큼 후퇴합니다. 예를 들어 NdisRetreatNetBufferListDataStart호출합니다.
  3. FWPS_INCOMING_METADATA_VALUES0 headerIncludeHeader 멤버가 가리키는 버퍼를 복제된 네트워크 버퍼 목록의 새로 퇴각된 영역에 복사합니다. 버퍼의 크기는 headerIncludeHeaderLength값과 같아야 합니다.
  4. 복제된 net 버퍼 목록을 가리키는 NetBufferList 매개 변수와 headerIncludeHeaderLength값으로 설정된 headerIncludeHeaderSize 매개 변수가 있는 FwpsConstructIpHeaderForTransportPacket0 호출합니다.
FwpsConstructIpHeaderForTransportPacket0 결과 순 버퍼 목록에 대한 LSO(대규모 송신 오프로드) 및 체크섬 오프로드 지원을 사용하지 않도록 설정합니다. 전체 체크섬은 상위 수준 프로토콜(TCP, UDP 및 ICMP)에 대해 계산됩니다. IP 헤더가 다시 구성되면 IP 체크섬이 다시 계산됩니다.

요구 사항

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

참고 항목

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn