ホーム › System.DeploymentServices › PXE_DHCP_MESSAGE
PXE_DHCP_MESSAGE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Operation | BYTE | 1 | +0 | +0 | DHCPメッセージの操作種別(要求=1/応答=2)。 |
| HardwareAddressType | BYTE | 1 | +1 | +1 | ハードウェアアドレスの種類。 |
| HardwareAddressLength | BYTE | 1 | +2 | +2 | ハードウェアアドレスの長さ(バイト)。 |
| HopCount | BYTE | 1 | +3 | +3 | リレーエージェントを経由したホップ数。 |
| TransactionID | DWORD | 4 | +4 | +4 | メッセージを識別するトランザクションID。 |
| SecondsSinceBoot | WORD | 2 | +8 | +8 | クライアント起動からの経過秒数。 |
| Reserved | WORD | 2 | +10 | +10 | 予約フィールド。フラグ用に使われることがある。 |
| ClientIpAddress | DWORD | 4 | +12 | +12 | クライアントのIPアドレス。 |
| YourIpAddress | DWORD | 4 | +16 | +16 | サーバーが割り当てるクライアントIPアドレス。 |
| BootstrapServerAddress | DWORD | 4 | +20 | +20 | ブートストラップサーバーのIPアドレス。 |
| RelayAgentIpAddress | DWORD | 4 | +24 | +24 | リレーエージェントのIPアドレス。 |
| HardwareAddress | BYTE | 16 | +28 | +28 | クライアントのハードウェアアドレス先頭バイト。 |
| HostName | BYTE | 64 | +44 | +44 | オプションのサーバーホスト名先頭バイト。 |
| BootFileName | BYTE | 128 | +108 | +108 | ブートファイル名の先頭バイト。 |
| Anonymous | _Anonymous_e__Union | 4 | +236 | +236 | DHCPマジッククッキーを保持する共用体。 |
| Option | PXE_DHCP_OPTION | 3 | +240 | +240 | DHCPオプションの先頭(PXE_DHCP_OPTION)。 |
共用体: _Anonymous_e__Union x64 4B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 |
|---|---|---|---|---|
| bMagicCookie | BYTE | 4 | +0 | +0 |
| uMagicCookie | DWORD | 4 | +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 Structureimport 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_OPTIONalign(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 非対応)。必要に応じ手動でアクセス。