| 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 GetDriveLetters() ([]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
 
- }
 
 
  |