// +build windows package gopsutil import ( "github.com/mitchellh/go-ps" "os" "syscall" "unsafe" ) var ( procGetSystemTimeAsFileTime = modKernel32.NewProc("GetSystemTimeAsFileTime") procGetTickCount = modKernel32.NewProc("GetTickCount") ) func HostInfo() (HostInfoStat, error) { ret := HostInfoStat{} hostname, err := os.Hostname() if err != nil { return ret, err } ret.Hostname = hostname kernel32, err := syscall.LoadLibrary("kernel32.dll") if err != nil { return ret, err } defer syscall.FreeLibrary(kernel32) GetTickCount, _ := syscall.GetProcAddress(kernel32, "GetTickCount") uptimemsec, _, err := syscall.Syscall(uintptr(GetTickCount), 0, 0, 0, 0) ret.Uptime = int64(uptimemsec) / 1000 procs, err := ps.Processes() if err != nil { return ret, err } ret.Procs = uint64(len(procs)) return ret, nil } func Boot_time() (int64, error) { var lpSystemTimeAsFileTime FILETIME r, _, _ := procGetSystemTimeAsFileTime.Call(uintptr(unsafe.Pointer(&lpSystemTimeAsFileTime))) if r == 0 { return 0, syscall.GetLastError() } // TODO: This calc is wrong. ll := (uint32(lpSystemTimeAsFileTime.DwHighDateTime))<<32 + lpSystemTimeAsFileTime.DwLowDateTime pt := (uint64(ll) - 116444736000000000) / 10000000 u, _, _ := procGetTickCount.Call() if u == 0 { return 0, syscall.GetLastError() } uptime := uint64(u) / 1000 return int64(pt - uptime), nil } func Users() ([]UserStat, error) { ret := make([]UserStat, 0) return ret, nil }