func getSequenceNumberInternal()

in pkg/seqno/seqno_windows.go [19:64]


func getSequenceNumberInternal(name, version string) (uint, error) {
	extensionKeyName := getExtensionKeyName(name, version)
	k, err := registry.OpenKey(registry.LOCAL_MACHINE, extensionKeyName, registry.QUERY_VALUE)
	if err != nil {
		if err == registry.ErrNotExist {
			// This may happen if the extension isn't installed. Return a uniform error indicating this.
			return 0, extensionerrors.ErrNotFound
		}

		return 0, fmt.Errorf("VmExtension: Cannot open sequence registry key due to '%v'", err)
	}
	defer k.Close()

	buff := make([]byte, 32)

	_, valType, err := k.GetValue(sequenceNumberKeyName, buff)
	if err != nil {
		if err == registry.ErrNotExist {
			return 0, extensionerrors.ErrNotFound
		}
		return 0, fmt.Errorf("VmExtension: Cannot read sequence registry key due to '%v'", err)
	}
	var value uint
	switch valType {
	case registry.SZ, registry.EXPAND_SZ:
		stringVal, _, err := k.GetStringValue(sequenceNumberKeyName)
		if err != nil {
			return 0, err
		}
		val, err := strconv.ParseUint(stringVal, 10, 64)
		if err != nil {
			return 0, err
		}
		value = uint(val)
	case registry.DWORD:
		val, _, err := k.GetIntegerValue(sequenceNumberKeyName)
		if err != nil {
			return 0, err
		}
		value = uint(val)
	default:
		return 0, fmt.Errorf("value of registry key %s is of unexpected type", path.Join("HKEY_LOCAL_MACHINE", extensionKeyName, sequenceNumberKeyName))
	}

	return uint(value), nil
}