github.com/MetalBlockchain/metalgo@v1.11.9/utils/storage/storage_windows.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  //go:build windows
     5  // +build windows
     6  
     7  package storage
     8  
     9  import (
    10  	"errors"
    11  	"syscall"
    12  	"unsafe"
    13  )
    14  
    15  const (
    16  	KERNEL32DLL         = "kernel32.dll"
    17  	GETDISKFREESPACEEXW = "GetDiskFreeSpaceExW"
    18  )
    19  
    20  var errNonzeroErrorCode = errors.New("nonzero return from win32 call for disk space")
    21  
    22  func AvailableBytes(path string) (uint64, error) {
    23  	h, err := syscall.LoadDLL(KERNEL32DLL)
    24  	if err != nil {
    25  		return 0, err
    26  	}
    27  	c, err := h.FindProc(GETDISKFREESPACEEXW)
    28  	if err != nil {
    29  		return 0, err
    30  	}
    31  	var (
    32  		lpFreeBytesAvailable     int64
    33  		lpTotalNumberOfBytes     int64
    34  		lpTotalNumberOfFreeBytes int64
    35  	)
    36  	u16p, err := syscall.UTF16PtrFromString(path)
    37  	if err != nil {
    38  		return 0, err
    39  	}
    40  	_, _, status := c.Call(uintptr(unsafe.Pointer(u16p)),
    41  		uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
    42  		uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
    43  		uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)))
    44  	if status != syscall.Errno(0) {
    45  		return 0, errNonzeroErrorCode
    46  	}
    47  	return uint64(lpFreeBytesAvailable), nil
    48  }