Win32 API 日本語リファレンス
ホームNetworkManagement.IpHelper › PF_FILTER_DESCRIPTOR

PF_FILTER_DESCRIPTOR

構造体
サイズx64: 64 バイト / x86: 44 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
dwFilterFlagsDWORD4+0+0フィルタの動作を指定するビットフラグである。
dwRuleDWORD4+4+4フィルタが属するルール番号である。
pfatTypePFADDRESSTYPE4+8+8アドレス種別(PFADDRESSTYPE、IPv4/IPv6)を示す。
SrcAddrBYTE*8/4+16+12送信元アドレスを指すバイト配列ポインタである。
SrcMaskBYTE*8/4+24+16送信元アドレスマスクを指すバイト配列ポインタである。
DstAddrBYTE*8/4+32+20宛先アドレスを指すバイト配列ポインタである。
DstMaskBYTE*8/4+40+24宛先アドレスマスクを指すバイト配列ポインタである。
dwProtocolDWORD4+48+28フィルタ対象のプロトコル番号(TCP/UDP等)である。
fLateBoundDWORD4+52+32アドレスの遅延バインドに関するフラグである。
wSrcPortWORD2+56+36送信元ポート番号(範囲指定の下限)である。
wDstPortWORD2+58+38宛先ポート番号(範囲指定の下限)である。
wSrcPortHighRangeWORD2+60+40送信元ポート範囲の上限である。
wDstPortHighRangeWORD2+62+42宛先ポート範囲の上限である。

各言語での定義

#include <windows.h>

