windows_exporter/internal/mi/value.go
Jan-Otto Kröpke 1badb34506
chore: fix copyright headers (#1767)
Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
2024-11-24 14:11:14 +01:00

126 lines
2.9 KiB
Go

// Copyright 2024 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build windows
package mi
import (
"errors"
"fmt"
"unsafe"
"golang.org/x/sys/windows"
)
type ValueType int
const (
ValueTypeBOOLEAN ValueType = iota
ValueTypeUINT8
ValueTypeSINT8
ValueTypeUINT16
ValueTypeSINT16
ValueTypeUINT32
ValueTypeSINT32
ValueTypeUINT64
ValueTypeSINT64
ValueTypeREAL32
ValueTypeREAL64
ValueTypeCHAR16
ValueTypeDATETIME
ValueTypeSTRING
ValueTypeREFERENCE
ValueTypeINSTANCE
ValueTypeBOOLEANA
ValueTypeUINT8A
ValueTypeSINT8A
ValueTypeUINT16A
ValueTypeSINT16A
ValueTypeUINT32A
ValueTypeSINT32A
ValueTypeUINT64A
ValueTypeSINT64A
ValueTypeREAL32A
ValueTypeREAL64A
ValueTypeCHAR16A
ValueTypeDATETIMEA
ValueTypeSTRINGA
ValueTypeREFERENCEA
ValueTypeINSTANCEA
ValueTypeARRAY ValueType = 16
)
type Element struct {
value uintptr
valueType ValueType
}
func (e *Element) GetValue() (any, error) {
switch e.valueType {
case ValueTypeBOOLEAN:
return e.value == 1, nil
case ValueTypeUINT8:
return uint8(e.value), nil
case ValueTypeSINT8:
return int8(e.value), nil
case ValueTypeUINT16:
return uint16(e.value), nil
case ValueTypeSINT16:
return int16(e.value), nil
case ValueTypeUINT32:
return uint32(e.value), nil
case ValueTypeSINT32:
return int32(e.value), nil
case ValueTypeUINT64:
return uint64(e.value), nil
case ValueTypeSINT64:
return int64(e.value), nil
case ValueTypeREAL32:
return float32(e.value), nil
case ValueTypeREAL64:
return float64(e.value), nil
case ValueTypeCHAR16:
return uint16(e.value), nil
case ValueTypeDATETIME:
if e.value == 0 {
return nil, errors.New("invalid pointer: value is nil")
}
return *(*Datetime)(unsafe.Pointer(e.value)), nil
case ValueTypeSTRING:
if e.value == 0 {
return nil, errors.New("invalid pointer: value is nil")
}
// Convert the UTF-16 string to a Go string
return windows.UTF16PtrToString((*uint16)(unsafe.Pointer(e.value))), nil
case ValueTypeSTRINGA:
if e.value == 0 {
return nil, errors.New("invalid pointer: value is nil")
}
// Assuming array of pointers to UTF-16 strings
ptrArray := *(*[]*uint16)(unsafe.Pointer(e.value))
strArray := make([]string, len(ptrArray))
for i, ptr := range ptrArray {
strArray[i] = windows.UTF16PtrToString(ptr)
}
return strArray, nil
default:
return nil, fmt.Errorf("unsupported value type: %d", e.valueType)
}
}