Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

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

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

06.01.2017, 19:09. Просмотров 292. Ответов 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 )
Буду очень благодарен!
0
Миниатюры
Бинарное значение ключа реестра (массив байтов)   Бинарное значение ключа реестра (массив байтов)  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2017, 19:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Бинарное значение ключа реестра (массив байтов) (C++ WinAPI):

Вывести значение ключа реестра - C++ WinAPI
Необходимо вывести значение: SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName Должно выводиться: Windows 8 Pro with Media Center...

Получить значение ключа из реестра в Win_64 - C++ WinAPI
Добрый вечер Есть фрагмент кода, который получает из реестра значение пути к рабочему столу. Код компилитится под Win7х86 и...

Чтение ключа из реестра - C++ WinAPI
Здравствуйте. Читает только лишь первый символ ключа из реестра. HKEY rKey; unsigned char Reget; DWORD RegetPath =...

Переопределение значения ключа реестра - хук - C++ WinAPI
Подскажите какая функция в WinAPI отвечает за отображение ключей и их значений в реестре. Можно ли переопределить стандартное поведение, к...

Функция для получения корневого ключа реестра по строке - C++ WinAPI
Здравствуйте! Существуют ли функция для получения указателя на корневой ключ реестра по строке, типа ExpandEnvironmentStrings, только...

Проверка не только наличие ключа реестра но и его значения - C++ WinAPI
#include&lt;windows.h&gt; using namespace std; int main() { WCHAR autorun = L&quot;&quot;C:\\Test\\MainProg.exe&quot;&quot;; HKEY...

8
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.01.2017, 19:46  [ТС] #2
UserAssist*

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

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

util.h
https://gist.github.com/VladEvka/7a110fc7e7daf213f549b981443116b6

util.cpp
https://gist.github.com/VladEvka/3fa7ecfd8907ac626087638f4492be1d

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

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

Добавлено через 2 минуты
Kant, а сделать вместе, я не против, буду рад помочь и получить хорошие советы и опыт
0
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 236
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 можно сделать.
0
07.01.2017, 00:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 00:19
Привет! Вот еще темы с ответами:

Считать с реестра пары параметр-значение - C++ WinAPI
Есть определенный путь например HKEY_CLASSES_ROOT\Installer\Products, как считать все пары параметр-значение со всех ключей которые...

Бинарное значение реестра - C#
В процессе написания программы возникла потребность в создании бинарного значения реестра. Предположим мне нужно в писать в ххх значение...

Вывести значение ключа реестра на экран. - Visual C++
ключ REG_DWORD ~MHz HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ чточто пыталься зделать, но не получается ...

Вывести значение ключа реестра в Label - Delphi
Здравствуйте. У меня к Вам такой вопрос, как вывести значение ключа реестра в Label ?!


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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