54 lines
1 KiB
Go
54 lines
1 KiB
Go
|
package types
|
||
|
|
||
|
import (
|
||
|
"path/filepath"
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
func GetFSType(path string) (string, error) {
|
||
|
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
defer syscall.FreeLibrary(kernel32)
|
||
|
|
||
|
getVolumeInformation, err := syscall.GetProcAddress(kernel32, "GetVolumeInformationW")
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
// Convert relative path to absolute path
|
||
|
absPath, err := filepath.Abs(path)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
// Get the root path of the volume
|
||
|
volumeRoot := filepath.VolumeName(absPath) + "\\"
|
||
|
|
||
|
volumeRootPtr, _ := syscall.UTF16PtrFromString(volumeRoot)
|
||
|
|
||
|
var (
|
||
|
fileSystemNameBuffer = make([]uint16, 260)
|
||
|
nFileSystemNameSize = uint32(len(fileSystemNameBuffer))
|
||
|
)
|
||
|
|
||
|
ret, _, err := syscall.SyscallN(getVolumeInformation,
|
||
|
uintptr(unsafe.Pointer(volumeRootPtr)),
|
||
|
0,
|
||
|
0,
|
||
|
0,
|
||
|
0,
|
||
|
0,
|
||
|
uintptr(unsafe.Pointer(&fileSystemNameBuffer[0])),
|
||
|
uintptr(nFileSystemNameSize),
|
||
|
0)
|
||
|
|
||
|
if ret == 0 {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return syscall.UTF16ToString(fileSystemNameBuffer), nil
|
||
|
}
|