getRegistryValue method
dynamic
getRegistryValue()
Helper function derived from https://github.com/timsneath/win32/blob/main/example/sysinfo.dart.
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;
}
}