Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
#1

Бинарное значение ключа реестра (массив байтов) - C++ WinAPI

06.01.2017, 19:09. Просмотров 263. Ответов 8

Всем привет!
Нужна ваша помощь
Есть такая ветвь реестра = HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UserAssist;(скрин 1)
и такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
 
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383
 
using namespace std;
 
void QueryKey(HKEY hKey)
{
    TCHAR    achKey[MAX_KEY_LENGTH];    // buffer for subkey name
    DWORD    cbName;                    // size of name string 
    TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
    DWORD    cchClassName = MAX_PATH;  // size of class string 
    DWORD    cSubKeys = 0;               // number of subkeys 
    DWORD    cbMaxSubKey;              // longest subkey size 
    DWORD    cchMaxClass;              // longest class string 
    DWORD    cValues;              // number of values for key 
    DWORD    cchMaxValue;          // longest value name 
    DWORD    cbMaxValueData;       // longest value data 
    DWORD    cbSecurityDescriptor; // size of security descriptor 
    FILETIME ftLastWriteTime;      // last write time 
 
    DWORD i, retCode, retCode2;
 
    TCHAR  achValue[MAX_VALUE_NAME];
    DWORD cchValue = MAX_VALUE_NAME;
    
    // Get the class name and the value count.
    retCode = RegQueryInfoKey(
        hKey,                   // key handle
        achClass,               // buffer for class name
        &cchClassName,          // size of class string 
        NULL,                   // reserved 
        &cSubKeys,              // number of subkeys 
        &cbMaxSubKey,           // longest subkey size
        &cchMaxClass,           // longest class string 
        &cValues,               // number of values for this key
        &cchMaxValue,           // longest value name 
        &cbMaxValueData,        // longest value data 
        &cbSecurityDescriptor,  // security descriptor
        &ftLastWriteTime        // last write time
    );
 
    // Enumerate the subkeys, until RegEnumKeyEx fails.
 
    if (cSubKeys)
    {
        cout << "\nNumbers of subkeys" << cSubKeys << endl;
 
        for (i = 0; i < cSubKeys; i++)
        {
            cbName = MAX_KEY_LENGTH;
            retCode = RegEnumKeyEx(
                hKey,
                i,
                achKey,
                &cbName,
                NULL,
                NULL,
                NULL,
                &ftLastWriteTime);
 
            if (retCode == ERROR_SUCCESS)
            {
                _tprintf(TEXT("(%d) %s\n"), i + 1, achKey);
            }
        }
    }
 
    // Enumerate the key values.
    
    if (cValues)
    {
        printf("\nNumber of value: %d\n", cValues);
        
 
 
        for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++)
        {
            cchValue = MAX_VALUE_NAME;
            achValue[0] = '\0';
            retCode = RegEnumValue(
                hKey,
                i,
                achValue,
                &cchValue,
                NULL,
                NULL,
                NULL,
                NULL);
 
            if (retCode == ERROR_SUCCESS)
            {
                _tprintf(TEXT("(%d) %s\n"), i + 1, achValue);
            }
        }
    }
}
 
