包裹不安全
不安全的软件包包含绕过Go程序的类型安全的 *** 作。
类型指针
type Pointer *ArbitraryType指针表示指向任意类型的指针。指针类型有四个特殊 *** 作,而其他类型则不可用。
1)任何类型的指针值都可以转换为Pointer。
2)指针可以转换为任何类型的指针值。
3)可以将uintptr转换为Pointer。
4)指针可以转换为uintptr。
因此,指针允许程序击败类型系统并读写任意存储器。使用时应格外小心。
您没有注意
unsafe.Pointer“应格外小心” 的警告。
试试这个:
package mainimport ( "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))}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)