// PF_FILTER_DESCRIPTOR  (x64 64 / x86 44 バイト)
typedef struct PF_FILTER_DESCRIPTOR {
    DWORD dwFilterFlags;
    DWORD dwRule;
    PFADDRESSTYPE pfatType;
    BYTE* SrcAddr;
    BYTE* SrcMask;
    BYTE* DstAddr;
    BYTE* DstMask;
    DWORD dwProtocol;
    DWORD fLateBound;
    WORD wSrcPort;
    WORD wDstPort;
    WORD wSrcPortHighRange;
    WORD wDstPortHighRange;
} PF_FILTER_DESCRIPTOR;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PF_FILTER_DESCRIPTOR
{
    public uint dwFilterFlags;
    public uint dwRule;
    public int pfatType;
    public IntPtr SrcAddr;
    public IntPtr SrcMask;
    public IntPtr DstAddr;
    public IntPtr DstMask;
    public uint dwProtocol;
    public uint fLateBound;
    public ushort wSrcPort;
    public ushort wDstPort;
    public ushort wSrcPortHighRange;
    public ushort wDstPortHighRange;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PF_FILTER_DESCRIPTOR
    Public dwFilterFlags As UInteger
    Public dwRule As UInteger
    Public pfatType As Integer
    Public SrcAddr As IntPtr
    Public SrcMask As IntPtr
    Public DstAddr As IntPtr
    Public DstMask As IntPtr
    Public dwProtocol As UInteger
    Public fLateBound As UInteger
    Public wSrcPort As UShort
    Public wDstPort As UShort
    Public wSrcPortHighRange As UShort
    Public wDstPortHighRange As UShort
End Structure
import ctypes
from ctypes import wintypes

class PF_FILTER_DESCRIPTOR(ctypes.Structure):
    _fields_ = [
        ("dwFilterFlags", wintypes.DWORD),
        ("dwRule", wintypes.DWORD),
        ("pfatType", ctypes.c_int),
        ("SrcAddr", ctypes.c_void_p),
        ("SrcMask", ctypes.c_void_p),
        ("DstAddr", ctypes.c_void_p),
        ("DstMask", ctypes.c_void_p),
        ("dwProtocol", wintypes.DWORD),
        ("fLateBound", wintypes.DWORD),
        ("wSrcPort", ctypes.c_ushort),
        ("wDstPort", ctypes.c_ushort),
        ("wSrcPortHighRange", ctypes.c_ushort),
        ("wDstPortHighRange", ctypes.c_ushort),
    ]
#[repr(C)]
pub struct PF_FILTER_DESCRIPTOR {
    pub dwFilterFlags: u32,
    pub dwRule: u32,
    pub pfatType: i32,
    pub SrcAddr: *mut core::ffi::c_void,
    pub SrcMask: *mut core::ffi::c_void,
    pub DstAddr: *mut core::ffi::c_void,
    pub DstMask: *mut core::ffi::c_void,
    pub dwProtocol: u32,
    pub fLateBound: u32,
    pub wSrcPort: u16,
    pub wDstPort: u16,
    pub wSrcPortHighRange: u16,
    pub wDstPortHighRange: u16,
}
import "golang.org/x/sys/windows"

type PF_FILTER_DESCRIPTOR struct {
	dwFilterFlags uint32
	dwRule uint32
	pfatType int32
	SrcAddr uintptr
	SrcMask uintptr
	DstAddr uintptr
	DstMask uintptr
	dwProtocol uint32
	fLateBound uint32
	wSrcPort uint16
	wDstPort uint16
	wSrcPortHighRange uint16
	wDstPortHighRange uint16
}
type
  PF_FILTER_DESCRIPTOR = record
    dwFilterFlags: DWORD;
    dwRule: DWORD;
    pfatType: Integer;
    SrcAddr: Pointer;
    SrcMask: Pointer;
    DstAddr: Pointer;
    DstMask: Pointer;
    dwProtocol: DWORD;
    fLateBound: DWORD;
    wSrcPort: Word;
    wDstPort: Word;
    wSrcPortHighRange: Word;
    wDstPortHighRange: Word;
  end;
const PF_FILTER_DESCRIPTOR = extern struct {
    dwFilterFlags: u32,
    dwRule: u32,
    pfatType: i32,
    SrcAddr: ?*anyopaque,
    SrcMask: ?*anyopaque,
    DstAddr: ?*anyopaque,
    DstMask: ?*anyopaque,
    dwProtocol: u32,
    fLateBound: u32,
    wSrcPort: u16,
    wDstPort: u16,
    wSrcPortHighRange: u16,
    wDstPortHighRange: u16,
};
type
  PF_FILTER_DESCRIPTOR {.bycopy.} = object
    dwFilterFlags: uint32
    dwRule: uint32
    pfatType: int32
    SrcAddr: pointer
    SrcMask: pointer
    DstAddr: pointer
    DstMask: pointer
    dwProtocol: uint32
    fLateBound: uint32
    wSrcPort: uint16
    wDstPort: uint16
    wSrcPortHighRange: uint16
    wDstPortHighRange: uint16
struct PF_FILTER_DESCRIPTOR
{
    uint dwFilterFlags;
    uint dwRule;
    int pfatType;
    void* SrcAddr;
    void* SrcMask;
    void* DstAddr;
    void* DstMask;
    uint dwProtocol;
    uint fLateBound;
    ushort wSrcPort;
    ushort wDstPort;
    ushort wSrcPortHighRange;
    ushort wDstPortHighRange;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; PF_FILTER_DESCRIPTOR サイズ: 44 バイト(x86)
dim st, 11    ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; dwFilterFlags : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwRule : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pfatType : PFADDRESSTYPE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; SrcAddr : BYTE* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; SrcMask : BYTE* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; DstAddr : BYTE* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; DstMask : BYTE* (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; dwProtocol : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; fLateBound : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; wSrcPort : WORD (+36, 2byte)  wpoke st,36,値  /  値 = wpeek(st,36)
; wDstPort : WORD (+38, 2byte)  wpoke st,38,値  /  値 = wpeek(st,38)
; wSrcPortHighRange : WORD (+40, 2byte)  wpoke st,40,値  /  値 = wpeek(st,40)
; wDstPortHighRange : WORD (+42, 2byte)  wpoke st,42,値  /  値 = wpeek(st,42)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; PF_FILTER_DESCRIPTOR サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; dwFilterFlags : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwRule : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pfatType : PFADDRESSTYPE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; SrcAddr : BYTE* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; SrcMask : BYTE* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; DstAddr : BYTE* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; DstMask : BYTE* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; dwProtocol : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; fLateBound : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; wSrcPort : WORD (+56, 2byte)  wpoke st,56,値  /  値 = wpeek(st,56)
; wDstPort : WORD (+58, 2byte)  wpoke st,58,値  /  値 = wpeek(st,58)
; wSrcPortHighRange : WORD (+60, 2byte)  wpoke st,60,値  /  値 = wpeek(st,60)
; wDstPortHighRange : WORD (+62, 2byte)  wpoke st,62,値  /  値 = wpeek(st,62)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global PF_FILTER_DESCRIPTOR
    #field int dwFilterFlags
    #field int dwRule
    #field int pfatType
    #field intptr SrcAddr
    #field intptr SrcMask
    #field intptr DstAddr
    #field intptr DstMask
    #field int dwProtocol
    #field int fLateBound
    #field short wSrcPort
    #field short wDstPort
    #field short wSrcPortHighRange
    #field short wDstPortHighRange
#endstruct

stdim st, PF_FILTER_DESCRIPTOR        ; NSTRUCT 変数を確保
st->dwFilterFlags = 100
mes "dwFilterFlags=" + st->dwFilterFlags