int main()
{
    HKEY hKey;
    
    if (RegOpenKeyEx(HKEY_CURRENT_USER,
        _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count"),
        NULL, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        cout << "Open - success" << endl;
        QueryKey(hKey);
    }
 
    RegCloseKey(hKey);
 
    system("pause");
    return 0;
}
я попытался передавать параметром в RegEnumValue, BYTE Array и размер, но тогда эта функция возвращает - ERROR_OUTOFMEMORY и ничего не происходит.
И вот народ объясните мне пожалуйста, как вытащить эти байты (с скрина 2) или возможно можете привести пример?
(вот сайт со всеми данными о Усерассист и примерами, но у меня пока не получается этого сделать
https://www.aldeid.com/wiki/Windows-userassist-keys )
Буду очень благодарен!
Миниатюры
Бинарное значение ключа реестра (массив байтов)   Бинарное значение ключа реестра (массив байтов)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2017, 19:09     Бинарное значение ключа реестра (массив байтов)
Посмотрите здесь:
C++ WinAPI Вывести значение ключа реестра
Получить значение ключа из реестра в Win_64 C++ WinAPI
C++ WinAPI Чтение ключа из реестра
C++ WinAPI Переопределение значения ключа реестра - хук
C++ WinAPI Функция для получения корневого ключа реестра по строке
C++ WinAPI Проверка не только наличие ключа реестра но и его значения
C++ WinAPI Считать с реестра пары параметр-значение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.01.2017, 19:46  [ТС]     Бинарное значение ключа реестра (массив байтов) #2
UserAssist*

Добавлено через 8 минут
уточнение: нужно вывести ключ в массив байтов

Добавлено через 15 минут
или даже пару пары параметр-значение
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 233
06.01.2017, 20:04     Бинарное значение ключа реестра (массив байтов) #3
svadum, привет. Сейчас делаю похожее задание.
Запись всего реестра в память и поиск по значению / содержанию Key Value.

util.h
https://gist.github.com/VladEvka/7a1...49b981443116b6

util.cpp
https://gist.github.com/VladEvka/3fa...87638f4492be1d

Добавлено через 7 минут
Чуть позже смогу ответить полностью. Но думаю к тому времени вы разберетесь.
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.01.2017, 20:13  [ТС]     Бинарное значение ключа реестра (массив байтов) #4
Спасибо за ответ и клас. Буду ждать и разбираться)
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 233
06.01.2017, 21:13     Бинарное значение ключа реестра (массив байтов) #5
Все, я под Виндой. Посмотрел твой профиль) Понял, что ты действительно хочешь. Ты хочешь получить список
самых популярных программ, тех что щелкаешь по клавише Win.
Интересная задача!

Изучаю исходники UserAssist, это по ссылке которую тебе дал rao.
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.01.2017, 21:19  [ТС]     Бинарное значение ключа реестра (массив байтов) #6
Kant,
кстати ужe получилось вытащить массив байтов, только надо сделать структуру или использовать STL шаблон map по key и value.

Добавлено через 58 секунд
Kant, https://www.aldeid.com/wiki/Windows-userassist-keys посмотри здесь!ето просто сокровище

Добавлено через 3 минуты
Kant, да, я сначала думал вытянуть сам топ, но понял по ходу, что так не получится и нужно через UserAssist брать список использованных программ, количество запусков и времени в фокусе и на основе этих данных формировать свой топ)
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 233
06.01.2017, 21:28     Бинарное значение ключа реестра (массив байтов) #7
Похоже за вечер не разобраться. Но задача интересная и иметь под рукой волшебную функцию со списком популярных программ будет не лишним
Давай вместе сделаем? Я создаю репу на гитхабе.
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.01.2017, 21:43  [ТС]     Бинарное значение ключа реестра (массив байтов) #8
Kant, ну в общем у меня задача: реализовать форму в Qt, которая будет отслеживать использование программ и выводится топ 10 из них, форму и логику за пару минут сделал, это не проблема, а вот с этим реестром увяз на пару дней, сейчас уже есть результат , пока делаю в VS так как удобнее здесь тестировать, а затем придется реализовать под Qt и запихнуть в форму

Добавлено через 2 минуты
Kant, а сделать вместе, я не против, буду рад помочь и получить хорошие советы и опыт
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 00:19     Бинарное значение ключа реестра (массив байтов)
Еще ссылки по теме:
C++ WinAPI Варианты сжатия последовательности байтов с помощью винапи
Шифрование сессионного ключа C++ WinAPI
Создание ключа в HKLM C++ WinAPI
Чтение из реестра C++ WinAPI
C++ WinAPI Редактор реестра

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 233
07.01.2017, 00:19     Бинарное значение ключа реестра (массив байтов) #9
svadum, сделал вывод Key Value в консоль по path

C++
1
2
3
    std::string pathUserAssist = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist";
    std::string GUIDWindows7 = "{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}";
    std::string fullPathUserAssist = pathUserAssist + "" + GUIDWindows7 + "\\Count";
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <algorithm>
#include <bitset>
#include <sstream>
#include <iostream>
#include <iterator>
 
