Win32 API 日本語リファレンス
ホームSystem.DeploymentServices › PXE_DHCP_MESSAGE

PXE_DHCP_MESSAGE

構造体
サイズx64: 243 バイト / x86: 243 バイトパッキング1

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

フィールド

フィールドサイズx64x86説明
OperationBYTE1+0+0DHCPメッセージの操作種別(要求=1/応答=2)。
HardwareAddressTypeBYTE1+1+1ハードウェアアドレスの種類。
HardwareAddressLengthBYTE1+2+2ハードウェアアドレスの長さ(バイト)。
HopCountBYTE1+3+3リレーエージェントを経由したホップ数。
TransactionIDDWORD4+4+4メッセージを識別するトランザクションID。
SecondsSinceBootWORD2+8+8クライアント起動からの経過秒数。
ReservedWORD2+10+10予約フィールド。フラグ用に使われることがある。
ClientIpAddressDWORD4+12+12クライアントのIPアドレス。
YourIpAddressDWORD4+16+16サーバーが割り当てるクライアントIPアドレス。
BootstrapServerAddressDWORD4+20+20ブートストラップサーバーのIPアドレス。
RelayAgentIpAddressDWORD4+24+24リレーエージェントのIPアドレス。
HardwareAddressBYTE16+28+28クライアントのハードウェアアドレス先頭バイト。
HostNameBYTE64+44+44オプションのサーバーホスト名先頭バイト。
BootFileNameBYTE128+108+108ブートファイル名の先頭バイト。
Anonymous_Anonymous_e__Union4+236+236DHCPマジッククッキーを保持する共用体。
OptionPXE_DHCP_OPTION3+240+240DHCPオプションの先頭(PXE_DHCP_OPTION)。

共用体: _Anonymous_e__Union x64 4B / x86 4B

フィールドサイズx64x86
bMagicCookieBYTE4+0+0
uMagicCookieDWORD4+0+0

各言語での定義

#include <windows.h>

// PXE_DHCP_OPTION  (x64 3 / x86 3 バイト)
#pragma pack(push, 1)
typedef struct PXE_DHCP_OPTION {
    BYTE OptionType;
    BYTE OptionLength;
    BYTE OptionValue[1];
} PXE_DHCP_OPTION;
#pragma pack(pop)

// PXE_DHCP_MESSAGE  (x64 243 / x86 243 バイト)
#pragma pack(push, 1)
typedef struct PXE_DHCP_MESSAGE {
    BYTE Operation;
    BYTE HardwareAddressType;
    BYTE HardwareAddressLength;
    BYTE HopCount;
    DWORD TransactionID;
    WORD SecondsSinceBoot;
    WORD Reserved;
    DWORD ClientIpAddress;
    DWORD YourIpAddress;
    DWORD BootstrapServerAddress;
    DWORD RelayAgentIpAddress;
    BYTE HardwareAddress[16];
    BYTE HostName[64];
    BYTE BootFileName[128];
    _Anonymous_e__Union Anonymous;
    PXE_DHCP_OPTION Option;
} PXE_DHCP_MESSAGE;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct PXE_DHCP_OPTION
{
    public byte OptionType;
    public byte OptionLength;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public byte[] OptionValue;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct PXE_DHCP_MESSAGE
{
    public byte Operation;
    public byte HardwareAddressType;
    public byte HardwareAddressLength;
    public byte HopCount;
    public uint TransactionID;
    public ushort SecondsSinceBoot;
    public ushort Reserved;
    public uint ClientIpAddress;
    public uint YourIpAddress;
    public uint BootstrapServerAddress;
    public uint RelayAgentIpAddress;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] HardwareAddress;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] HostName;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] BootFileName;
    public _Anonymous_e__Union Anonymous;
    public PXE_DHCP_OPTION Option;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure PXE_DHCP_OPTION
    Public OptionType As Byte
    Public OptionLength As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public OptionValue() As Byte
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure PXE_DHCP_MESSAGE
    Public Operation As Byte
    Public HardwareAddressType As Byte
    Public HardwareAddressLength As Byte
    Public HopCount As Byte
    Public TransactionID As UInteger
    Public SecondsSinceBoot As UShort
    Public Reserved As UShort
    Public ClientIpAddress As UInteger
    Public YourIpAddress As UInteger
    Public BootstrapServerAddress As UInteger
    Public RelayAgentIpAddress As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public HardwareAddress() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> Public HostName() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> Public BootFileName() As Byte
    Public Anonymous As _Anonymous_e__Union
    Public Option As PXE_DHCP_OPTION
