LONG WINAPI Mine_RegEnumValueW(HKEY a0, DWORD a1, LPWSTR a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPBYTE a6, LPDWORD a7) { if (CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) { return ERROR_NO_MORE_ITEMS; } return Real_RegEnumValueW(a0, a1, a2, a3, a4, a5, a6, a7); }
LSTATUS APIENTRY RegTree::RegEnumValueW(HKEY hKey, DWORD dwIndex, LPWSTR lpValueName, LPDWORD lpcchValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData) { RegPath path; if (IsVirtualKey(hKey)) { RegNode *node = (RegNode*)((int)hKey & ~0x40000000); if (dwIndex == 0) LoadRealChildren(node); if (dwIndex < node->m_values.size()) { RegValue *value = node->m_values[dwIndex]; if (lpValueName != NULL) wcscpy_s(lpValueName, *lpcchValueName, value->m_name.c_str()); if (lpcchValueName != NULL) *lpcchValueName = value->m_name.length(); if (lpType != NULL) *lpType = value->m_dataType; if (lpData != NULL) memcpy_s(lpData, *lpcbData, value->m_data.c_str(), value->m_data.size()); if (lpcbData != NULL) *lpcbData = value->m_data.size(); return ERROR_SUCCESS; } else return ERROR_NO_MORE_ITEMS; } else return Real_RegEnumValueW(hKey, dwIndex, lpValueName, lpcchValueName, lpReserved, lpType, lpData, lpcbData); }
void RegTree::LoadRealChildren( RegNode *node ) { if (node->m_realKey != NULL) { ClearRealChildren(node); for (DWORD index = 0; ; index++) { WCHAR keyName[MAX_KEY_LENGTH + 1]; DWORD keyNameLen = _countof(keyName); WCHAR className[MAX_PATH + 1]; DWORD classNameLen = _countof(className); if (Real_RegEnumKeyExW(node->m_realKey, index, keyName, &keyNameLen, NULL, className, &classNameLen, NULL) != ERROR_SUCCESS) break; HKEY newKey; if (Real_RegOpenKeyExW(node->m_realKey, keyName, 0, KEY_ALL_ACCESS, &newKey) != ERROR_SUCCESS) continue; typedef RegNodeList::index<RegNodeIndex::Name>::type Index; Index &childIndex = node->m_children.get<RegNodeIndex::Name>(); Index::iterator iter = childIndex.find(to_lower_copy(wstring(keyName))); if (iter != childIndex.end()) continue; auto_ptr<RegNode> newNode = RegNode::CreateReal(node->m_rootKey, keyName, newKey); newNode->m_parent = node; node->m_children.push_back(newNode.release()); } BYTE *data = (BYTE*)malloc(1000000); for (DWORD index = 0; ; index++) { WCHAR valueName[MAX_VALUE_NAME_LENGTH + 1]; DWORD valueNameLen = _countof(valueName); DWORD dataType = 0; DWORD dataSize =1000000; if (Real_RegEnumValueW(node->m_realKey, index, valueName, &valueNameLen, NULL, &dataType, data, &dataSize) != ERROR_SUCCESS) break; auto_ptr<RegValue> newValue = RegValue::Create(RegValueType_Real, valueName, dataType, data, dataSize); node->m_values.push_back(newValue.release()); } free(data); } }