| 274 | } |
| 275 | |
| 276 | CString 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); |
nothing calls this directly
no test coverage detected