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

DISK_HISTOGRAM

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

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

フィールド

フィールドサイズx64x86説明
DiskSizeLONGLONG8+0+0ディスクのサイズ。バイト単位。
StartLONGLONG8+8+8ヒストグラム対象範囲の開始オフセット。
EndLONGLONG8+16+16ヒストグラム対象範囲の終了オフセット。
AverageLONGLONG8+24+24全I/Oの平均値。
AverageReadLONGLONG8+32+32読み取りI/Oの平均値。
AverageWriteLONGLONG8+40+40書き込みI/Oの平均値。
GranularityDWORD4+48+48各バケットが表す範囲の粒度。
SizeDWORD4+52+52ヒストグラムのサイズ。
ReadCountDWORD4+56+56総読み取り回数。
WriteCountDWORD4+60+60総書き込み回数。
HistogramHISTOGRAM_BUCKET*8/4+64+64HISTOGRAM_BUCKET配列へのポインタ。

各言語での定義

#include <windows.h>

// DISK_HISTOGRAM  (x64 72 / x86 72 バイト)
typedef struct DISK_HISTOGRAM {
    LONGLONG DiskSize;
    LONGLONG Start;
    LONGLONG End;
    LONGLONG Average;
    LONGLONG AverageRead;
    LONGLONG AverageWrite;
    DWORD Granularity;
    DWORD Size;
    DWORD ReadCount;
    DWORD WriteCount;
    HISTOGRAM_BUCKET* Histogram;
} DISK_HISTOGRAM;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISK_HISTOGRAM
{
    public long DiskSize;
    public long Start;
    public long End;
    public long Average;
    public long AverageRead;
    public long AverageWrite;
    public uint Granularity;
    public uint Size;
    public uint ReadCount;
    public uint WriteCount;
    public IntPtr Histogram;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DISK_HISTOGRAM
    Public DiskSize As Long
    Public Start As Long
    Public End As Long
    Public Average As Long
    Public AverageRead As Long
    Public AverageWrite As Long
    Public Granularity As UInteger
    Public Size As UInteger
    Public ReadCount As UInteger
    Public WriteCount As UInteger
    Public Histogram As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class DISK_HISTOGRAM(ctypes.Structure):
    _fields_ = [
        ("DiskSize", ctypes.c_longlong),
        ("Start", ctypes.c_longlong),
        ("End", ctypes.c_longlong),
        ("Average", ctypes.c_longlong),
        ("AverageRead", ctypes.c_longlong),
        ("AverageWrite", ctypes.c_longlong),
        ("Granularity", wintypes.DWORD),
        ("Size", wintypes.DWORD),
        ("ReadCount", wintypes.DWORD),
        ("WriteCount", wintypes.DWORD),
        ("Histogram", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct DISK_HISTOGRAM {
    pub DiskSize: i64,
    pub Start: i64,
    pub End: i64,
    pub Average: i64,
    pub AverageRead: i64,
    pub AverageWrite: i64,
    pub Granularity: u32,
    pub Size: u32,
    pub ReadCount: u32,
    pub WriteCount: u32,
    pub Histogram: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type DISK_HISTOGRAM struct {
	DiskSize int64
	Start int64
	End int64
	Average int64
	AverageRead int64
	AverageWrite int64
	Granularity uint32
	Size uint32
	ReadCount uint32
	WriteCount uint32
	Histogram uintptr
}
type
  DISK_HISTOGRAM = record
    DiskSize: Int64;
    Start: Int64;
    End: Int64;
    Average: Int64;
    AverageRead: Int64;
    AverageWrite: Int64;
    Granularity: DWORD;
    Size: DWORD;
    ReadCount: DWORD;
    WriteCount: DWORD;
    Histogram: Pointer;
  end;
const DISK_HISTOGRAM = extern struct {
    DiskSize: i64,
    Start: i64,
    End: i64,
    Average: i64,
    AverageRead: i64,
    AverageWrite: i64,
    Granularity: u32,
    Size: u32,
    ReadCount: u32,
    WriteCount: u32,
    Histogram: ?*anyopaque,
};
type
  DISK_HISTOGRAM {.bycopy.} = object
    DiskSize: int64
    Start: int64
    End: int64
    Average: int64
    AverageRead: int64
    AverageWrite: int64
    Granularity: uint32
    Size: uint32
    ReadCount: uint32
    WriteCount: uint32
    Histogram: pointer
struct DISK_HISTOGRAM
{
    long DiskSize;
    long Start;
    long End;
    long Average;
    long AverageRead;
    long AverageWrite;
    uint Granularity;
    uint Size;
    uint ReadCount;
    uint WriteCount;
    void* Histogram;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DISK_HISTOGRAM サイズ: 72 バイト(x86)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; DiskSize : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; Start : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; End : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; Average : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; AverageRead : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; AverageWrite : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; Granularity : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; Size : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ReadCount : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; WriteCount : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; Histogram : HISTOGRAM_BUCKET* (+64, 4byte)  varptr(st)+64 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DISK_HISTOGRAM サイズ: 72 バイト(x64)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; DiskSize : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; Start : LONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; End : LONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; Average : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; AverageRead : LONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; AverageWrite : LONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; Granularity : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; Size : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ReadCount : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; WriteCount : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; Histogram : HISTOGRAM_BUCKET* (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DISK_HISTOGRAM
    #field int64 DiskSize
    #field int64 Start
    #field int64 End
    #field int64 Average
    #field int64 AverageRead
    #field int64 AverageWrite
    #field int Granularity
    #field int Size
    #field int ReadCount
    #field int WriteCount
    #field intptr Histogram
#endstruct

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