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

GetVolumeInformationW

関数
ルートパスからボリュームの名前やファイルシステム情報を取得する。
DLLKERNEL32.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// KERNEL32.dll  (Unicode / -W)
#include <windows.h>

BOOL GetVolumeInformationW(
    LPCWSTR lpRootPathName,   // optional
    LPWSTR lpVolumeNameBuffer,   // optional
    DWORD nVolumeNameSize,
    DWORD* lpVolumeSerialNumber,   // optional
    DWORD* lpMaximumComponentLength,   // optional
    DWORD* lpFileSystemFlags,   // optional
    LPWSTR lpFileSystemNameBuffer,   // optional
    DWORD nFileSystemNameSize
);

パラメーター

名前方向説明
lpRootPathNameLPCWSTRinoptional

記述対象となるボリュームのルートディレクトリを含む文字列へのポインターです。

このパラメーターが NULL の場合、現在のディレクトリのルートが使用されます。末尾のバックスラッシュが必要です。たとえば、\\MyServer\MyShare は "\\MyServer\MyShare\" のように、C ドライブは "C:\" のように指定します。

lpVolumeNameBufferLPWSTRoutoptional指定したボリュームの名前を受け取るバッファーへのポインターです。バッファーサイズは nVolumeNameSize パラメーターで指定します。
nVolumeNameSizeDWORDin

ボリューム名バッファーの長さを TCHAR 単位で指定します。最大バッファーサイズは MAX_PATH+1 です。

ボリューム名バッファーを指定しない場合、このパラメーターは無視されます。

lpVolumeSerialNumberDWORD*outoptional

ボリュームシリアル番号を受け取る変数へのポインターです。

シリアル番号が不要な場合、このパラメーターは NULL を指定できます。

この関数は、ハードディスクのフォーマット時にオペレーティングシステムが割り当てるボリュームシリアル番号を返します。製造元が割り当てるハードディスクのシリアル番号をプログラムで取得するには、Windows Management Instrumentation (WMI) の Win32_PhysicalMedia プロパティ SerialNumber を使用してください。

lpMaximumComponentLengthDWORD*outoptional

指定したファイルシステムがサポートするファイル名コンポーネントの最大長を TCHAR 単位で受け取る変数へのポインターです。

ファイル名コンポーネントとは、バックスラッシュ間のファイル名の部分です。

*lpMaximumComponentLength が指す変数に格納される値は、指定したファイルシステムが長い名前をサポートしているかどうかを示すために使用されます。たとえば、長い名前をサポートする FAT ファイルシステムの場合、この関数は以前の 8.3 形式の指標ではなく値 255 を格納します。長い名前は NTFS ファイルシステムを使用するシステムでもサポートされます。

lpFileSystemFlagsDWORD*outoptional

指定したファイルシステムに関連付けられたフラグを受け取る変数へのポインターです。

このパラメーターには以下のフラグの 1 つ以上を指定できます。ただし、FILE_FILE_COMPRESSIONFILE_VOL_IS_COMPRESSED は相互排他的です。

意味
FILE_CASE_SENSITIVE_SEARCH
0x00000001
指定したボリュームは大文字と小文字を区別するファイル名をサポートします。
FILE_CASE_PRESERVED_NAMES
0x00000002
指定したボリュームは、ディスク上に名前を配置する際にファイル名の大文字と小文字を保持します。
FILE_UNICODE_ON_DISK
0x00000004
指定したボリュームは、ディスク上に表示されるファイル名で Unicode をサポートします。
FILE_PERSISTENT_ACLS
0x00000008
指定したボリュームはアクセス制御リスト (ACL) を保持し、適用します。たとえば、NTFS ファイルシステムは ACL を保持して適用しますが、FAT ファイルシステムは保持しません。
FILE_FILE_COMPRESSION
0x00000010
指定したボリュームはファイル単位の圧縮をサポートします。
FILE_VOLUME_QUOTAS
0x00000020
指定したボリュームはディスククォータをサポートします。
FILE_SUPPORTS_SPARSE_FILES
0x00000040
指定したボリュームはスパースファイルをサポートします。
FILE_SUPPORTS_REPARSE_POINTS
0x00000080
指定したボリュームは再解析ポイントをサポートします。

ReFS: ReFS は再解析ポイントをサポートしますが、それらにインデックスを付けないため、FindFirstVolumeMountPoint および FindNextVolumeMountPoint は期待どおりに動作しません。
FILE_SUPPORTS_REMOTE_STORAGE
0x00000100
ファイルシステムはリモートストレージをサポートします。
FILE_RETURNS_CLEANUP_RESULT_INFO
0x00000200
クリーンアップ操作が成功すると、ファイルシステムはファイルの削除など、クリーンアップ中に行われた追加のアクションを記述する情報を返します。ファイルシステムフィルターは、クリーンアップ後のコールバックでこの情報を検査できます。
FILE_SUPPORTS_POSIX_UNLINK_RENAME
0x00000400
ファイルシステムは POSIX スタイルの削除およびリネーム操作をサポートします。
FILE_VOLUME_IS_COMPRESSED
0x00008000
指定したボリュームは圧縮ボリュームです (たとえば DoubleSpace ボリューム)。
FILE_SUPPORTS_OBJECT_IDS
0x00010000
指定したボリュームはオブジェクト識別子をサポートします。
FILE_SUPPORTS_ENCRYPTION
0x00020000
指定したボリュームは暗号化ファイルシステム (EFS) をサポートします。詳細については、File Encryption を参照してください。
FILE_NAMED_STREAMS
0x00040000
指定したボリュームは名前付きストリームをサポートします。
FILE_READ_ONLY_VOLUME
0x00080000
指定したボリュームは読み取り専用です。
FILE_SEQUENTIAL_WRITE_ONCE
0x00100000
指定したボリュームは 1 回のシーケンシャル書き込みをサポートします。
FILE_SUPPORTS_TRANSACTIONS
0x00200000
指定したボリュームはトランザクションをサポートします。詳細については、About KTM を参照してください。
FILE_SUPPORTS_HARD_LINKS
0x00400000
指定したボリュームはハードリンクをサポートします。詳細については、Hard Links and Junctions を参照してください。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値は Windows Server 2008 R2 および Windows 7 までサポートされません。
FILE_SUPPORTS_EXTENDED_ATTRIBUTES
0x00800000
指定したボリュームは拡張属性をサポートします。拡張属性とは、アプリケーションがファイルに関連付けることができるアプリケーション固有のメタデータであり、ファイルのデータの一部ではありません。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値は Windows Server 2008 R2 および Windows 7 までサポートされません。
FILE_SUPPORTS_OPEN_BY_FILE_ID
0x01000000
ファイルシステムは FileID による開く操作をサポートします。詳細については、FILE_ID_BOTH_DIR_INFO を参照してください。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値は Windows Server 2008 R2 および Windows 7 までサポートされません。
FILE_SUPPORTS_USN_JOURNAL
0x02000000
指定したボリュームは更新シーケンス番号 (USN) ジャーナルをサポートします。詳細については、Change Journal Records を参照してください。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値は Windows Server 2008 R2 および Windows 7 までサポートされません。
FILE_SUPPORTS_INTEGRITY_STREAMS
0x04000000
ファイルシステムは integrity streams をサポートします。
FILE_SUPPORTS_BLOCK_REFCOUNTING
0x08000000
指定したボリュームは、同一ボリューム上のファイル間で論理クラスターを共有することをサポートします。ファイルシステムは共有クラスターへの書き込み時に再割り当てを行います。FSCTL_DUPLICATE_EXTENTS_TO_FILE がサポートされる操作であることを示します。
FILE_SUPPORTS_SPARSE_VDL
0x10000000
ファイルシステムは、ファイルの各クラスターが有効なデータ (明示的なファイル書き込みまたは自動的なゼロ埋めによるもの) を含むか、無効なデータ (まだ書き込まれていないかゼロ埋めされていない) を含むかを追跡します。スパースな有効データ長 (VDL) を使用するファイルシステムは、有効データ長を格納せず、有効なデータがファイル内で連続している必要もありません。
FILE_DAX_VOLUME
0x20000000
指定したボリュームは直接アクセス (DAX) ボリュームです。

注: このフラグは Windows 10 バージョン 1607 で導入されました。
FILE_SUPPORTS_GHOSTING
0x40000000
ファイルシステムはゴーストをサポートします。
lpFileSystemNameBufferLPWSTRoutoptionalファイルシステムの名前 (たとえば FAT ファイルシステムや NTFS ファイルシステム) を受け取るバッファーへのポインターです。バッファーサイズは nFileSystemNameSize パラメーターで指定します。
nFileSystemNameSizeDWORDin

ファイルシステム名バッファーの長さを TCHAR 単位で指定します。最大バッファーサイズは MAX_PATH+1 です。

