Example #1
0
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);
}
Example #2
0
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);
	}
}
Example #3
0
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);
}