getRegistryValue method

  1. @visibleForTesting
dynamic getRegistryValue(
  1. int key,
  2. String subKey,
  3. String valueName,
  4. dynamic fallbackValue,
)

Implementation

@visibleForTesting
dynamic getRegistryValue(
  int key,
  String subKey,
  String valueName,
  dynamic fallbackValue,
) {
  dynamic dataValue;
  final subKeyPtr = TEXT(subKey);
  final valueNamePtr = TEXT(valueName);
  final openKeyPtr = calloc<HANDLE>();
  final dataType = calloc<DWORD>();
  final data = calloc<BYTE>(256);
  final dataSize = calloc<DWORD>()..value = 512;
  var result = RegOpenKeyEx(key, subKeyPtr, 0, KEY_READ, openKeyPtr);
  void freeAllocations() {
    free(subKeyPtr);
    free(valueNamePtr);
    free(openKeyPtr);
    free(data);
    free(dataSize);
    RegCloseKey(openKeyPtr.value);
  }

  if (result == ERROR_SUCCESS) {
    result = RegQueryValueEx(
        openKeyPtr.value, valueNamePtr, nullptr, dataType, data, dataSize);
    if (result == ERROR_SUCCESS) {
      if (dataType.value == REG_DWORD) {
        dataValue = data.cast<DWORD>().value;
      } else if (dataType.value == REG_QWORD) {
        dataValue = data.cast<QWORD>().value;
      } else if (dataType.value == REG_SZ) {
        dataValue = data.cast<Utf16>().toDartString();
      } else if (dataType.value == REG_BINARY) {
        final values = <int>[];
        for (int i = 0; i < 256; i++) {
          values.add(data.cast<Uint8>().elementAt(i).value);
        }
        dataValue = Uint8List.fromList(values);
      } else {
        throw WindowsException(HRESULT_FROM_WIN32(ERROR_INVALID_DATA));
      }
      freeAllocations();
      return dataValue;
    } else {
      freeAllocations();
      return fallbackValue;
    }
  } else {
    freeAllocations();
    return fallbackValue;
  }
}