// Copyright (C) 2016 The Syncthing Authors. // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this file, // You can obtain one at http://mozilla.org/MPL/2.0/. // +build windows package osutil import ( "bytes" "fmt" "syscall" "unsafe" ) func GetFilesystemRoots() ([]string, error) { kernel32, err := syscall.LoadDLL("kernel32.dll") if err != nil { return nil, err } getLogicalDriveStringsHandle, err := kernel32.FindProc("GetLogicalDriveStringsA") if err != nil { return nil, err } buffer := [1024]byte{} bufferSize := uint32(len(buffer)) hr, _, _ := getLogicalDriveStringsHandle.Call(uintptr(unsafe.Pointer(&bufferSize)), uintptr(unsafe.Pointer(&buffer))) if hr == 0 { return nil, fmt.Errorf("Syscall failed") } var drives []string parts := bytes.Split(buffer[:], []byte{0}) for _, part := range parts { if len(part) == 0 { break } drives = append(drives, string(part)) } return drives, nil }