Отвечаю на вопросы 1, 2 и 3.
VirtualProtectEx нужен для того, чтобы установить нужному кусочку памяти необходимый уровень защиты для того, чтобы читать и записывать данные. Условно: сказать программе, что есть разрешение на запись/чтение этого участка памяти.
Использовать стоит везде, где ты её читаешь или записываешь.
Последствия, с которыми сталкивался я, – краш от античита с причиной "Нарушение прав доступа к памяти". Пример:
Это из краш-лога одного пользователя, который воспользовался
моим скриптом без VirtualProtectEx.
Теперь по поводу вопроса 4.
Измени ту функцию на вот эту. Вероятно, у тебя возникнет ошибка, просто надо поставить многобайтовую кодировку. В VS это делается
вот так.
C++:
Код:
DWORD
getModuleBaseAddress
(
DWORD pID
,
TCHAR
*
szModuleName
)
// функция, которая получает этот адрес "samp.dll". её трогать не надо
{
DWORD dwModuleBaseAddress
=
0
;
HANDLE hSnapshot
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
|
TH32CS_SNAPMODULE32
,
pID
)
;
if
(
hSnapshot
!=
INVALID_HANDLE_VALUE
)
{
MODULEENTRY32 ModuleEntry32
;
ModuleEntry32
.
dwSize
=
sizeof
(
MODULEENTRY32
)
;
if
(
Module32First
(
hSnapshot
,
&
ModuleEntry32
)
)
{
do
{
if
(
strcmp
(
ModuleEntry32
.
szModule
,
szModuleName
)
==
0
)
{
dwModuleBaseAddress
=
(
DWORD_PTR
)
ModuleEntry32
.
modBaseAddr
;
break
;
}
}
while
(
Module32Next
(
hSnapshot
,
&
ModuleEntry32
)
)
;
}
CloseHandle
(
hSnapshot
)
;
}
return
dwModuleBaseAddress
;
}