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

IP_OPTION_INFORMATION

構造体
サイズx64: 16 バイト / x86: 8 バイト

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

フィールド

フィールドサイズx64x86説明
TtlBYTE1+0+0IPヘッダのTTL(生存時間)値を示す。
TosBYTE1+1+1IPヘッダのToS(サービス種別)値を示す。
FlagsBYTE1+2+2IPヘッダオプションフラグ。フラグメント禁止等を表す。
OptionsSizeBYTE1+3+3OptionsDataが指すオプションデータのバイト長を示す。
OptionsDataBYTE*8/4+8+4IPオプションの生バイト列を指すポインタ。NULL可。

各言語での定義

#include <windows.h>

// IP_OPTION_INFORMATION  (x64 16 / x86 8 バイト)
typedef struct IP_OPTION_INFORMATION {
    BYTE Ttl;
    BYTE Tos;
    BYTE Flags;
    BYTE OptionsSize;
    BYTE* OptionsData;
} IP_OPTION_INFORMATION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_OPTION_INFORMATION
{
    public byte Ttl;
    public byte Tos;
    public byte Flags;
    public byte OptionsSize;
    public IntPtr OptionsData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IP_OPTION_INFORMATION
    Public Ttl As Byte
    Public Tos As Byte
    Public Flags As Byte
    Public OptionsSize As Byte
    Public OptionsData As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class IP_OPTION_INFORMATION(ctypes.Structure):
    _fields_ = [
        ("Ttl", ctypes.c_ubyte),
        ("Tos", ctypes.c_ubyte),
        ("Flags", ctypes.c_ubyte),
        ("OptionsSize", ctypes.c_ubyte),
        ("OptionsData", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct IP_OPTION_INFORMATION {
    pub Ttl: u8,
    pub Tos: u8,
    pub Flags: u8,
    pub OptionsSize: u8,
    pub OptionsData: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type IP_OPTION_INFORMATION struct {
	Ttl byte
	Tos byte
	Flags byte
	OptionsSize byte
	OptionsData uintptr
}
type
  IP_OPTION_INFORMATION = record
    Ttl: Byte;
    Tos: Byte;
    Flags: Byte;
    OptionsSize: Byte;
    OptionsData: Pointer;
  end;
const IP_OPTION_INFORMATION = extern struct {
    Ttl: u8,
    Tos: u8,
    Flags: u8,
    OptionsSize: u8,
    OptionsData: ?*anyopaque,
};
type
  IP_OPTION_INFORMATION {.bycopy.} = object
    Ttl: uint8
    Tos: uint8
    Flags: uint8
    OptionsSize: uint8
    OptionsData: pointer
struct IP_OPTION_INFORMATION
{
    ubyte Ttl;
    ubyte Tos;
    ubyte Flags;
    ubyte OptionsSize;
    void* OptionsData;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IP_OPTION_INFORMATION サイズ: 8 バイト(x86)
dim st, 2    ; 4byte整数×2(構造体サイズ 8 / 4 切り上げ)
; Ttl : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Tos : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; OptionsSize : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; OptionsData : BYTE* (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_OPTION_INFORMATION サイズ: 16 バイト(x64)
dim st, 4    ; 4byte整数×4(構造体サイズ 16 / 4 切り上げ)
; Ttl : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Tos : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; OptionsSize : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; OptionsData : BYTE* (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IP_OPTION_INFORMATION
    #field byte Ttl
    #field byte Tos
    #field byte Flags
    #field byte OptionsSize
    #field intptr OptionsData
#endstruct

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