ホーム › Storage.Nvme › FIRMWARE_ACTIVATION_HISTORY_ENTRY
FIRMWARE_ACTIVATION_HISTORY_ENTRY
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| VersionNumber | BYTE | 1 | +0 | +0 | このエントリ形式の版数。 |
| Length | BYTE | 1 | +1 | +1 | このエントリのバイト長。 |
| Reserved0 | WORD | 2 | +2 | +2 | 予約領域。将来拡張用で0とする。 |
| ActivationCount | WORD | 2 | +4 | +4 | ファームウェアアクティベーションの通し番号。 |
| Timestamp | ULONGLONG | 8 | +6 | +6 | アクティベーション時刻のタイムスタンプ(ミリ秒)。 |
| Reserved1 | ULONGLONG | 8 | +14 | +14 | 予約領域。将来拡張用で0とする。 |
| PowerCycleCount | ULONGLONG | 8 | +22 | +22 | アクティベーション時点の電源投入回数。 |
| PreviousFirmware | ULONGLONG | 8 | +30 | +30 | 変更前のファームウェアリビジョン(8文字ASCII)。 |
| NewFirmware | ULONGLONG | 8 | +38 | +38 | 変更後のファームウェアリビジョン(8文字ASCII)。 |
| SlotNumber | BYTE | 1 | +46 | +46 | アクティベートされたファームウェアスロット番号。 |
| CommitActionType | BYTE | 1 | +47 | +47 | コミットアクションの種別(Firmware Commitのca値)。 |
| Result | WORD | 2 | +48 | +48 | アクティベーション結果のステータスコード。 |
| Reserved2 | BYTE | 14 | +50 | +50 | 予約領域。将来拡張用で0とする。 |
各言語での定義
#include <windows.h>
// FIRMWARE_ACTIVATION_HISTORY_ENTRY (x64 64 / x86 64 バイト)
#pragma pack(push, 1)
typedef struct FIRMWARE_ACTIVATION_HISTORY_ENTRY {
BYTE VersionNumber;
BYTE Length;
WORD Reserved0;
WORD ActivationCount;
ULONGLONG Timestamp;
ULONGLONG Reserved1;
ULONGLONG PowerCycleCount;
ULONGLONG PreviousFirmware;
ULONGLONG NewFirmware;
BYTE SlotNumber;
BYTE CommitActionType;
WORD Result;
BYTE Reserved2[14];
} FIRMWARE_ACTIVATION_HISTORY_ENTRY;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct FIRMWARE_ACTIVATION_HISTORY_ENTRY
{
public byte VersionNumber;
public byte Length;
public ushort Reserved0;
public ushort ActivationCount;
public ulong Timestamp;
public ulong Reserved1;
public ulong PowerCycleCount;
public ulong PreviousFirmware;
public ulong NewFirmware;
public byte SlotNumber;
public byte CommitActionType;
public ushort Result;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)] public byte[] Reserved2;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure FIRMWARE_ACTIVATION_HISTORY_ENTRY
Public VersionNumber As Byte
Public Length As Byte
Public Reserved0 As UShort
Public ActivationCount As UShort
Public Timestamp As ULong
Public Reserved1 As ULong
Public PowerCycleCount As ULong
Public PreviousFirmware As ULong
Public NewFirmware As ULong
Public SlotNumber As Byte
Public CommitActionType As Byte
Public Result As UShort
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=14)> Public Reserved2() As Byte
End Structureimport ctypes
from ctypes import wintypes
class FIRMWARE_ACTIVATION_HISTORY_ENTRY(ctypes.Structure):
_pack_ = 1
_fields_ = [
("VersionNumber", ctypes.c_ubyte),
("Length", ctypes.c_ubyte),
("Reserved0", ctypes.c_ushort),
("ActivationCount", ctypes.c_ushort),
("Timestamp", ctypes.c_ulonglong),
("Reserved1", ctypes.c_ulonglong),
("PowerCycleCount", ctypes.c_ulonglong),
("PreviousFirmware", ctypes.c_ulonglong),
("NewFirmware", ctypes.c_ulonglong),
("SlotNumber", ctypes.c_ubyte),
("CommitActionType", ctypes.c_ubyte),
("Result", ctypes.c_ushort),
("Reserved2", ctypes.c_ubyte * 14),
]#[repr(C, packed(1))]
pub struct FIRMWARE_ACTIVATION_HISTORY_ENTRY {
pub VersionNumber: u8,
pub Length: u8,
pub Reserved0: u16,
pub ActivationCount: u16,
pub Timestamp: u64,
pub Reserved1: u64,
pub PowerCycleCount: u64,
pub PreviousFirmware: u64,
pub NewFirmware: u64,
pub SlotNumber: u8,
pub CommitActionType: u8,
pub Result: u16,
pub Reserved2: [u8; 14],
}import "golang.org/x/sys/windows"
type FIRMWARE_ACTIVATION_HISTORY_ENTRY struct {
VersionNumber byte
Length byte
Reserved0 uint16
ActivationCount uint16
Timestamp uint64
Reserved1 uint64
PowerCycleCount uint64
PreviousFirmware uint64
NewFirmware uint64
SlotNumber byte
CommitActionType byte
Result uint16
Reserved2 [14]byte
}type
FIRMWARE_ACTIVATION_HISTORY_ENTRY = packed record
VersionNumber: Byte;
Length: Byte;
Reserved0: Word;
ActivationCount: Word;
Timestamp: UInt64;
Reserved1: UInt64;
PowerCycleCount: UInt64;
PreviousFirmware: UInt64;
NewFirmware: UInt64;
SlotNumber: Byte;
CommitActionType: Byte;
Result: Word;
Reserved2: array[0..13] of Byte;
end;const FIRMWARE_ACTIVATION_HISTORY_ENTRY = extern struct {
VersionNumber: u8,
Length: u8,
Reserved0: u16,
ActivationCount: u16,
Timestamp: u64,
Reserved1: u64,
PowerCycleCount: u64,
PreviousFirmware: u64,
NewFirmware: u64,
SlotNumber: u8,
CommitActionType: u8,
Result: u16,
Reserved2: [14]u8,
};type
FIRMWARE_ACTIVATION_HISTORY_ENTRY {.packed.} = object
VersionNumber: uint8
Length: uint8
Reserved0: uint16
ActivationCount: uint16
Timestamp: uint64
Reserved1: uint64
PowerCycleCount: uint64
PreviousFirmware: uint64
NewFirmware: uint64
SlotNumber: uint8
CommitActionType: uint8
Result: uint16
Reserved2: array[14, uint8]align(1)
struct FIRMWARE_ACTIVATION_HISTORY_ENTRY
{
ubyte VersionNumber;
ubyte Length;
ushort Reserved0;
ushort ActivationCount;
ulong Timestamp;
ulong Reserved1;
ulong PowerCycleCount;
ulong PreviousFirmware;
ulong NewFirmware;
ubyte SlotNumber;
ubyte CommitActionType;
ushort Result;
ubyte[14] Reserved2;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; FIRMWARE_ACTIVATION_HISTORY_ENTRY サイズ: 64 バイト(x64)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; VersionNumber : BYTE (+0, 1byte) poke st,0,値 / 値 = peek(st,0)
; Length : BYTE (+1, 1byte) poke st,1,値 / 値 = peek(st,1)
; Reserved0 : WORD (+2, 2byte) wpoke st,2,値 / 値 = wpeek(st,2)
; ActivationCount : WORD (+4, 2byte) wpoke st,4,値 / 値 = wpeek(st,4)
; Timestamp : ULONGLONG (+6, 8byte) qpoke st,6,値 / qpeek(st,6) ※IronHSPのみ。3.7/3.8は lpoke st,6,下位 : lpoke st,10,上位
; Reserved1 : ULONGLONG (+14, 8byte) qpoke st,14,値 / qpeek(st,14) ※IronHSPのみ。3.7/3.8は lpoke st,14,下位 : lpoke st,18,上位
; PowerCycleCount : ULONGLONG (+22, 8byte) qpoke st,22,値 / qpeek(st,22) ※IronHSPのみ。3.7/3.8は lpoke st,22,下位 : lpoke st,26,上位
; PreviousFirmware : ULONGLONG (+30, 8byte) qpoke st,30,値 / qpeek(st,30) ※IronHSPのみ。3.7/3.8は lpoke st,30,下位 : lpoke st,34,上位
; NewFirmware : ULONGLONG (+38, 8byte) qpoke st,38,値 / qpeek(st,38) ※IronHSPのみ。3.7/3.8は lpoke st,38,下位 : lpoke st,42,上位
; SlotNumber : BYTE (+46, 1byte) poke st,46,値 / 値 = peek(st,46)
; CommitActionType : BYTE (+47, 1byte) poke st,47,値 / 値 = peek(st,47)
; Result : WORD (+48, 2byte) wpoke st,48,値 / 値 = wpeek(st,48)
; Reserved2 : BYTE (+50, 14byte) varptr(st)+50 を基点に操作(14byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global FIRMWARE_ACTIVATION_HISTORY_ENTRY, pack=1
#field byte VersionNumber
#field byte Length
#field short Reserved0
#field short ActivationCount
#field int64 Timestamp
#field int64 Reserved1
#field int64 PowerCycleCount
#field int64 PreviousFirmware
#field int64 NewFirmware
#field byte SlotNumber
#field byte CommitActionType
#field short Result
#field byte Reserved2 14
#endstruct
stdim st, FIRMWARE_ACTIVATION_HISTORY_ENTRY ; NSTRUCT 変数を確保
st->VersionNumber = 100
mes "VersionNumber=" + st->VersionNumber