Create README.md
This commit is contained in:
parent
032c194cd1
commit
e00809e265
1 changed files with 120 additions and 0 deletions
120
README.md
Normal file
120
README.md
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
# gmcl_samurai_win32
|
||||
This module allows you to call **__stdcall/__cdecl** functions by pointer from **Lua**
|
||||
|
||||
# Functions:
|
||||
|
||||
handle = **samurai.GetModuleHandle**("user32.dll") - Get DLL HMODULE (return value caster to number)
|
||||
|
||||
func = **samurai.GetProcAddress**(handle,"MessageBoxA") - GetProcAddress, handle is a number (32 bit)
|
||||
|
||||
api = **samurai.ExportTable**("ntdll.dll") - Walks through dll's export table and pushes function in returned table
|
||||
|
||||
obj = **samurai.Alloc**(size) - Allocate memory, returns memobj metatable
|
||||
|
||||
stc = **samurai.StructFromPointer**(ptr) - Makes a struct metatable, ptr is a pointer (casted to number)
|
||||
|
||||
n = **invoke**(FuncPointer,...) - Call __cdecl/__stdcall by pointer (number), return value is integer, stored in eax (aka func's return value)
|
||||
|
||||
# MemObj Metatable:
|
||||
|
||||
You can get this object by samurai.Alloc(n)
|
||||
|
||||
obj = **samurai.Alloc**(292)
|
||||
|
||||
## Metamethods
|
||||
|
||||
**obj:Free**() - Free allocated memory
|
||||
|
||||
**obj:ToString**() - Returns memory as string
|
||||
|
||||
**obj:ToStruct**() - Returns **struct** metatable
|
||||
|
||||
**obj:ToPointer()** - Returns mem ptr as number
|
||||
|
||||
# Struct Metatable:
|
||||
|
||||
You can get this object by casting from memobj
|
||||
|
||||
stc = **obj:ToStruct**()
|
||||
|
||||
Or by casting from pointer
|
||||
|
||||
stc = **samurai.StructFromPointer**(ptr)
|
||||
|
||||
Struct organized as stack, which start from mem ptr
|
||||
|
||||
## Metamethods
|
||||
|
||||
**stc:ResetPtr**() - Reset s_ptr (aka stack pointer) to default value (mem ptr)
|
||||
|
||||
n = **stc:GetOffset**() - Get length from s_ptr and mem ptr, aka struct offset
|
||||
|
||||
**stc:SetOffset**(n) - Directly set stack pointer (s_ptr = mem ptr + offset)
|
||||
|
||||
**stc:Skip**(n) - Skip n bytes, add to offset n
|
||||
|
||||
**stc:PushString**(str) - Write string to s_ptr and add offset - string len + 1
|
||||
|
||||
**stc:PushNumber**(sz,n) - Which sz is (BYTE/WORD/DWORD) and n - number; Write number and his length to offset
|
||||
|
||||
str = **stc:GetStringFromPtr**() - return string by pointer from s_ptr and add 4 (DWORD size) to offset (aka char*)
|
||||
|
||||
str = **stc:GetStringFixed**(sz) - returns string from s_ptr and add to offset sz (string with fixed size aka char str[256])
|
||||
|
||||
str = **stc:GetString**() - Same as **GetStringFixed**, but sz is = strlen(str) (aka char str[?])
|
||||
|
||||
n = **stc:GetNumber**(sz) - Return number at s_ptr and add to offset sz (which BYTE/WORD/DWORD)
|
||||
|
||||
ptr = **stc:ToPointer**() - Return mem ptr
|
||||
|
||||
## Practical usage
|
||||
|
||||
You need set struct like this
|
||||
|
||||
```lua
|
||||
typedef struct {
|
||||
int a;
|
||||
int b;
|
||||
int c
|
||||
} something_t;
|
||||
|
||||
just
|
||||
|
||||
mem = samurai.Alloc(12) -- sizeof(int)*3
|
||||
stc = mem:ToStruct()
|
||||
stc:ResetPtr()
|
||||
stc:PushNumber(DWORD,1)
|
||||
stc:PushNumber(DWORD,2)
|
||||
stc:PushNumber(DWORD,3)
|
||||
|
||||
--Or parse
|
||||
|
||||
a = stc:GetNumber(DWORD)
|
||||
b = stc:GetNumber(DWORD)
|
||||
c = stc:GetNumber(DWORD)
|
||||
|
||||
mem:Free() -- Don't forget to free memory!
|
||||
```
|
||||
|
||||
# Global
|
||||
|
||||
When module loading, in global table (_G), samurai makes a few tables: kernel32,user32
|
||||
|
||||
Which filled by function pointers from kernel32.dll and user32.dll
|
||||
|
||||
n = **invoke**(FuncPointer,...) - Call __cdecl/__stdcall by pointer (number), return value is integer, stored in eax (aka func's return value)
|
||||
|
||||
Some global values:
|
||||
|
||||
```
|
||||
NULL = 0
|
||||
BYTE = 1
|
||||
WORD = 2
|
||||
DWORD = 4
|
||||
```
|
||||
|
||||
# Post Scriptum
|
||||
|
||||
See example in inject.lua
|
||||
|
||||
Also this module writed with custom lua interface (**see in repo gmcl_jack_win32**)
|
||||
Loading…
Add table
Reference in a new issue