LONG WINAPI Mine_RegEnumKeyExW(HKEY a0, DWORD a1, LPWSTR a2, LPDWORD a3, LPDWORD a4, LPWSTR a5, LPDWORD a6, struct _FILETIME* a7) { if (CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) { return ERROR_NO_MORE_ITEMS; } return Real_RegEnumKeyExW(a0, a1, a2, a3, a4, a5, a6, a7); }
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); } }
LSTATUS APIENTRY RegTree::RegEnumKeyExW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, LPDWORD lpcchName, LPDWORD lpReserved, LPWSTR lpClass, LPDWORD lpcchClass, PFILETIME lpftLastWriteTime) { if (IsVirtualKey(hKey)) { RegNode *node = (RegNode*)((int)hKey & ~0x40000000); if (dwIndex == 0) LoadRealChildren(node); if (dwIndex < node->m_children.size()) { RegNode *childNode = node->m_children[dwIndex]; if (lpName != NULL) wcscpy_s(lpName, *lpcchName, childNode->m_name.c_str()); *lpcchName = childNode->m_name.length(); return ERROR_SUCCESS; } else return ERROR_NO_MORE_ITEMS; } else return Real_RegEnumKeyExW(hKey, dwIndex, lpName, lpcchName, lpReserved, lpClass, lpcchClass, lpftLastWriteTime); }