golang,调用WinVolumeInformation winapi函数

golang,调用WinVolumeInformation winapi函数,第1张

golang,调用WinVolumeInformation winapi函数

包裹不安全

不安全的软件包包含绕过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))}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5012995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存