2 回答
TA贡献1775条经验 获得超11个赞
包 unsafe 包含绕过 Go 程序类型安全的操作。
type Pointer *ArbitraryType指针表示指向任意类型的指针。有四种特殊操作可用于类型 Pointer,其他类型不可用。
1) 任何类型的指针值都可以转换为指针。
2) 指针可以转换为任何类型的指针值。
3) uintptr 可以转换为指针。
4) 可以将指针转换为 uintptr。
因此,指针允许程序击败类型系统并读取和写入任意内存。它应该非常小心地使用。
你没有注意unsafe.Pointer
“应该非常小心地使用”的警告。
尝试这个:
package main
import (
"fmt"
"syscall"
"unsafe"
)
func main() {
var RootPathName = `C:\`
var VolumeNameBuffer = make([]uint16, syscall.MAX_PATH+1)
var nVolumeNameSize = uint32(len(VolumeNameBuffer))
var VolumeSerialNumber uint32
var MaximumComponentLength uint32
var FileSystemFlags uint32
var FileSystemNameBuffer = make([]uint16, 255)
var nFileSystemNameSize uint32 = syscall.MAX_PATH + 1
kernel32, _ := syscall.LoadLibrary("kernel32.dll")
getVolume, _ := syscall.GetProcAddress(kernel32, "GetVolumeInformationW")
var nargs uintptr = 8
ret, _, callErr := syscall.Syscall9(uintptr(getVolume),
nargs,
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(RootPathName))),
uintptr(unsafe.Pointer(&VolumeNameBuffer[0])),
uintptr(nVolumeNameSize),
uintptr(unsafe.Pointer(&VolumeSerialNumber)),
uintptr(unsafe.Pointer(&MaximumComponentLength)),
uintptr(unsafe.Pointer(&FileSystemFlags)),
uintptr(unsafe.Pointer(&FileSystemNameBuffer[0])),
uintptr(nFileSystemNameSize),
0)
fmt.Println(ret, callErr, syscall.UTF16ToString(VolumeNameBuffer))
}
TA贡献1155条经验 获得超0个赞
我不知道您遇到的确切问题,但我认为这可能是因为您没有使用https://github.com/golang/go/blob/master/src/syscall/syscall_windows.go 中与从内核产生的格式转换为 Go 需要的格式。查看 UTF16ToString 的其他调用者,例如在 env_windows.go 中,以了解它们是如何使用的。
- 2 回答
- 0 关注
- 298 浏览
添加回答
举报