#include <cstdlib>
#include <cctype>
 
#include "util.h"
#include "base64.h"
 
std::string rot13(std::string text) {
    std::transform(
        begin(text), end(text), begin(text),
        [](char c) -> char {
        if (!std::isalpha(c))
            return c;
        char const pivot = std::isupper(c) ? 'A' : 'a';
        return (c - pivot + 13) % 26 + pivot;
    });
    return text;
}
 
LONG print_log(const std::string& descrptionError, const std::string &hKeyPath, LONG error)
{
    std::cerr << descrptionError << "\n";
    std::cerr << "HKEY by path:\n" << hKeyPath << "\n";
    std::cerr << "error = " << error << std::endl;
    return error;
}
 
 
LONG GetUserAssistKeyValues(std::vector<mfu::KeyValue> &values)
{
    HKEY hUserAssistKey;
    HKEY hRootKey = HKEY_CURRENT_USER;
    std::string pathUserAssist = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist";
    std::string GUIDWindows7 = "{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}";
    std::string fullPathUserAssist = pathUserAssist + "" + GUIDWindows7 + "\\Count";
 
    LONG errorOpenKey = RegOpenKeyExA(hRootKey, fullPathUserAssist.c_str(), 0, KEY_READ, &hUserAssistKey);
    if (ERROR_SUCCESS == errorOpenKey) {
        DWORD countSubKey = 0;
        DWORD countValues = 0;
 
        LONG errorQueryInfo = mfu::QueryInfoKey(hUserAssistKey, &countSubKey, &countValues);
        if (ERROR_SUCCESS == errorQueryInfo) {
            for (DWORD i = 0; i < countValues; ++i) {
                std::string valueName;
                LONG errorValue = mfu::EnumValue(hUserAssistKey, i, valueName);
                if (ERROR_SUCCESS == errorValue) {
                    mfu::KeyValue value;
                    LONG errorValueData = mfu::ValueData(hUserAssistKey, valueName, value);
                    if (ERROR_SUCCESS == errorValueData) {
                        values.push_back(value);
                    }
                    else { return print_log("Error ValueData.", fullPathUserAssist, errorValueData); }
                }
 
                else { return print_log("Error EnumValue.", fullPathUserAssist, errorValue); }
            }
        }
        else { return print_log("Error QueryInfoKey.", fullPathUserAssist, errorQueryInfo); }
 
        RegCloseKey(hRootKey);
 
        return errorOpenKey;
    }
    else { return   print_log("Can't open Key.", fullPathUserAssist, errorOpenKey); }
}
 
 
std::ostream &operator<<(std::ostream &out, const mfu::KeyValue &value) {
    auto type = value.type;
    std::string strType;
    switch (type) {
    case RRF_RT_REG_SZ:
        strType = "RRF_RT_REG_SZ";
        break;
 
    case RRF_RT_REG_BINARY:
        strType = "RRF_RT_REG_BINARY";
        break;
 
    default:
        strType = std::to_string(int(type));
        break;
    }
 
    out << "name: " << rot13({ value.name.begin(), value.name.end() }) << "\n";
    out << "type: " << strType << "\n";
    out << "data:\n" << base64_encode(value.data.data(), value.data.size()) << "\n";
 
    out << std::endl;
 
    return out;
}
 
 
int main()
{
    try
    {
        std::cout << "Most Frequent Used Programs for Windows 7" << std::endl;
 
        std::vector<mfu::KeyValue> values;
        LONG errorGUAKV = GetUserAssistKeyValues(values);
        if (ERROR_SUCCESS == errorGUAKV) {
            for (auto value : values) {
                std::cout << value << "\n";
            }
        }
 
        return errorGUAKV;
    }
    catch (std::exception &e)
    {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
}
Понятия не имею почему, но цветовая схема поплыла. Кто знает, как поправить - отпишите.

Остальной код на github.

Добавлено через 10 минут
Там еще много работы, но уже примерно ясно что к чему. Думаю, за пару дней для Windows 7 можно сделать.
Yandex
Объявления
07.01.2017, 00:19     Бинарное значение ключа реестра (массив байтов)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru