Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987

Как ускорить сканер памяти

02.03.2020, 22:04. Показов 1529. Ответов 2

Студворк — интернет-сервис помощи студентам
Вот код
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>
#include <algorithm>
 
int8_t GetInt8FromProcess(HANDLE hProcess, LPCVOID baseAdress)
{
    int8_t result = 0;
    size_t readed = 0;
    LPVOID preaded = &result;
    if (ReadProcessMemory(hProcess, baseAdress, preaded, sizeof(result), &readed))
    {
        return result;
    }
    else
    {
        std::cout << GetLastError() << "\n " << baseAdress << "\n";
    }
    return -1;
}
 
int16_t GetInt16FromProcess(HANDLE hProcess, LPCVOID baseAdress)
{
    int16_t result = 0;
    size_t readed = 0;
    LPVOID preaded = &result;
    if (ReadProcessMemory(hProcess, baseAdress, preaded, sizeof(result), &readed))
    {
        return result;
    }
    else
    {
        std::cout << GetLastError() << "\n " << baseAdress << "\n";
    }
    return -1;
}
 
int32_t GetInt32FromProcess(HANDLE hProcess, LPCVOID baseAdress)
{
    int32_t result = 0;
    size_t readed = 0;
    LPVOID preaded = &result;
    if (ReadProcessMemory(hProcess, baseAdress, preaded, sizeof(result), &readed))
    {
        return result;
    }
    else
    {
        std::cout << GetLastError() << "\n " << baseAdress << "\n";
    }
    return -1;
}
 
int64_t GetInt64FromProcess(HANDLE hProcess, LPCVOID baseAdress)
{
    int64_t result = 0;
    size_t readed = 0;
    LPVOID preaded = &result;
    if (ReadProcessMemory(hProcess, baseAdress, preaded, sizeof(result), &readed))
    {
        return result;
    }
    else
    {
        std::cout << GetLastError() << "\n " << baseAdress << "\n";
    }
    return -1;
}
 
float GetFloatFromProcess(HANDLE hProcess, LPCVOID baseAdress)
{
    float result = 0;
    size_t readed = 0;
    LPVOID preaded = &result;
    if (ReadProcessMemory(hProcess, baseAdress, preaded, sizeof(result), &readed))
    {
        return result;
    }
    else
    {
        std::cout << GetLastError() << "\n " << baseAdress << "\n";
    }
    return -1;
}
 
DWORD GetProcessIDByName(const std::wstring& processName)
{
    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);
 
    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (processesSnapshot == INVALID_HANDLE_VALUE)
        return 0;
 
    Process32First(processesSnapshot, &processInfo);
    if (!processName.compare(processInfo.szExeFile))
    {
        CloseHandle(processesSnapshot);
        return processInfo.th32ProcessID;
    }
 
    while (Process32Next(processesSnapshot, &processInfo))
    {
        if (!processName.compare(processInfo.szExeFile))
        {
            CloseHandle(processesSnapshot);
            return processInfo.th32ProcessID;
        }
    }
 
    CloseHandle(processesSnapshot);
    return 0;
}
 
LPVOID GetModuleBaseAddress(DWORD procId, const wchar_t* modName)
{
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_wcsicmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return (LPVOID)modBaseAddr;
}
 
 
DWORD distance(LPCVOID start, LPCVOID end)
{
    return (uint64_t)end - (uint64_t)start;
}
 
LPVOID FindFirstInt(HANDLE hProcess, int32_t value, LPCVOID startAddress, LPCVOID endAddress)
{
    LPVOID now = (LPVOID)startAddress;
    for (size_t i = 0; i < distance(startAddress, endAddress); i += 1) 
    {
        int32_t buf = 0;
        size_t readed = -1;
        now = LPVOID((uint64_t)now + 1);
        if (!ReadProcessMemory(hProcess, now, &buf, sizeof(value), &readed))
        {
            now = LPVOID((uint64_t)now + 4096);
        }
        else if(buf == value)
        {
            return now;
        }
    }
    return nullptr;
}
 