ファイルシステム名バッファーを指定しない場合、このパラメーターは無視されます。

戻り値の型: BOOL

公式ドキュメント

指定したルートディレクトリに関連付けられたファイルシステムおよびボリュームに関する情報を取得します。(Unicode)

戻り値

要求したすべての情報が取得された場合、戻り値は 0 以外になります。

要求した情報の一部が取得されなかった場合、戻り値は 0 になります。拡張エラー情報を取得するには、GetLastError を呼び出してください。

解説(Remarks)

フロッピーディスクが入っていないフロッピードライブや、コンパクトディスクが入っていない CD-ROM ドライブに関する情報を取得しようとすると、システムはフロッピーディスクまたはコンパクトディスクの挿入を求めるメッセージボックスをそれぞれ表示します。システムがこのメッセージボックスを表示しないようにするには、SetErrorMode 関数を SEM_FAILCRITICALERRORS とともに呼び出してください。

FILE_VOL_IS_COMPRESSED フラグは、ボリューム単位の圧縮を示す唯一の指標です。圧縮を示すためにファイルシステム名が変更されることはありません。たとえば、このフラグは DoubleSpace ボリュームでは設定されて返されます。圧縮がボリューム単位の場合、ボリューム全体が圧縮されるか、圧縮されないかのいずれかになります。

FILE_FILE_COMPRESSION フラグは、ファイルシステムがファイル単位の圧縮をサポートするかどうかを示します。圧縮がファイル単位の場合、個々のファイルを圧縮するか圧縮しないかを選択できます。

FILE_FILE_COMPRESSION フラグと FILE_VOL_IS_COMPRESSED フラグは相互排他的です。両方のビットが設定された状態で返されることはありません。

lpMaximumComponentLength に格納される最大コンポーネント長の値は、ボリュームが通常より長い FAT ファイルシステム (またはその他のファイルシステム) のファイル名をサポートしていることを示す唯一の指標です。長いファイル名のサポートを示すためにファイルシステム名が変更されることはありません。

GetCompressedFileSize 関数はファイルの圧縮後のサイズを取得します。GetFileAttributes 関数は、個々のファイルが圧縮されているかどうかを判定できます。

シンボリックリンクの動作

パスがシンボリックリンクを指している場合、この関数はターゲットのボリューム情報を返します。

Windows 8 および Windows Server 2012 以降、この関数は以下の技術でサポートされます。

技術 サポート
Server Message Block (SMB) 3.0 プロトコル いいえ
SMB 3.0 透過的フェールオーバー (TFO) いいえ
スケールアウトファイル共有 (SO) を使用する SMB 3.0 いいえ
クラスター共有ボリュームファイルシステム (CsvFS) はい
回復性ファイルシステム (ReFS) はい

SMB はボリューム管理機能をサポートしません。

トランザクション操作

ボリュームがファイルシステムトランザクションをサポートする場合、この関数は lpFileSystemFlagsFILE_SUPPORTS_TRANSACTIONS を返します。

メモ

fileapi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして GetVolumeInformation を定義します。エンコーディング中立のエイリアスの使用を、エンコーディング中立でないコードと混在させると、不一致が生じてコンパイルエラーや実行時エラーを引き起こす可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll  (Unicode / -W)
#include <windows.h>

