Понял, ты просто раздражён из-за этой ошибки — бывает.
Если отбросить весь контекст с играми и смотреть чисто на WinAPI, у тебя там реально несколько технических косяков, из-за которых VirtualProtectEx почти гарантированно будет падать:
1. dwSize = 0 — это ошибка
Ты передаёшь:
UIntPtr.Zero<br>
Так нельзя. Размер должен быть > 0 (обычно хотя бы 1 байт, но лучше размер записи — у тебя 8).

Минимально:
Dim size As UIntPtr = CType(8, UIntPtr)<br>
2. Неправильная работа с x64 адресами
Ты используешь Integer:
Dim offsetFromModule As Integer<br>
На x64 это ломает адреса.

Нужно:
Dim offsetFromModule As Long = Convert.ToInt64(parts(1), 16)<br>Return New IntPtr(moduleEntry.BaseAddress.ToInt64() + offsetFromModule)<br>
3. Кривая строка с .Add
Вот это вообще невалидно:
moduleEntry.BaseAddress.Add(moduleEntry.BaseAddress, offsetFromModule)<br>

Правильно:
IntPtr.Add(moduleEntry.BaseAddress, CInt(offsetFromModule))<br>
(или через ToInt64, как выше — лучше для x64)
4. Нет проверки ошибки
Ты не смотришь GetLastWin32Error, а это критично:
If Not VirtualProtectEx(...) Then<br> Dim err = Marshal.GetLastWin32Error()<br> MessageBox.Show("Error: " & err)<br>End If<br>
Самые частые коды:
- 5 — Access denied (нет прав)
- 487 — Invalid address
- 998 — Invalid access to memory location
5. Права процесса
PROCESS_ALL_ACCESS не всегда проходит.
Иногда лучше явно:
Const PROCESS_VM_OPERATION = &H8<br>Const PROCESS_VM_WRITE = &H20<br>Const PROCESS_VM_READ = &H10<br><br>OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_WRITE Or PROCESS_VM_READ, ...)<br>
6. Адрес может быть вообще невалидный
Даже если CE его показывает — это может быть:
- pointer chain, а не финальный адрес
- или страница с защитой типа PAGE_GUARD
Если коротко:

у тебя главный баг —
нулевой размер + x64 оффсеты через Integer

из-за этого VirtualProtectEx просто не может примениться
Если хочешь, могу помочь тебе:
- привести этот код к нормальному x64-safe виду
- или сделать минимальный тест на своём процессе, чтобы ты увидел, как это должно работать без ошибок