crowdsec/pkg/types/getfstype_windows.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
}