github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkbfs/disk_limits_windows.go (about) 1 // Copyright 2017 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package libkbfs 6 7 import ( 8 "math" 9 "unsafe" 10 11 "github.com/pkg/errors" 12 "golang.org/x/sys/windows" 13 ) 14 15 // getDiskLimits gets the disk limits for the logical disk containing 16 // the given path. 17 func getDiskLimits(path string) ( 18 availableBytes, totalBytes, availableFiles, totalFiles uint64, err error) { 19 pathPtr, err := windows.UTF16PtrFromString(path) 20 if err != nil { 21 return 0, 0, 0, 0, errors.WithStack(err) 22 } 23 24 dll := windows.NewLazySystemDLL("kernel32.dll") 25 proc := dll.NewProc("GetDiskFreeSpaceExW") 26 r1, _, err := proc.Call(uintptr(unsafe.Pointer(pathPtr)), 27 uintptr(unsafe.Pointer(&availableBytes)), 28 uintptr(unsafe.Pointer(&totalBytes)), 0) 29 // err is always non-nil, but meaningful only when r1 == 0 30 // (which signifies function failure). 31 if r1 == 0 { 32 return 0, 0, 0, 0, errors.WithStack(err) 33 } 34 35 // TODO: According to http://superuser.com/a/104224 , on 36 // Windows, the available file limit is determined just from 37 // the filesystem type. Detect the filesystem type and use 38 // that to determine and return availableFiles. 39 40 // For now, assume all FSs on Windows are NTFS, or have 41 // similarly large file limits. 42 return availableBytes, totalBytes, math.MaxInt64, math.MaxInt64, nil 43 }