I work on cheat for a single player game. I like function composition, immutability and a code without boilerplate so that's why I decided to write the cheat in F#. I finished something which works fine. I know that the code is far from perfect, but today I started my journey with F#.
I wonder if there is a way to somehow remove side effects from my code. Could you give me some hint how this can be achieved?
Thanks,
Rafal
open System;
open System.Diagnostics;
open System.Runtime.InteropServices;
open System.Text;
open System.ComponentModel;
let flip f x y = f y x
let curry f a b = f (a,b)
let uncurry f (a,b) = f a b
type MemoryOperation = int -> int -> int -> byte[]
//(f:int * int * byte[] * int * byref<int> -> bool)
[<DllImport("kernel32.dll")>]
extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId)
[<DllImport("kernel32.dll")>]
extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, int& lpNumberOfBytesWritten)
//let WriteMemory hProcess lpBaseAddress dwSize =
// let mutable buffer = Array.init dwSize byte
// let mutable lpNumberOfBytesWritten = 0
// WriteProcessMemory(hProcess, lpBaseAddress, buffer, dwSize, &lpNumberOfBytesWritten) |> ignore
// buffer
[<DllImport("kernel32.dll")>]
extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, int& lpNumberOfBytesRead)
let ReadMemory hProcess lpBaseAddress dwSize =
let mutable buffer = Array.init dwSize byte
let mutable lpNumberOfBytesRidden = 0
ReadProcessMemory(hProcess, lpBaseAddress, buffer, dwSize, &lpNumberOfBytesRidden) |> ignore
buffer
let gameProcesses = Array.toList(Process.GetProcessesByName("gameName"))
let openProcess (p: Process) =
let PROCESS_WM_READ = 0x0010
OpenProcess(PROCESS_WM_READ, false, p.Id)
let readMemory<'a>(bitConverter:byte[] -> 'a)(length:int)(memoryOperation: MemoryOperation)(memory:int)(ptr:IntPtr) =
(memoryOperation ((int)ptr) memory length) |> bitConverter
let bitConverter func = func
|> curry
|> flip <| 0
|> readMemory
let intIO = bitConverter BitConverter.ToInt32 4
let booleanIO = bitConverter BitConverter.ToBoolean 1
let charIO = bitConverter BitConverter.ToChar 1
let readInt = intIO ReadMemory
let readBoolean = booleanIO ReadMemory
let readChar = charIO ReadMemory
//let writeInt = intIO WriteMemory
//let writeBoolean = booleanIO WriteMemory
//let writeChar = charIO WriteMemory
let readHp = readInt 0x00A20D58
[<EntryPoint>]
let main argv =
while true do
gameProcesses |> (openProcess |> List.map)
|> (readHp |> List.map)
|> List.iter(printfn "%d")
0