func GetSymbolicLink(symlinkPath string) (*SymbolicLinkData, error) { file, err := wrappers.CreateFile( syscall.StringToUTF16Ptr(symlinkPath), wrappers.FILE_READ_EA, wrappers.FILE_SHARE_READ|wrappers.FILE_SHARE_WRITE|wrappers.FILE_SHARE_DELETE, nil, wrappers.OPEN_EXISTING, wrappers.FILE_FLAG_OPEN_REPARSE_POINT|wrappers.FILE_FLAG_BACKUP_SEMANTICS, 0) if err != nil { return nil, NewWindowsError("CreateFile", err) } defer wrappers.CloseHandle(file) buf := make([]byte, wrappers.MAXIMUM_REPARSE_DATA_BUFFER_SIZE) var bytesReturned uint32 err = wrappers.DeviceIoControl( file, wrappers.FSCTL_GET_REPARSE_POINT, nil, 0, &buf[0], wrappers.MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &bytesReturned, nil) if err != nil { return nil, NewWindowsError("DeviceIoControl", err) } data := (*wrappers.REPARSE_DATA_BUFFER)(unsafe.Pointer(&buf[0])) if data.ReparseTag != wrappers.IO_REPARSE_TAG_SYMLINK { return nil, nil } substituteNameBuf := make([]uint16, data.SubstituteNameLength/2) printNameBuf := make([]uint16, data.PrintNameLength/2) wrappers.RtlMoveMemory( (*byte)(unsafe.Pointer(&substituteNameBuf[0])), &buf[unsafe.Sizeof(*data)+uintptr(data.SubstituteNameOffset)], uintptr(data.SubstituteNameLength)) wrappers.RtlMoveMemory( (*byte)(unsafe.Pointer(&printNameBuf[0])), &buf[unsafe.Sizeof(*data)+uintptr(data.PrintNameOffset)], uintptr(data.PrintNameLength)) return &SymbolicLinkData{ SubstituteName: syscall.UTF16ToString(substituteNameBuf), PrintName: syscall.UTF16ToString(printNameBuf), Relative: (data.Flags & wrappers.SYMLINK_FLAG_RELATIVE) != 0, }, nil }
func GetDiskPerformanceInfo(rootPathName string) (*DiskPerformanceInfo, error) { hFile, err := wrappers.CreateFile( syscall.StringToUTF16Ptr(rootPathName), 0, wrappers.FILE_SHARE_READ|wrappers.FILE_SHARE_WRITE, nil, wrappers.OPEN_EXISTING, 0, 0) if err != nil { return nil, NewWindowsError("CreateFile", err) } defer wrappers.CloseHandle(hFile) var diskPerformance wrappers.DISK_PERFORMANCE var diskPerformanceSize uint32 err = wrappers.DeviceIoControl( hFile, wrappers.IOCTL_DISK_PERFORMANCE, nil, 0, (*byte)(unsafe.Pointer(&diskPerformance)), uint32(unsafe.Sizeof(diskPerformance)), &diskPerformanceSize, nil) if err != nil { return nil, NewWindowsError("DeviceIoControl", err) } return &DiskPerformanceInfo{ BytesRead: diskPerformance.BytesRead, BytesWritten: diskPerformance.BytesWritten, ReadTime: diskPerformance.ReadTime, WriteTime: diskPerformance.WriteTime, IdleTime: diskPerformance.IdleTime, ReadCount: uint(diskPerformance.ReadCount), WriteCount: uint(diskPerformance.WriteCount), QueueDepth: uint(diskPerformance.QueueDepth), SplitCount: uint(diskPerformance.SplitCount), QueryTime: diskPerformance.QueryTime, StorageDeviceNumber: uint(diskPerformance.StorageDeviceNumber), StorageManagerName: syscall.UTF16ToString(diskPerformance.StorageManagerName[:]), }, nil }