Вопрос LPCVOID и BYTE* в чем разница при чтение памяти

Начинающий
Статус
Оффлайн
Регистрация
3 Сен 2023
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Приветствую всех в чем разница и почему для чтение памяти процессе , в одной статье используется LPCVOID , а в уроках guidehacking используется указатель на BYTE

Вот пример:
C++:
ReadProcessMemory(hProcess, (BYTE*)addr, &tempValue, sizeof(tempValue), nullptr);
C++:
ReadProcessMemory(hProcess, (LPCVOID)addr, &tempValue, sizeof(tempValue), nullptr);
Результат при чтение один и тот же для разных типов.
LPCVOID - это просто указатель на какие-то константные данные любого типа.
А BYTE* - указывает на память, в которой каждый байт может быть использован для хранения информации.

Так в чем разница и что лучше стоит использовать, и почему
 
Разработчик
Статус
Оффлайн
Регистрация
1 Сен 2018
Сообщения
1,596
Реакции[?]
879
Поинты[?]
118K
Приветствую всех в чем разница и почему для чтение памяти процессе , в одной статье используется LPCVOID , а в уроках guidehacking используется указатель на BYTE

Вот пример:
C++:
ReadProcessMemory(hProcess, (BYTE*)addr, &tempValue, sizeof(tempValue), nullptr);
C++:
ReadProcessMemory(hProcess, (LPCVOID)addr, &tempValue, sizeof(tempValue), nullptr);
Результат при чтение один и тот же для разных типов.
LPCVOID - это просто указатель на какие-то константные данные любого типа.
А BYTE* - указывает на память, в которой каждый байт может быть использован для хранения информации.

Так в чем разница и что лучше стоит использовать, и почему
абсолютно никакой разницы, в любом случае у тебя это просто каст игрового адресса к указателю
 
#define VOID void
Начинающий
Статус
Оффлайн
Регистрация
13 Май 2017
Сообщения
120
Реакции[?]
24
Поинты[?]
13K
BYTE* = unsigned char*
LPCVOID = const char void*

Ты передаёшь тип как указатель. Функция в которой они передаётся в любом случае вынуждена читать по размеру указателя (x86 - 4 байта, x64 - 8 байт). Единственное что - при разименовании указателя тебе вернёт тот тип, который указан и это уже может сделать разницу. В чём же разница? В том что разные типы данных имеют разные размеры. Но ReadProcessMemory всё равно принимает void*, так что чтение происходит под размеру указателя. Значит разницы никакой нет.

Кратко: ReadProcessMemory и большинство функций WINAPI принимают указатели на память. Значит внутри они читают память по размеру указателя (x86 - 4 байта, x64 - 8 байт), значит вообще плевать какой тип ты передашь, хоть ULONGLONG*. Основной поинт в том что используется указатель, а не сам тип.
 
Начинающий
Статус
Оффлайн
Регистрация
14 Июл 2019
Сообщения
102
Реакции[?]
28
Поинты[?]
2K
(BYTE*)addr treats addr as a pointer to bytes
(LPCVOID)addr treats addr as a pointer to constant data of any type
there is no functional difference between the two pieces of code you provided it just comes down to both your code style as well as the readability of your code
 
Сверху Снизу