int main()
{
 
    HANDLE hProcess = OpenProcess(READ_CONTROL | PROCESS_VM_READ, false, GetProcessIDByName(L"notepad.exe"));
    
    LPVOID now = FindFirstInt(hProcess, 120, (LPVOID)0, (LPVOID)-1);
    while (now != nullptr)
    {
        std::cout << now << "\n";
        now = FindFirstInt(hProcess, 120, now, (LPVOID)-1);
    }
 
    CloseHandle(hProcess);
 
    return 0;
 
}
Часть функций не используется, нужно обратить внимание на FindFirstInt, я пытаюсь прочитать значение, если не выходит, пропускаю страницу памяти (вроде как она 4КБ) и сканю дальше, можно ли как-то посмотреть список страниц выделенных для процесса?
(+1, а не 4 сделано специально для игнорирования выравнивания, целевая переменная может быть не выравненной)

Так же, было бы неплохо услышать советы к коду
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2020, 22:04
Ответы с готовыми решениями:

Ускорить загрузку программы и уменьшить количество потребляемой памяти
День добрый! Очень важно, чтобы программа не тратила слишком много оперативки, а также загружалось относительно быстро. Наверняка можно...

Сканер IP - Адресов, Порт - сканер (в локальной сети)
Доброе время суток) Написана программа для сканирования портов (указал диапазон 5900 - 5906), на данный момент программа работает только...

Как переименовать сканер, и как узнать, какой из сканеров к какому МФУ относится?
Здравствуйте! На машине установлено 3 сетевых МФУ HP425dn. В списке сканеров 3 сканера с именами: 1) HP LJ400 M425 Scan 2) HP LJ400...

2
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
03.03.2020, 00:46
Лучший ответ Сообщение было отмечено AndryS1 как решение

Решение

Цитата Сообщение от AndryS1 Посмотреть сообщение
можно ли как-то посмотреть список страниц выделенных для процесса?
не понял зачем вы велосипед изобретаете, но не проще ли заюзать VirtualQuery/VirtualQueryEx и прочитать MEMORY_BASIC_INFORMATION
если этого мало, то есть native - NtQueryVirtualMemory
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef enum _MEMORY_INFORMATION_CLASS
{
    MemoryBasicInformation, // MEMORY_BASIC_INFORMATION
    MemoryWorkingSetInformation, // MEMORY_WORKING_SET_INFORMATION
    MemoryMappedFilenameInformation, // UNICODE_STRING
    MemoryRegionInformation, // MEMORY_REGION_INFORMATION
    MemoryWorkingSetExInformation, // MEMORY_WORKING_SET_EX_INFORMATION
    MemorySharedCommitInformation, // MEMORY_SHARED_COMMIT_INFORMATION
    MemoryImageInformation, // MEMORY_IMAGE_INFORMATION
    MemoryRegionInformationEx,
    MemoryPrivilegedBasicInformation,
    MemoryEnclaveImageInformation, // MEMORY_ENCLAVE_IMAGE_INFORMATION // since REDSTONE3
    MemoryBasicInformationCapped
} MEMORY_INFORMATION_CLASS;
2
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
03.03.2020, 00:53  [ТС]
_lunar_, огромное спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2020, 00:53
Помогаю со студенческими работами здесь

Как ускорить
Задача Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается “окно” длины K, то есть сначала в “окне” видно...

Как расшарить и принтер, и сканер
Добрый день! Имеется МФУ pantum m6500 с подключением только по USB. Но этот принтер нужно расшарить еще между 3 компьютерами. Сам...

Как ускорить программу?
Задача: найти в строке такую подстроку максимальной длины, чтобы символы в ней не повторялись. Принцип решения: пусть дана строка s, в...

Как ускорить libcurl
Загружаю страницу с помощью curl двумя способами: libcurl system(&quot;curl&quot;) Код первого способа: /** Коллбэк функция для...

Как ускорить циклы?
Здравствуйте, уважаемые. Так уж получилось, что мне нужно обработать несколько массивов данных, связанных между собой, причем не все...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru