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

REFS_SMR_VOLUME_INFO_OUTPUT

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

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

フィールド

フィールドサイズx64x86説明
VersionDWORD4+0+0この出力構造体のバージョン番号。
FlagsDWORD4+4+4SMRボリューム情報に関するフラグ。
SizeOfRandomlyWritableTierLONGLONG8+8+8ランダム書き込み可能ティアのサイズ(バイト)。
FreeSpaceInRandomlyWritableTierLONGLONG8+16+16ランダム書き込み可能ティアの空き容量(バイト)。
SizeofSMRTierLONGLONG8+24+24SMR(瓦記録)ティアのサイズ(バイト)。
FreeSpaceInSMRTierLONGLONG8+32+32SMRティアの空き容量(バイト)。
UsableFreeSpaceInSMRTierLONGLONG8+40+40SMRティアで実際に利用可能な空き容量(バイト)。
VolumeGcStateREFS_SMR_VOLUME_GC_STATE4+48+48ボリュームのガベージコレクション状態を示す列挙値。
VolumeGcLastStatusDWORD4+52+52直近のガベージコレクションの結果ステータス。
CurrentGcBandFillPercentageDWORD4+56+56現在GC対象バンドの充填率(%)。
UnusedULONGLONG48+64+64未使用の予約領域。

各言語での定義

#include <windows.h>

// REFS_SMR_VOLUME_INFO_OUTPUT  (x64 112 / x86 112 バイト)
typedef struct REFS_SMR_VOLUME_INFO_OUTPUT {
    DWORD Version;
    DWORD Flags;
    LONGLONG SizeOfRandomlyWritableTier;
    LONGLONG FreeSpaceInRandomlyWritableTier;
    LONGLONG SizeofSMRTier;
    LONGLONG FreeSpaceInSMRTier;
    LONGLONG UsableFreeSpaceInSMRTier;
    REFS_SMR_VOLUME_GC_STATE VolumeGcState;
    DWORD VolumeGcLastStatus;
    DWORD CurrentGcBandFillPercentage;
    ULONGLONG Unused[6];
} REFS_SMR_VOLUME_INFO_OUTPUT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct REFS_SMR_VOLUME_INFO_OUTPUT
{
    public uint Version;
    public uint Flags;
    public long SizeOfRandomlyWritableTier;
    public long FreeSpaceInRandomlyWritableTier;
    public long SizeofSMRTier;
    public long FreeSpaceInSMRTier;
    public long UsableFreeSpaceInSMRTier;
    public int VolumeGcState;
    public uint VolumeGcLastStatus;
    public uint CurrentGcBandFillPercentage;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public ulong[] Unused;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure REFS_SMR_VOLUME_INFO_OUTPUT
    Public Version As UInteger
    Public Flags As UInteger
    Public SizeOfRandomlyWritableTier As Long
    Public FreeSpaceInRandomlyWritableTier As Long
    Public SizeofSMRTier As Long
    Public FreeSpaceInSMRTier As Long
    Public UsableFreeSpaceInSMRTier As Long
    Public VolumeGcState As Integer
    Public VolumeGcLastStatus As UInteger
    Public CurrentGcBandFillPercentage As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)> Public Unused() As ULong
End Structure
import ctypes
from ctypes import wintypes

class REFS_SMR_VOLUME_INFO_OUTPUT(ctypes.Structure):
    _fields_ = [
        ("Version", wintypes.DWORD),
        ("Flags", wintypes.DWORD),
        ("SizeOfRandomlyWritableTier", ctypes.c_longlong),
        ("FreeSpaceInRandomlyWritableTier", ctypes.c_longlong),
        ("SizeofSMRTier", ctypes.c_longlong),
        ("FreeSpaceInSMRTier", ctypes.c_longlong),
        ("UsableFreeSpaceInSMRTier", ctypes.c_longlong),
        ("VolumeGcState", ctypes.c_int),
        ("VolumeGcLastStatus", wintypes.DWORD),
        ("CurrentGcBandFillPercentage", wintypes.DWORD),
        ("Unused", ctypes.c_ulonglong * 6),
    ]
#[repr(C)]
pub struct REFS_SMR_VOLUME_INFO_OUTPUT {
    pub Version: u32,
    pub Flags: u32,
    pub SizeOfRandomlyWritableTier: i64,
    pub FreeSpaceInRandomlyWritableTier: i64,
    pub SizeofSMRTier: i64,
    pub FreeSpaceInSMRTier: i64,
    pub UsableFreeSpaceInSMRTier: i64,
    pub VolumeGcState: i32,
    pub VolumeGcLastStatus: u32,
    pub CurrentGcBandFillPercentage: u32,
    pub Unused: [u64; 6],
}
import "golang.org/x/sys/windows"

type REFS_SMR_VOLUME_INFO_OUTPUT struct {
	Version uint32
	Flags uint32
	SizeOfRandomlyWritableTier int64
	FreeSpaceInRandomlyWritableTier int64
	SizeofSMRTier int64
	FreeSpaceInSMRTier int64
	UsableFreeSpaceInSMRTier int64
	VolumeGcState int32
	VolumeGcLastStatus uint32
	CurrentGcBandFillPercentage uint32
	Unused [6]uint64
}
type
  REFS_SMR_VOLUME_INFO_OUTPUT = record
    Version: DWORD;
    Flags: DWORD;
    SizeOfRandomlyWritableTier: Int64;
    FreeSpaceInRandomlyWritableTier: Int64;
    SizeofSMRTier: Int64;
    FreeSpaceInSMRTier: Int64;
    UsableFreeSpaceInSMRTier: Int64;
    VolumeGcState: Integer;
    VolumeGcLastStatus: DWORD;
    CurrentGcBandFillPercentage: DWORD;
    Unused: array[0..5] of UInt64;
  end;
const REFS_SMR_VOLUME_INFO_OUTPUT = extern struct {
    Version: u32,
    Flags: u32,
    SizeOfRandomlyWritableTier: i64,
    FreeSpaceInRandomlyWritableTier: i64,
    SizeofSMRTier: i64,
    FreeSpaceInSMRTier: i64,
    UsableFreeSpaceInSMRTier: i64,
    VolumeGcState: i32,
    VolumeGcLastStatus: u32,
    CurrentGcBandFillPercentage: u32,
    Unused: [6]u64,
};
type
  REFS_SMR_VOLUME_INFO_OUTPUT {.bycopy.} = object
    Version: uint32
    Flags: uint32
    SizeOfRandomlyWritableTier: int64
    FreeSpaceInRandomlyWritableTier: int64
    SizeofSMRTier: int64
    FreeSpaceInSMRTier: int64
    UsableFreeSpaceInSMRTier: int64
    VolumeGcState: int32
    VolumeGcLastStatus: uint32
    CurrentGcBandFillPercentage: uint32
    Unused: array[6, uint64]
struct REFS_SMR_VOLUME_INFO_OUTPUT
{
    uint Version;
    uint Flags;
    long SizeOfRandomlyWritableTier;
    long FreeSpaceInRandomlyWritableTier;
    long SizeofSMRTier;
    long FreeSpaceInSMRTier;
    long UsableFreeSpaceInSMRTier;
    int VolumeGcState;
    uint VolumeGcLastStatus;
    uint CurrentGcBandFillPercentage;
    ulong[6] Unused;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; REFS_SMR_VOLUME_INFO_OUTPUT サイズ: 112 バイト(x64)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; Version : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Flags : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SizeOfRandomlyWritableTier : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; FreeSpaceInRandomlyWritableTier : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; SizeofSMRTier : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; FreeSpaceInSMRTier : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; UsableFreeSpaceInSMRTier : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; VolumeGcState : REFS_SMR_VOLUME_GC_STATE (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; VolumeGcLastStatus : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; CurrentGcBandFillPercentage : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; Unused : ULONGLONG (+64, 48byte)  varptr(st)+64 を基点に操作(48byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global REFS_SMR_VOLUME_INFO_OUTPUT
    #field int Version
    #field int Flags
    #field int64 SizeOfRandomlyWritableTier
    #field int64 FreeSpaceInRandomlyWritableTier
    #field int64 SizeofSMRTier
    #field int64 FreeSpaceInSMRTier
    #field int64 UsableFreeSpaceInSMRTier
    #field int VolumeGcState
    #field int VolumeGcLastStatus
    #field int CurrentGcBandFillPercentage
    #field int64 Unused 6
#endstruct

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