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 }