Skip to content

x/sys: Incorrect results in VirtualBox #49496

Description

@mixmind

What version of Go are you using (go version)?

$ go version
go version go1.16.9 linux/amd64

Does this issue reproduce with the latest release?

Didn't checked

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
 GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/dba/.cache/go-build"
GOENV="/home/dba/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/dba/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/dba/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16.9"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/mnt/projects/test/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2403385863=/tmp/go-build -gno-record-gcc-switches"

What did you do?

I'm tryint to figure out why IO count not working on virtual machine like VirtualBox or VMWare. On Dedicated Windows server it works as expected.

Code example
// +build windows

package main

import (
"fmt"
"syscall"
"unsafe"

"golang.org/x/sys/windows"

)

type diskPerformance struct {
BytesRead int64
BytesWritten int64
ReadTime int64
WriteTime int64
IdleTime int64
ReadCount uint32
WriteCount uint32
QueueDepth uint32
SplitCount uint32
QueryTime int64
StorageDeviceNumber uint32
StorageManagerName [8]uint16
alignmentPadding uint32 // necessary for 32bit support, see elastic/beats#16553
}

func main() {
maps()
}
func maps() {
var diskPerformance diskPerformance
lpBuffer := make([]uint16, 254)
lpBufferLen, err := windows.GetLogicalDriveStrings(uint32(len(lpBuffer)), &lpBuffer[0])
if err != nil {
fmt.Println("1", err)
return
}
for _, v := range lpBuffer[:lpBufferLen] {
if 'A' <= v && v <= 'Z' {
path := string(rune(v)) + ":"
typepath, _ := windows.UTF16PtrFromString(path)
typeret := windows.GetDriveType(typepath)
if typeret == 0 {
fmt.Println("2", windows.GetLastError())
return
}
if typeret != windows.DRIVE_FIXED {
continue
}
szDevice := fmt.Sprintf(\\.\%s, path)
const IOCTL_DISK_PERFORMANCE = 0x70020
h, err := windows.CreateFile(syscall.StringToUTF16Ptr(szDevice), 0, windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE, nil, windows.OPEN_EXISTING, 0, 0)
if err != nil {
fmt.Println("3", err)
if err == windows.ERROR_FILE_NOT_FOUND {
continue
}
return
}
defer windows.CloseHandle(h)
var diskPerformanceSize uint32
err = windows.DeviceIoControl(h, IOCTL_DISK_PERFORMANCE, nil, 0, (*byte)(unsafe.Pointer(&diskPerformance)), uint32(unsafe.Sizeof(diskPerformance)), &diskPerformanceSize, nil)
if err != nil {
fmt.Println("4", err)
return
}
fmt.Println(diskPerformanceSize)
}
}
return
}

What did you expect to see?

Execution without errors

What did you see instead?

Error in windows.DeviceIoControl

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions