Skip to content

Instantly share code, notes, and snippets.

@jsturtevant
Created February 18, 2021 22:26
Show Gist options
  • Save jsturtevant/1d86d47fbda4b2cb89e7d2d65360c71a to your computer and use it in GitHub Desktop.
Save jsturtevant/1d86d47fbda4b2cb89e7d2d65360c71a to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"os"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
var (
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW")
)
func main() {
fmt.Printf("dir test\n")
fb, _, _, _, _, _, err := Info("C:\\Windows\\System32")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("success fb: %v\n", fb)
fmt.Printf("file test\n")
fb, _, _, _, _, _, err = Info("C:\\Windows\\System32\\sysclass.dll")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("success fb: %v\n", fb)
}
func Info(path string) (int64, int64, int64, int64, int64, int64, error) {
var freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes int64
var err error
ret, _, err := syscall.Syscall6(
procGetDiskFreeSpaceEx.Addr(),
4,
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))),
uintptr(unsafe.Pointer(&freeBytesAvailable)),
uintptr(unsafe.Pointer(&totalNumberOfBytes)),
uintptr(unsafe.Pointer(&totalNumberOfFreeBytes)),
0,
0,
)
if ret == 0 {
return 0, 0, 0, 0, 0, 0, err
}
return freeBytesAvailable, totalNumberOfBytes, totalNumberOfBytes - freeBytesAvailable, 0, 0, 0, nil
}
dir test
success fb: 182443642880
file test
The directory name is invalid.
exit status 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment