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