BOOL GetVolumeInformationW(
    LPCWSTR lpRootPathName,   // optional
    LPWSTR lpVolumeNameBuffer,   // optional
    DWORD nVolumeNameSize,
    DWORD* lpVolumeSerialNumber,   // optional
    DWORD* lpMaximumComponentLength,   // optional
    DWORD* lpFileSystemFlags,   // optional
    LPWSTR lpFileSystemNameBuffer,   // optional
    DWORD nFileSystemNameSize
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern bool GetVolumeInformationW(
    [MarshalAs(UnmanagedType.LPWStr)] string lpRootPathName,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpVolumeNameBuffer,   // LPWSTR optional, out
    uint nVolumeNameSize,   // DWORD
    IntPtr lpVolumeSerialNumber,   // DWORD* optional, out
    IntPtr lpMaximumComponentLength,   // DWORD* optional, out
    IntPtr lpFileSystemFlags,   // DWORD* optional, out
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpFileSystemNameBuffer,   // LPWSTR optional, out
    uint nFileSystemNameSize   // DWORD
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function GetVolumeInformationW(
    <MarshalAs(UnmanagedType.LPWStr)> lpRootPathName As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpVolumeNameBuffer As System.Text.StringBuilder,   ' LPWSTR optional, out
    nVolumeNameSize As UInteger,   ' DWORD
    lpVolumeSerialNumber As IntPtr,   ' DWORD* optional, out
    lpMaximumComponentLength As IntPtr,   ' DWORD* optional, out
    lpFileSystemFlags As IntPtr,   ' DWORD* optional, out
    <MarshalAs(UnmanagedType.LPWStr)> lpFileSystemNameBuffer As System.Text.StringBuilder,   ' LPWSTR optional, out
    nFileSystemNameSize As UInteger   ' DWORD
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' lpRootPathName : LPCWSTR optional
' lpVolumeNameBuffer : LPWSTR optional, out
' nVolumeNameSize : DWORD
' lpVolumeSerialNumber : DWORD* optional, out
' lpMaximumComponentLength : DWORD* optional, out
' lpFileSystemFlags : DWORD* optional, out
' lpFileSystemNameBuffer : LPWSTR optional, out
' nFileSystemNameSize : DWORD
Declare PtrSafe Function GetVolumeInformationW Lib "kernel32" ( _
    ByVal lpRootPathName As LongPtr, _
    ByVal lpVolumeNameBuffer As LongPtr, _
    ByVal nVolumeNameSize As Long, _
    ByVal lpVolumeSerialNumber As LongPtr, _
    ByVal lpMaximumComponentLength As LongPtr, _
    ByVal lpFileSystemFlags As LongPtr, _
    ByVal lpFileSystemNameBuffer As LongPtr, _
    ByVal nFileSystemNameSize As Long) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetVolumeInformationW = ctypes.windll.kernel32.GetVolumeInformationW
GetVolumeInformationW.restype = wintypes.BOOL
GetVolumeInformationW.argtypes = [
    wintypes.LPCWSTR,  # lpRootPathName : LPCWSTR optional
    wintypes.LPWSTR,  # lpVolumeNameBuffer : LPWSTR optional, out
    wintypes.DWORD,  # nVolumeNameSize : DWORD
    ctypes.POINTER(wintypes.DWORD),  # lpVolumeSerialNumber : DWORD* optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpMaximumComponentLength : DWORD* optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpFileSystemFlags : DWORD* optional, out
    wintypes.LPWSTR,  # lpFileSystemNameBuffer : LPWSTR optional, out
    wintypes.DWORD,  # nFileSystemNameSize : DWORD
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
GetVolumeInformationW = Fiddle::Function.new(
  lib['GetVolumeInformationW'],
  [
    Fiddle::TYPE_VOIDP,  # lpRootPathName : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpVolumeNameBuffer : LPWSTR optional, out
    -Fiddle::TYPE_INT,  # nVolumeNameSize : DWORD
    Fiddle::TYPE_VOIDP,  # lpVolumeSerialNumber : DWORD* optional, out
    Fiddle::TYPE_VOIDP,  # lpMaximumComponentLength : DWORD* optional, out
    Fiddle::TYPE_VOIDP,  # lpFileSystemFlags : DWORD* optional, out
    Fiddle::TYPE_VOIDP,  # lpFileSystemNameBuffer : LPWSTR optional, out
    -Fiddle::TYPE_INT,  # nFileSystemNameSize : DWORD
  ],
  Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "kernel32")]
extern "system" {
    fn GetVolumeInformationW(
        lpRootPathName: *const u16,  // LPCWSTR optional
        lpVolumeNameBuffer: *mut u16,  // LPWSTR optional, out
        nVolumeNameSize: u32,  // DWORD
        lpVolumeSerialNumber: *mut u32,  // DWORD* optional, out
        lpMaximumComponentLength: *mut u32,  // DWORD* optional, out
        lpFileSystemFlags: *mut u32,  // DWORD* optional, out
        lpFileSystemNameBuffer: *mut u16,  // LPWSTR optional, out
        nFileSystemNameSize: u32  // DWORD
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool GetVolumeInformationW([MarshalAs(UnmanagedType.LPWStr)] string lpRootPathName, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpVolumeNameBuffer, uint nVolumeNameSize, IntPtr lpVolumeSerialNumber, IntPtr lpMaximumComponentLength, IntPtr lpFileSystemFlags, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpFileSystemNameBuffer, uint nFileSystemNameSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_GetVolumeInformationW' -Namespace Win32 -PassThru
# $api::GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
#uselib "KERNEL32.dll"
#func global GetVolumeInformationW "GetVolumeInformationW" wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr
; GetVolumeInformationW lpRootPathName, varptr(lpVolumeNameBuffer), nVolumeNameSize, varptr(lpVolumeSerialNumber), varptr(lpMaximumComponentLength), varptr(lpFileSystemFlags), varptr(lpFileSystemNameBuffer), nFileSystemNameSize   ; 戻り値は stat
; lpRootPathName : LPCWSTR optional -> "wptr"
; lpVolumeNameBuffer : LPWSTR optional, out -> "wptr"
; nVolumeNameSize : DWORD -> "wptr"
; lpVolumeSerialNumber : DWORD* optional, out -> "wptr"
; lpMaximumComponentLength : DWORD* optional, out -> "wptr"
; lpFileSystemFlags : DWORD* optional, out -> "wptr"
; lpFileSystemNameBuffer : LPWSTR optional, out -> "wptr"
; nFileSystemNameSize : DWORD -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global GetVolumeInformationW "GetVolumeInformationW" wstr, var, int, var, var, var, var, int
; res = GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
; lpRootPathName : LPCWSTR optional -> "wstr"
; lpVolumeNameBuffer : LPWSTR optional, out -> "var"
; nVolumeNameSize : DWORD -> "int"
; lpVolumeSerialNumber : DWORD* optional, out -> "var"
; lpMaximumComponentLength : DWORD* optional, out -> "var"
; lpFileSystemFlags : DWORD* optional, out -> "var"
; lpFileSystemNameBuffer : LPWSTR optional, out -> "var"
; nFileSystemNameSize : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, DWORD* lpVolumeSerialNumber, DWORD* lpMaximumComponentLength, DWORD* lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize)
#uselib "KERNEL32.dll"
#cfunc global GetVolumeInformationW "GetVolumeInformationW" wstr, var, int, var, var, var, var, int
; res = GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
; lpRootPathName : LPCWSTR optional -> "wstr"
; lpVolumeNameBuffer : LPWSTR optional, out -> "var"
; nVolumeNameSize : DWORD -> "int"
; lpVolumeSerialNumber : DWORD* optional, out -> "var"
; lpMaximumComponentLength : DWORD* optional, out -> "var"
; lpFileSystemFlags : DWORD* optional, out -> "var"
; lpFileSystemNameBuffer : LPWSTR optional, out -> "var"
; nFileSystemNameSize : DWORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procGetVolumeInformationW = kernel32.NewProc("GetVolumeInformationW")
)

// lpRootPathName (LPCWSTR optional), lpVolumeNameBuffer (LPWSTR optional, out), nVolumeNameSize (DWORD), lpVolumeSerialNumber (DWORD* optional, out), lpMaximumComponentLength (DWORD* optional, out), lpFileSystemFlags (DWORD* optional, out), lpFileSystemNameBuffer (LPWSTR optional, out), nFileSystemNameSize (DWORD)
r1, _, err := procGetVolumeInformationW.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpRootPathName))),
	uintptr(lpVolumeNameBuffer),
	uintptr(nVolumeNameSize),
	uintptr(lpVolumeSerialNumber),
	uintptr(lpMaximumComponentLength),
	uintptr(lpFileSystemFlags),
	uintptr(lpFileSystemNameBuffer),
	uintptr(nFileSystemNameSize),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function GetVolumeInformationW(
  lpRootPathName: PWideChar;   // LPCWSTR optional
  lpVolumeNameBuffer: PWideChar;   // LPWSTR optional, out
  nVolumeNameSize: DWORD;   // DWORD
  lpVolumeSerialNumber: Pointer;   // DWORD* optional, out
  lpMaximumComponentLength: Pointer;   // DWORD* optional, out
  lpFileSystemFlags: Pointer;   // DWORD* optional, out
  lpFileSystemNameBuffer: PWideChar;   // LPWSTR optional, out
  nFileSystemNameSize: DWORD   // DWORD
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetVolumeInformationW';
result := DllCall("KERNEL32\GetVolumeInformationW"
    , "WStr", lpRootPathName   ; LPCWSTR optional
    , "Ptr", lpVolumeNameBuffer   ; LPWSTR optional, out
    , "UInt", nVolumeNameSize   ; DWORD
    , "Ptr", lpVolumeSerialNumber   ; DWORD* optional, out
    , "Ptr", lpMaximumComponentLength   ; DWORD* optional, out
    , "Ptr", lpFileSystemFlags   ; DWORD* optional, out
    , "Ptr", lpFileSystemNameBuffer   ; LPWSTR optional, out
    , "UInt", nFileSystemNameSize   ; DWORD
    , "Int")   ; return: BOOL
●GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize) = DLL("KERNEL32.dll", "bool GetVolumeInformationW(char*, char*, dword, void*, void*, void*, char*, dword)")
# 呼び出し: GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
# lpRootPathName : LPCWSTR optional -> "char*"
# lpVolumeNameBuffer : LPWSTR optional, out -> "char*"
# nVolumeNameSize : DWORD -> "dword"
# lpVolumeSerialNumber : DWORD* optional, out -> "void*"
# lpMaximumComponentLength : DWORD* optional, out -> "void*"
# lpFileSystemFlags : DWORD* optional, out -> "void*"
# lpFileSystemNameBuffer : LPWSTR optional, out -> "char*"
# nFileSystemNameSize : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "kernel32" fn GetVolumeInformationW(
    lpRootPathName: [*c]const u16, // LPCWSTR optional
    lpVolumeNameBuffer: [*c]u16, // LPWSTR optional, out
    nVolumeNameSize: u32, // DWORD
    lpVolumeSerialNumber: [*c]u32, // DWORD* optional, out
    lpMaximumComponentLength: [*c]u32, // DWORD* optional, out
    lpFileSystemFlags: [*c]u32, // DWORD* optional, out
    lpFileSystemNameBuffer: [*c]u16, // LPWSTR optional, out
    nFileSystemNameSize: u32 // DWORD
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc GetVolumeInformationW(
    lpRootPathName: WideCString,  # LPCWSTR optional
    lpVolumeNameBuffer: ptr uint16,  # LPWSTR optional, out
    nVolumeNameSize: uint32,  # DWORD
    lpVolumeSerialNumber: ptr uint32,  # DWORD* optional, out
    lpMaximumComponentLength: ptr uint32,  # DWORD* optional, out
    lpFileSystemFlags: ptr uint32,  # DWORD* optional, out
    lpFileSystemNameBuffer: ptr uint16,  # LPWSTR optional, out
    nFileSystemNameSize: uint32  # DWORD
): int32 {.importc: "GetVolumeInformationW", stdcall, dynlib: "KERNEL32.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "kernel32");
extern(Windows)
int GetVolumeInformationW(
    const(wchar)* lpRootPathName,   // LPCWSTR optional
    wchar* lpVolumeNameBuffer,   // LPWSTR optional, out
    uint nVolumeNameSize,   // DWORD
    uint* lpVolumeSerialNumber,   // DWORD* optional, out
    uint* lpMaximumComponentLength,   // DWORD* optional, out
    uint* lpFileSystemFlags,   // DWORD* optional, out
    wchar* lpFileSystemNameBuffer,   // LPWSTR optional, out
    uint nFileSystemNameSize   // DWORD
);
ccall((:GetVolumeInformationW, "KERNEL32.dll"), stdcall, Int32,
      (Cwstring, Ptr{UInt16}, UInt32, Ptr{UInt32}, Ptr{UInt32}, Ptr{UInt32}, Ptr{UInt16}, UInt32),
      lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
# lpRootPathName : LPCWSTR optional -> Cwstring
# lpVolumeNameBuffer : LPWSTR optional, out -> Ptr{UInt16}
# nVolumeNameSize : DWORD -> UInt32
# lpVolumeSerialNumber : DWORD* optional, out -> Ptr{UInt32}
# lpMaximumComponentLength : DWORD* optional, out -> Ptr{UInt32}
# lpFileSystemFlags : DWORD* optional, out -> Ptr{UInt32}
# lpFileSystemNameBuffer : LPWSTR optional, out -> Ptr{UInt16}
# nFileSystemNameSize : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetVolumeInformationW(
    const uint16_t* lpRootPathName,
    uint16_t* lpVolumeNameBuffer,
    uint32_t nVolumeNameSize,
    uint32_t* lpVolumeSerialNumber,
    uint32_t* lpMaximumComponentLength,
    uint32_t* lpFileSystemFlags,
    uint16_t* lpFileSystemNameBuffer,
    uint32_t nFileSystemNameSize);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
-- lpRootPathName : LPCWSTR optional
-- lpVolumeNameBuffer : LPWSTR optional, out
-- nVolumeNameSize : DWORD
-- lpVolumeSerialNumber : DWORD* optional, out
-- lpMaximumComponentLength : DWORD* optional, out
-- lpFileSystemFlags : DWORD* optional, out
-- lpFileSystemNameBuffer : LPWSTR optional, out
-- nFileSystemNameSize : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const GetVolumeInformationW = lib.func('__stdcall', 'GetVolumeInformationW', 'int32_t', ['str16', 'uint16_t *', 'uint32_t', 'uint32_t *', 'uint32_t *', 'uint32_t *', 'uint16_t *', 'uint32_t']);
// GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
// lpRootPathName : LPCWSTR optional -> 'str16'
// lpVolumeNameBuffer : LPWSTR optional, out -> 'uint16_t *'
// nVolumeNameSize : DWORD -> 'uint32_t'
// lpVolumeSerialNumber : DWORD* optional, out -> 'uint32_t *'
// lpMaximumComponentLength : DWORD* optional, out -> 'uint32_t *'
// lpFileSystemFlags : DWORD* optional, out -> 'uint32_t *'
// lpFileSystemNameBuffer : LPWSTR optional, out -> 'uint16_t *'
// nFileSystemNameSize : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  GetVolumeInformationW: { parameters: ["buffer", "buffer", "u32", "pointer", "pointer", "pointer", "buffer", "u32"], result: "i32" },
});
// lib.symbols.GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
// lpRootPathName : LPCWSTR optional -> "buffer"
// lpVolumeNameBuffer : LPWSTR optional, out -> "buffer"
// nVolumeNameSize : DWORD -> "u32"
// lpVolumeSerialNumber : DWORD* optional, out -> "pointer"
// lpMaximumComponentLength : DWORD* optional, out -> "pointer"
// lpFileSystemFlags : DWORD* optional, out -> "pointer"
// lpFileSystemNameBuffer : LPWSTR optional, out -> "buffer"
// nFileSystemNameSize : DWORD -> "u32"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetVolumeInformationW(
    const uint16_t* lpRootPathName,
    uint16_t* lpVolumeNameBuffer,
    uint32_t nVolumeNameSize,
    uint32_t* lpVolumeSerialNumber,
    uint32_t* lpMaximumComponentLength,
    uint32_t* lpFileSystemFlags,
    uint16_t* lpFileSystemNameBuffer,
    uint32_t nFileSystemNameSize);
C, "KERNEL32.dll");
// $ffi->GetVolumeInformationW(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
// lpRootPathName : LPCWSTR optional
// lpVolumeNameBuffer : LPWSTR optional, out
// nVolumeNameSize : DWORD
// lpVolumeSerialNumber : DWORD* optional, out
// lpMaximumComponentLength : DWORD* optional, out
// lpFileSystemFlags : DWORD* optional, out
// lpFileSystemNameBuffer : LPWSTR optional, out
// nFileSystemNameSize : DWORD
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
    boolean GetVolumeInformationW(
        WString lpRootPathName,   // LPCWSTR optional
        char[] lpVolumeNameBuffer,   // LPWSTR optional, out
        int nVolumeNameSize,   // DWORD
        IntByReference lpVolumeSerialNumber,   // DWORD* optional, out
        IntByReference lpMaximumComponentLength,   // DWORD* optional, out
        IntByReference lpFileSystemFlags,   // DWORD* optional, out
        char[] lpFileSystemNameBuffer,   // LPWSTR optional, out
        int nFileSystemNameSize   // DWORD
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("kernel32")]
lib LibKERNEL32
  fun GetVolumeInformationW = GetVolumeInformationW(
    lpRootPathName : UInt16*,   # LPCWSTR optional
    lpVolumeNameBuffer : UInt16*,   # LPWSTR optional, out
    nVolumeNameSize : UInt32,   # DWORD
    lpVolumeSerialNumber : UInt32*,   # DWORD* optional, out
    lpMaximumComponentLength : UInt32*,   # DWORD* optional, out
    lpFileSystemFlags : UInt32*,   # DWORD* optional, out
    lpFileSystemNameBuffer : UInt16*,   # LPWSTR optional, out
    nFileSystemNameSize : UInt32   # DWORD
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef GetVolumeInformationWNative = Int32 Function(Pointer<Utf16>, Pointer<Utf16>, Uint32, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Utf16>, Uint32);
typedef GetVolumeInformationWDart = int Function(Pointer<Utf16>, Pointer<Utf16>, int, Pointer<Uint32>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Utf16>, int);
final GetVolumeInformationW = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<GetVolumeInformationWNative, GetVolumeInformationWDart>('GetVolumeInformationW');
// lpRootPathName : LPCWSTR optional -> Pointer<Utf16>
// lpVolumeNameBuffer : LPWSTR optional, out -> Pointer<Utf16>
// nVolumeNameSize : DWORD -> Uint32
// lpVolumeSerialNumber : DWORD* optional, out -> Pointer<Uint32>
// lpMaximumComponentLength : DWORD* optional, out -> Pointer<Uint32>
// lpFileSystemFlags : DWORD* optional, out -> Pointer<Uint32>
// lpFileSystemNameBuffer : LPWSTR optional, out -> Pointer<Utf16>
// nFileSystemNameSize : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetVolumeInformationW(
  lpRootPathName: PWideChar;   // LPCWSTR optional
  lpVolumeNameBuffer: PWideChar;   // LPWSTR optional, out
  nVolumeNameSize: DWORD;   // DWORD
  lpVolumeSerialNumber: Pointer;   // DWORD* optional, out
  lpMaximumComponentLength: Pointer;   // DWORD* optional, out
  lpFileSystemFlags: Pointer;   // DWORD* optional, out
  lpFileSystemNameBuffer: PWideChar;   // LPWSTR optional, out
  nFileSystemNameSize: DWORD   // DWORD
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetVolumeInformationW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetVolumeInformationW"
  c_GetVolumeInformationW :: CWString -> CWString -> Word32 -> Ptr Word32 -> Ptr Word32 -> Ptr Word32 -> CWString -> Word32 -> IO CInt
-- lpRootPathName : LPCWSTR optional -> CWString
-- lpVolumeNameBuffer : LPWSTR optional, out -> CWString
-- nVolumeNameSize : DWORD -> Word32
-- lpVolumeSerialNumber : DWORD* optional, out -> Ptr Word32
-- lpMaximumComponentLength : DWORD* optional, out -> Ptr Word32
-- lpFileSystemFlags : DWORD* optional, out -> Ptr Word32
-- lpFileSystemNameBuffer : LPWSTR optional, out -> CWString
-- nFileSystemNameSize : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let getvolumeinformationw =
  foreign "GetVolumeInformationW"
    ((ptr uint16_t) @-> (ptr uint16_t) @-> uint32_t @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr uint16_t) @-> uint32_t @-> returning int32_t)
