Win32 API 日本語リファレンス
ホームStorage.Nvme › NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG

NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG

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

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

フィールド

フィールドサイズx64x86説明
LIDBYTE1+0+0このログページのログ識別子。
Reserved0BYTE3+1+1予約領域。将来拡張用で0とする。
ValidNumberOfEntriesDWORD4+4+4有効なアクティベーション履歴エントリの個数。
EntriesFIRMWARE_ACTIVATION_HISTORY_ENTRY1280+8+8ファームウェアアクティベーション履歴エントリの配列。
Reserved1BYTE2790+1288+1288予約領域。将来拡張用で0とする。
LogPageVersionNumberWORD2+4078+4078このログページの版数。
LogPageGUIDGUID16+4080+4080ログページを識別する16バイトGUID。

各言語での定義

#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)

// NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG  (x64 4096 / x86 4096 バイト)
#pragma pack(push, 1)
typedef struct NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG {
    BYTE LID;
    BYTE Reserved0[3];
    DWORD ValidNumberOfEntries;
    FIRMWARE_ACTIVATION_HISTORY_ENTRY Entries[20];
    BYTE Reserved1[2790];
    WORD LogPageVersionNumber;
    GUID LogPageGUID;
} NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG;
#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;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG
{
    public byte LID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] Reserved0;
    public uint ValidNumberOfEntries;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public FIRMWARE_ACTIVATION_HISTORY_ENTRY[] Entries;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2790)] public byte[] Reserved1;
    public ushort LogPageVersionNumber;
    public Guid LogPageGUID;
}
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 Structure

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG
    Public LID As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Public Reserved0() As Byte
    Public ValidNumberOfEntries As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> Public Entries() As FIRMWARE_ACTIVATION_HISTORY_ENTRY
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2790)> Public Reserved1() As Byte
    Public LogPageVersionNumber As UShort
    Public LogPageGUID As Guid
End Structure
import 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),
    ]

class NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("LID", ctypes.c_ubyte),
        ("Reserved0", ctypes.c_ubyte * 3),
        ("ValidNumberOfEntries", wintypes.DWORD),
        ("Entries", FIRMWARE_ACTIVATION_HISTORY_ENTRY * 20),
        ("Reserved1", ctypes.c_ubyte * 2790),
        ("LogPageVersionNumber", ctypes.c_ushort),
        ("LogPageGUID", GUID),
    ]
#[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],
}

#[repr(C, packed(1))]
pub struct NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG {
    pub LID: u8,
    pub Reserved0: [u8; 3],
    pub ValidNumberOfEntries: u32,
    pub Entries: [FIRMWARE_ACTIVATION_HISTORY_ENTRY; 20],
    pub Reserved1: [u8; 2790],
    pub LogPageVersionNumber: u16,
    pub LogPageGUID: GUID,
}
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 NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG struct {
	LID byte
	Reserved0 [3]byte
	ValidNumberOfEntries uint32
	Entries [20]FIRMWARE_ACTIVATION_HISTORY_ENTRY
	Reserved1 [2790]byte
	LogPageVersionNumber uint16
	LogPageGUID windows.GUID
}
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;

  NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG = packed record
    LID: Byte;
    Reserved0: array[0..2] of Byte;
    ValidNumberOfEntries: DWORD;
    Entries: array[0..19] of FIRMWARE_ACTIVATION_HISTORY_ENTRY;
    Reserved1: array[0..2789] of Byte;
    LogPageVersionNumber: Word;
    LogPageGUID: TGUID;
  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,
};

const NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG = extern struct {
    LID: u8,
    Reserved0: [3]u8,
    ValidNumberOfEntries: u32,
    Entries: [20]FIRMWARE_ACTIVATION_HISTORY_ENTRY,
    Reserved1: [2790]u8,
    LogPageVersionNumber: u16,
    LogPageGUID: GUID,
};
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]

  NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG {.packed.} = object
    LID: uint8
    Reserved0: array[3, uint8]
    ValidNumberOfEntries: uint32
    Entries: array[20, FIRMWARE_ACTIVATION_HISTORY_ENTRY]
    Reserved1: array[2790, uint8]
    LogPageVersionNumber: uint16
    LogPageGUID: GUID
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;
}

align(1)
struct NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG
{
    ubyte LID;
    ubyte[3] Reserved0;
    uint ValidNumberOfEntries;
    FIRMWARE_ACTIVATION_HISTORY_ENTRY[20] Entries;
    ubyte[2790] Reserved1;
    ushort LogPageVersionNumber;
    GUID LogPageGUID;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG サイズ: 4096 バイト(x64)
dim st, 1024    ; 4byte整数×1024(構造体サイズ 4096 / 4 切り上げ)
; LID : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Reserved0 : BYTE (+1, 3byte)  varptr(st)+1 を基点に操作(3byte:入れ子/配列)
; ValidNumberOfEntries : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Entries : FIRMWARE_ACTIVATION_HISTORY_ENTRY (+8, 1280byte)  varptr(st)+8 を基点に操作(1280byte:入れ子/配列)
; Reserved1 : BYTE (+1288, 2790byte)  varptr(st)+1288 を基点に操作(2790byte:入れ子/配列)
; LogPageVersionNumber : WORD (+4078, 2byte)  wpoke st,4078,値  /  値 = wpeek(st,4078)
; LogPageGUID : GUID (+4080, 16byte)  varptr(st)+4080 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#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

#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global NVME_OCP_DEVICE_FIRMWARE_ACTIVATION_HISTORY_LOG, pack=1
    #field byte LID
    #field byte Reserved0 3
    #field int ValidNumberOfEntries
    #field FIRMWARE_ACTIVATION_HISTORY_ENTRY Entries 20
    #field byte Reserved1 2790
    #field short LogPageVersionNumber
    #field GUID LogPageGUID
#endstruct

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