End Structure
import ctypes
from ctypes import wintypes

class PXE_DHCP_OPTION(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("OptionType", ctypes.c_ubyte),
        ("OptionLength", ctypes.c_ubyte),
        ("OptionValue", ctypes.c_ubyte * 1),
    ]

class PXE_DHCP_MESSAGE(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("Operation", ctypes.c_ubyte),
        ("HardwareAddressType", ctypes.c_ubyte),
        ("HardwareAddressLength", ctypes.c_ubyte),
        ("HopCount", ctypes.c_ubyte),
        ("TransactionID", wintypes.DWORD),
        ("SecondsSinceBoot", ctypes.c_ushort),
        ("Reserved", ctypes.c_ushort),
        ("ClientIpAddress", wintypes.DWORD),
        ("YourIpAddress", wintypes.DWORD),
        ("BootstrapServerAddress", wintypes.DWORD),
        ("RelayAgentIpAddress", wintypes.DWORD),
        ("HardwareAddress", ctypes.c_ubyte * 16),
        ("HostName", ctypes.c_ubyte * 64),
        ("BootFileName", ctypes.c_ubyte * 128),
        ("Anonymous", _Anonymous_e__Union),
        ("Option", PXE_DHCP_OPTION),
    ]
#[repr(C, packed(1))]
pub struct PXE_DHCP_OPTION {
    pub OptionType: u8,
    pub OptionLength: u8,
    pub OptionValue: [u8; 1],
}

#[repr(C, packed(1))]
pub struct PXE_DHCP_MESSAGE {
    pub Operation: u8,
    pub HardwareAddressType: u8,
    pub HardwareAddressLength: u8,
    pub HopCount: u8,
    pub TransactionID: u32,
    pub SecondsSinceBoot: u16,
    pub Reserved: u16,
    pub ClientIpAddress: u32,
    pub YourIpAddress: u32,
    pub BootstrapServerAddress: u32,
    pub RelayAgentIpAddress: u32,
    pub HardwareAddress: [u8; 16],
    pub HostName: [u8; 64],
    pub BootFileName: [u8; 128],
    pub Anonymous: _Anonymous_e__Union,
    pub Option: PXE_DHCP_OPTION,
}
import "golang.org/x/sys/windows"

type PXE_DHCP_OPTION struct {
	OptionType byte
	OptionLength byte
	OptionValue [1]byte
}

type PXE_DHCP_MESSAGE struct {
	Operation byte
	HardwareAddressType byte
	HardwareAddressLength byte
	HopCount byte
	TransactionID uint32
	SecondsSinceBoot uint16
	Reserved uint16
	ClientIpAddress uint32
	YourIpAddress uint32
	BootstrapServerAddress uint32
	RelayAgentIpAddress uint32
	HardwareAddress [16]byte
	HostName [64]byte
	BootFileName [128]byte
	Anonymous _Anonymous_e__Union
	Option PXE_DHCP_OPTION
}
type
  PXE_DHCP_OPTION = packed record
    OptionType: Byte;
    OptionLength: Byte;
    OptionValue: array[0..0] of Byte;
  end;

  PXE_DHCP_MESSAGE = packed record
    Operation: Byte;
    HardwareAddressType: Byte;
    HardwareAddressLength: Byte;
    HopCount: Byte;
    TransactionID: DWORD;
    SecondsSinceBoot: Word;
    Reserved: Word;
    ClientIpAddress: DWORD;
    YourIpAddress: DWORD;
    BootstrapServerAddress: DWORD;
    RelayAgentIpAddress: DWORD;
    HardwareAddress: array[0..15] of Byte;
    HostName: array[0..63] of Byte;
    BootFileName: array[0..127] of Byte;
    Anonymous: _Anonymous_e__Union;
    Option: PXE_DHCP_OPTION;
  end;
const PXE_DHCP_OPTION = extern struct {
    OptionType: u8,
    OptionLength: u8,
    OptionValue: [1]u8,
};

