| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // 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
- }
|