MCPcopy Create free account
hub / github.com/BeneficialCode/WinArk / GetDataAsString

Method GetDataAsString

WinArk/Registry.cpp:276–345  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

274}
275
276CString Registry::GetDataAsString(RegistryKey& key, const RegistryItem& item) {
277 auto realsize = item.Size;
278 ULONG size = std::min<ULONG>(realsize, 512UL) / sizeof(WCHAR);
279 LSTATUS status;
280 CString text;
281 DWORD type;
282
283 switch (item.Type)
284 {
285 case REG_SZ:
286 case REG_EXPAND_SZ:
287 text = QueryStringValue(key, item.Name).Left(size);
288 break;
289
290 case REG_LINK:
291
292 break;
293
294 case REG_MULTI_SZ:
295 size *= 2;
296 status = ::RegQueryValueEx(key.Get(), item.Name, nullptr, &type, (PBYTE)text.GetBufferSetLength(size / 2), &size);
297 if (status == ERROR_SUCCESS) {
298 auto p = text.GetBuffer();
299 while (*p) {
300 p += ::wcslen(p);
301 *p = L' ';
302 p++;
303 }
304 }
305 break;
306
307 case REG_DWORD:
308 {
309 DWORD value;
310 if (ERROR_SUCCESS == key.QueryDWORDValue(item.Name, value)) {
311 text.Format(L"0x%08X (%u)", value, value);
312 }
313 break;
314 }
315
316 case REG_QWORD:
317 {
318 ULONGLONG value;
319 if (ERROR_SUCCESS == key.QueryQWORDValue(item.Name, value)) {
320 auto fmt = value < (1LL << 32) ? L"0x%08llX (%llu)" : L"0x%016llX (%llu)";
321 text.Format(fmt, value, value);
322 }
323 break;
324 }
325
326 case REG_BINARY:
327 CString digit;
328 auto buffer = std::make_unique<BYTE[]>(item.Size);
329 if (buffer == nullptr)
330 break;
331
332 ULONG bytes = item.Size;
333 auto status = key.QueryBinaryValue(item.Name, buffer.get(), &bytes);

Callers

nothing calls this directly

Calls 5

QueryQWORDValueMethod · 0.80
QueryBinaryValueMethod · 0.80
GetMethod · 0.45
QueryDWORDValueMethod · 0.45
GetLengthMethod · 0.45

Tested by

no test coverage detected