(* lpRootPathName : LPCWSTR optional -> (ptr uint16_t) *)
(* lpVolumeNameBuffer : LPWSTR optional, out -> (ptr uint16_t) *)
(* nVolumeNameSize : DWORD -> uint32_t *)
(* lpVolumeSerialNumber : DWORD* optional, out -> (ptr uint32_t) *)
(* lpMaximumComponentLength : DWORD* optional, out -> (ptr uint32_t) *)
(* lpFileSystemFlags : DWORD* optional, out -> (ptr uint32_t) *)
(* lpFileSystemNameBuffer : LPWSTR optional, out -> (ptr uint16_t) *)
(* nFileSystemNameSize : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("GetVolumeInformationW" get-volume-information-w :convention :stdcall) :int32
  (lp-root-path-name (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lp-volume-name-buffer :pointer)   ; LPWSTR optional, out
  (n-volume-name-size :uint32)   ; DWORD
  (lp-volume-serial-number :pointer)   ; DWORD* optional, out
  (lp-maximum-component-length :pointer)   ; DWORD* optional, out
  (lp-file-system-flags :pointer)   ; DWORD* optional, out
  (lp-file-system-name-buffer :pointer)   ; LPWSTR optional, out
  (n-file-system-name-size :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetVolumeInformationW = Win32::API::More->new('KERNEL32',
    'BOOL GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPVOID lpVolumeSerialNumber, LPVOID lpMaximumComponentLength, LPVOID lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize)');
# my $ret = $GetVolumeInformationW->Call($lpRootPathName, $lpVolumeNameBuffer, $nVolumeNameSize, $lpVolumeSerialNumber, $lpMaximumComponentLength, $lpFileSystemFlags, $lpFileSystemNameBuffer, $nFileSystemNameSize);
# lpRootPathName : LPCWSTR optional -> LPCWSTR
# lpVolumeNameBuffer : LPWSTR optional, out -> LPWSTR
# nVolumeNameSize : DWORD -> DWORD
# lpVolumeSerialNumber : DWORD* optional, out -> LPVOID
# lpMaximumComponentLength : DWORD* optional, out -> LPVOID
# lpFileSystemFlags : DWORD* optional, out -> LPVOID
# lpFileSystemNameBuffer : LPWSTR optional, out -> LPWSTR
# nFileSystemNameSize : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い