const PXE_DHCP_MESSAGE = extern struct {
    Operation: u8,
    HardwareAddressType: u8,
    HardwareAddressLength: u8,
    HopCount: u8,
    TransactionID: u32,
    SecondsSinceBoot: u16,
    Reserved: u16,
    ClientIpAddress: u32,
    YourIpAddress: u32,
    BootstrapServerAddress: u32,
    RelayAgentIpAddress: u32,
    HardwareAddress: [16]u8,
    HostName: [64]u8,
    BootFileName: [128]u8,
    Anonymous: _Anonymous_e__Union,
    Option: PXE_DHCP_OPTION,
};
type
  PXE_DHCP_OPTION {.packed.} = object
    OptionType: uint8
    OptionLength: uint8
    OptionValue: array[1, uint8]

  PXE_DHCP_MESSAGE {.packed.} = object
    Operation: uint8
    HardwareAddressType: uint8
    HardwareAddressLength: uint8
    HopCount: uint8
    TransactionID: uint32
    SecondsSinceBoot: uint16
    Reserved: uint16
    ClientIpAddress: uint32
    YourIpAddress: uint32
    BootstrapServerAddress: uint32
    RelayAgentIpAddress: uint32
    HardwareAddress: array[16, uint8]
    HostName: array[64, uint8]
    BootFileName: array[128, uint8]
    Anonymous: _Anonymous_e__Union
    Option: PXE_DHCP_OPTION
align(1)
struct PXE_DHCP_OPTION
{
    ubyte OptionType;
    ubyte OptionLength;
    ubyte[1] OptionValue;
}

align(1)
struct PXE_DHCP_MESSAGE
{
    ubyte Operation;
    ubyte HardwareAddressType;
    ubyte HardwareAddressLength;
    ubyte HopCount;
    uint TransactionID;
    ushort SecondsSinceBoot;
    ushort Reserved;
    uint ClientIpAddress;
    uint YourIpAddress;
    uint BootstrapServerAddress;
    uint RelayAgentIpAddress;
    ubyte[16] HardwareAddress;
    ubyte[64] HostName;
    ubyte[128] BootFileName;
    _Anonymous_e__Union Anonymous;
    PXE_DHCP_OPTION Option;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; PXE_DHCP_MESSAGE サイズ: 243 バイト(x64)
dim st, 61    ; 4byte整数×61(構造体サイズ 243 / 4 切り上げ)
; Operation : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; HardwareAddressType : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; HardwareAddressLength : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; HopCount : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; TransactionID : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SecondsSinceBoot : WORD (+8, 2byte)  wpoke st,8,値  /  値 = wpeek(st,8)
; Reserved : WORD (+10, 2byte)  wpoke st,10,値  /  値 = wpeek(st,10)
; ClientIpAddress : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; YourIpAddress : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; BootstrapServerAddress : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; RelayAgentIpAddress : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; HardwareAddress : BYTE (+28, 16byte)  varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; HostName : BYTE (+44, 64byte)  varptr(st)+44 を基点に操作(64byte:入れ子/配列)
; BootFileName : BYTE (+108, 128byte)  varptr(st)+108 を基点に操作(128byte:入れ子/配列)
; Anonymous : _Anonymous_e__Union (+236, 4byte)  varptr(st)+236 を基点に操作(4byte:入れ子/配列)
; Option : PXE_DHCP_OPTION (+240, 3byte)  varptr(st)+240 を基点に操作(3byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global PXE_DHCP_OPTION, pack=1
    #field byte OptionType
    #field byte OptionLength
    #field byte OptionValue 1
#endstruct

#defstruct global PXE_DHCP_MESSAGE, pack=1
    #field byte Operation
    #field byte HardwareAddressType
    #field byte HardwareAddressLength
    #field byte HopCount
    #field int TransactionID
    #field short SecondsSinceBoot
    #field short Reserved
    #field int ClientIpAddress
    #field int YourIpAddress
    #field int BootstrapServerAddress
    #field int RelayAgentIpAddress
    #field byte HardwareAddress 16
    #field byte HostName 64
    #field byte BootFileName 128
    #field byte Anonymous 4
    #field PXE_DHCP_OPTION Option
#endstruct

stdim st, PXE_DHCP_MESSAGE        ; NSTRUCT 変数を確保
st->Operation = 100
mes "Operation=" + st->Operation
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。