ホーム › System.Ioctl › NTFS_VOLUME_DATA_BUFFER
NTFS_VOLUME_DATA_BUFFER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| VolumeSerialNumber | LONGLONG | 8 | +0 | +0 | ボリュームのシリアル番号です。これは、オペレーティングシステムがボリュームメディアに割り当てる一意の番号です。 |
| NumberSectors | LONGLONG | 8 | +8 | +8 | 指定されたボリューム内のセクター数です。 |
| TotalClusters | LONGLONG | 8 | +16 | +16 | 指定されたボリューム内の使用中および空きクラスターの数です。 |
| FreeClusters | LONGLONG | 8 | +24 | +24 | 指定されたボリューム内の空きクラスターの数です。 |
| TotalReserved | LONGLONG | 8 | +32 | +32 | 指定されたボリューム内の予約済みクラスターの数です。 |
| BytesPerSector | DWORD | 4 | +40 | +40 | 指定されたボリューム上のセクター 1 つあたりのバイト数です。 |
| BytesPerCluster | DWORD | 4 | +44 | +44 | 指定されたボリューム上のクラスター 1 つあたりのバイト数です。この値はクラスターファクターとも呼ばれます。 |
| BytesPerFileRecordSegment | DWORD | 4 | +48 | +48 | ファイルレコードセグメント 1 つあたりのバイト数です。 |
| ClustersPerFileRecordSegment | DWORD | 4 | +52 | +52 | ファイルレコードセグメント 1 つあたりのクラスター数です。 |
| MftValidDataLength | LONGLONG | 8 | +56 | +56 | マスターファイルテーブルの長さ (バイト単位) です。 |
| MftStartLcn | LONGLONG | 8 | +64 | +64 | マスターファイルテーブルの開始論理クラスター番号です。 |
| Mft2StartLcn | LONGLONG | 8 | +72 | +72 | マスターファイルテーブルミラーの開始論理クラスター番号です。 |
| MftZoneStart | LONGLONG | 8 | +80 | +80 | マスターファイルテーブルゾーンの開始論理クラスター番号です。 |
| MftZoneEnd | LONGLONG | 8 | +88 | +88 | マスターファイルテーブルゾーンの終了論理クラスター番号です。 |
公式ドキュメント
ボリュームデータを表します。この構造体は FSCTL_GET_NTFS_VOLUME_DATA 制御コードに渡されます。
解説(Remarks)
予約済みクラスターとは、Windows が後で使用するために予約されている空きクラスターです。
NTFS_VOLUME_DATA_BUFFER 構造体は、FSCTL_GET_NTFS_VOLUME_DATA によって返される基本的な情報を表します。拡張ボリューム情報を取得するには、NTFS_VOLUME_DATA_BUFFER 構造体と NTFS_EXTENDED_VOLUME_DATA 構造体を合わせたサイズのバッファーを渡します。成功すると、FSCTL_GET_NTFS_VOLUME_DATA が返すバッファーには、両方の構造体に関連付けられた情報が格納されます。NTFS_VOLUME_DATA_BUFFER 構造体は常にバッファーの先頭から格納され、その直後に NTFS_EXTENDED_VOLUME_DATA 構造体が続きます。NTFS_EXTENDED_VOLUME_DATA 構造体は次のように定義されています。
| C++ |
|---|
typedef struct {
ULONG ByteCount;
USHORT MajorVersion;
USHORT MinorVersion;
} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
|
sizeof(NTFS_EXTENDED_VOLUME_DATA) になります。そうでない場合は、sizeof(NTFS_EXTENDED_VOLUME_DATA) より小さい値になります。出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// NTFS_VOLUME_DATA_BUFFER (x64 96 / x86 96 バイト)
typedef struct NTFS_VOLUME_DATA_BUFFER {
LONGLONG VolumeSerialNumber;
LONGLONG NumberSectors;
LONGLONG TotalClusters;
LONGLONG FreeClusters;
LONGLONG TotalReserved;
DWORD BytesPerSector;
DWORD BytesPerCluster;
DWORD BytesPerFileRecordSegment;
DWORD ClustersPerFileRecordSegment;
LONGLONG MftValidDataLength;
LONGLONG MftStartLcn;
LONGLONG Mft2StartLcn;
LONGLONG MftZoneStart;
LONGLONG MftZoneEnd;
} NTFS_VOLUME_DATA_BUFFER;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NTFS_VOLUME_DATA_BUFFER
{
public long VolumeSerialNumber;
public long NumberSectors;
public long TotalClusters;
public long FreeClusters;
public long TotalReserved;
public uint BytesPerSector;
public uint BytesPerCluster;
public uint BytesPerFileRecordSegment;
public uint ClustersPerFileRecordSegment;
public long MftValidDataLength;
public long MftStartLcn;
public long Mft2StartLcn;
public long MftZoneStart;
public long MftZoneEnd;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NTFS_VOLUME_DATA_BUFFER
Public VolumeSerialNumber As Long
Public NumberSectors As Long
Public TotalClusters As Long
Public FreeClusters As Long
Public TotalReserved As Long
Public BytesPerSector As UInteger
Public BytesPerCluster As UInteger
Public BytesPerFileRecordSegment As UInteger
Public ClustersPerFileRecordSegment As UInteger
Public MftValidDataLength As Long
Public MftStartLcn As Long
Public Mft2StartLcn As Long
Public MftZoneStart As Long
Public MftZoneEnd As Long
End Structureimport ctypes
from ctypes import wintypes
class NTFS_VOLUME_DATA_BUFFER(ctypes.Structure):
_fields_ = [
("VolumeSerialNumber", ctypes.c_longlong),
("NumberSectors", ctypes.c_longlong),
("TotalClusters", ctypes.c_longlong),
("FreeClusters", ctypes.c_longlong),
("TotalReserved", ctypes.c_longlong),
("BytesPerSector", wintypes.DWORD),
("BytesPerCluster", wintypes.DWORD),
("BytesPerFileRecordSegment", wintypes.DWORD),
("ClustersPerFileRecordSegment", wintypes.DWORD),
("MftValidDataLength", ctypes.c_longlong),
("MftStartLcn", ctypes.c_longlong),
("Mft2StartLcn", ctypes.c_longlong),
("MftZoneStart", ctypes.c_longlong),
("MftZoneEnd", ctypes.c_longlong),
]#[repr(C)]
pub struct NTFS_VOLUME_DATA_BUFFER {
pub VolumeSerialNumber: i64,
pub NumberSectors: i64,
pub TotalClusters: i64,
pub FreeClusters: i64,
pub TotalReserved: i64,
pub BytesPerSector: u32,
pub BytesPerCluster: u32,
pub BytesPerFileRecordSegment: u32,
pub ClustersPerFileRecordSegment: u32,
pub MftValidDataLength: i64,
pub MftStartLcn: i64,
pub Mft2StartLcn: i64,
pub MftZoneStart: i64,
pub MftZoneEnd: i64,
}import "golang.org/x/sys/windows"
type NTFS_VOLUME_DATA_BUFFER struct {
VolumeSerialNumber int64
NumberSectors int64
TotalClusters int64
FreeClusters int64
TotalReserved int64
BytesPerSector uint32
BytesPerCluster uint32
BytesPerFileRecordSegment uint32
ClustersPerFileRecordSegment uint32
MftValidDataLength int64
MftStartLcn int64
Mft2StartLcn int64
MftZoneStart int64
MftZoneEnd int64
}type
NTFS_VOLUME_DATA_BUFFER = record
VolumeSerialNumber: Int64;
NumberSectors: Int64;
TotalClusters: Int64;
FreeClusters: Int64;
TotalReserved: Int64;
BytesPerSector: DWORD;
BytesPerCluster: DWORD;
BytesPerFileRecordSegment: DWORD;
ClustersPerFileRecordSegment: DWORD;
MftValidDataLength: Int64;
MftStartLcn: Int64;
Mft2StartLcn: Int64;
MftZoneStart: Int64;
MftZoneEnd: Int64;
end;const NTFS_VOLUME_DATA_BUFFER = extern struct {
VolumeSerialNumber: i64,
NumberSectors: i64,
TotalClusters: i64,
FreeClusters: i64,
TotalReserved: i64,
BytesPerSector: u32,
BytesPerCluster: u32,
BytesPerFileRecordSegment: u32,
ClustersPerFileRecordSegment: u32,
MftValidDataLength: i64,
MftStartLcn: i64,
Mft2StartLcn: i64,
MftZoneStart: i64,
MftZoneEnd: i64,
};type
NTFS_VOLUME_DATA_BUFFER {.bycopy.} = object
VolumeSerialNumber: int64
NumberSectors: int64
TotalClusters: int64
FreeClusters: int64
TotalReserved: int64
BytesPerSector: uint32
BytesPerCluster: uint32
BytesPerFileRecordSegment: uint32
ClustersPerFileRecordSegment: uint32
MftValidDataLength: int64
MftStartLcn: int64
Mft2StartLcn: int64
MftZoneStart: int64
MftZoneEnd: int64struct NTFS_VOLUME_DATA_BUFFER
{
long VolumeSerialNumber;
long NumberSectors;
long TotalClusters;
long FreeClusters;
long TotalReserved;
uint BytesPerSector;
uint BytesPerCluster;
uint BytesPerFileRecordSegment;
uint ClustersPerFileRecordSegment;
long MftValidDataLength;
long MftStartLcn;
long Mft2StartLcn;
long MftZoneStart;
long MftZoneEnd;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NTFS_VOLUME_DATA_BUFFER サイズ: 96 バイト(x64)
dim st, 24 ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; VolumeSerialNumber : LONGLONG (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; NumberSectors : LONGLONG (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; TotalClusters : LONGLONG (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; FreeClusters : LONGLONG (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; TotalReserved : LONGLONG (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; BytesPerSector : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; BytesPerCluster : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; BytesPerFileRecordSegment : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; ClustersPerFileRecordSegment : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; MftValidDataLength : LONGLONG (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; MftStartLcn : LONGLONG (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; Mft2StartLcn : LONGLONG (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; MftZoneStart : LONGLONG (+80, 8byte) qpoke st,80,値 / qpeek(st,80) ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; MftZoneEnd : LONGLONG (+88, 8byte) qpoke st,88,値 / qpeek(st,88) ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NTFS_VOLUME_DATA_BUFFER
#field int64 VolumeSerialNumber
#field int64 NumberSectors
#field int64 TotalClusters
#field int64 FreeClusters
#field int64 TotalReserved
#field int BytesPerSector
#field int BytesPerCluster
#field int BytesPerFileRecordSegment
#field int ClustersPerFileRecordSegment
#field int64 MftValidDataLength
#field int64 MftStartLcn
#field int64 Mft2StartLcn
#field int64 MftZoneStart
#field int64 MftZoneEnd
#endstruct
stdim st, NTFS_VOLUME_DATA_BUFFER ; NSTRUCT 変数を確保
st->VolumeSerialNumber = 100
mes "VolumeSerialNumber=" + st->VolumeSerialNumber