C++ Вопрос Указать memory r/w в коде

Начинающий
Статус
Оффлайн
Регистрация
24 Фев 2021
Сообщения
23
Реакции[?]
1
Поинты[?]
0
Надо в 3 частях правильно указать memory r/w. Как его правильно прописать?

C++:
uintptr_t getBaseAddress(uintptr_t pid){
    // add  memory r/w code  #1
    return NULL;
}

template <typename T> T read(uintptr_t pid, uintptr_t address) {
    T t{};
    // add  memory r/w code #2
    return t;
}

template <typename T> void write(uintptr_t pid, uintptr_t address, T& buffer) {
    // add  memory r/w code #3
}
 
Легенда форума
Статус
Онлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
C++:
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}
Только вот смысл использования темплейтов..?
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
C++:
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}
Только вот смысл использования темплейтов..?
Это удобно. В коде можно будет считывать переменные/структуры как
C++:
Glow_t GlowObj = Read<Glow_t>(GlowManager + (GlowIndex * 0x38))
например.
Единственный случай когда будет удобнее считывать их как массив, это для строк или больших кусков памяти в которых потом уже что-то делать (С целью оптимизации кол-ва использований WPM/RPM), во всех остальных случаях как по мне будет гораздо удобнее считывать значение через функцию-обёртку с шаблоном а не считывать четыре байта в массив и потом делать *(int*)&bytes чтобы сконвертировать эти четыре байта в число.
 
Начинающий
Статус
Оффлайн
Регистрация
24 Фев 2021
Сообщения
23
Реакции[?]
1
Поинты[?]
0
спасибо))
C++:
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}
Только вот смысл использования темплейтов..?
я пробую инжект не обычный написать xd, благодарю)
 
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,125
Реакции[?]
395
Поинты[?]
50K
C++:
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}
Только вот смысл использования темплейтов..?
Не проще создать класс, в котором можно в констукторе получать дескриптор процесса и передавать это значение в переменную?
 
Легенда форума
Статус
Онлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Не проще создать класс, в котором можно в констукторе получать дескриптор процесса и передавать это значение в переменную?
Автор попросил добавить в код рид&райт, я добавил, остальное не ко мне) хотя лучше было бы, наверное, сделать hProcess ссылкой, Handle толстый вроде...
Тут в целом идея использования темплейта и тайпнейма плоха, ну и функция в темплейте у него void, что является плохой идеей, в купе с функциями, возвращающими булы.
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
Автор попросил добавить в код рид&райт, я добавил, остальное не ко мне) хотя лучше было бы, наверное, сделать hProcess ссылкой, Handle толстый вроде...
Тут в целом идея использования темплейта и тайпнейма плоха, ну и функция в темплейте у него void, что является плохой идеей, в купе с функциями, возвращающими булы.
Чем конкретно плохо использование темплейта? Если про то что мы не возвращаем BOOL ещё понятно, хотя по идее единственная ситуация где это может создать проблемы это при чтении read-only памяти или out of memory, ибо в остальных случаях у тебя зафейлится ещё на этапе открытия хэндла, то чем темплейт не угодил я даже представить не могу.
 
Последнее редактирование:
Легенда форума
Статус
Онлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Чем конкретно плохо использование темплейта?
В принципе - ничем) Но конкретно в данной ситуации - это странно. По-факту, темплейт функция, которая вызывает другую функцию - плохая идея. Это можно сделать только при желании сокращения кол-ва аргументов, которые всегда +- одинаковые (как, например, хэндл процесса, который, как говорил алмир, можно получать с помощью конструктора класса), но ведь тут их кол-во глобально то и не уменьшается, всего на пару штук.
Зато после этого сокращения мы получаем лишний вызов функции - вызов функции-темплейта, которая вызывает уже сам read/write.
Думаю, что лучше уж лишний раз напрячься и дописать пару лишних аргументов, чем жертвовать производительностью (пусть даже и незначительно), ну и C+P уже готового шаблона функции никто не отменял)
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
Зато после этого сокращения мы получаем лишний вызов функции - вызов функции-темплейта, которая вызывает уже сам read/write.
__forceinline, дальше компилятор сам соптимизирует до того что было бы при прямом вызове ReadProcessMemory.
но ведь тут их кол-во глобально то и не уменьшается, всего на пару штук.
учитывая что RPM/WPM используются часто, эта пара аргументов которые и так NULL каждый раз писать смысла я лично не вижу, к тому-же тут ещё в RPM автоматически есть буфер с его размером через sizeof(), и мы сравниваем
C++:
DWORD SomeCoolValue{};
ReadProcessMemory(hProcess, 0xDEADBEEF, &SomeCoolValue, sizeof(DWORD), NULL)
с
C++:
DWORD SomeCoolValue = Read<DWORD>(hProcess, 0xDEADBEEF)
и как по мне, второй вариант гораздо приятнее. лучше конечно сделать класс для работы с памятью и хэндл не передавать в аргументе.
 
Сверху Снизу