Вот имя переменной по адресу.
MyTestVar := 123
MsgBox, % "|" GetVarName(&MyTestVar) "|"
GetVarName(pPtr)
{
static MEM_COMMIT := 0x1000, PAGE_GUARD := 0x100, PAGE_NOACCESS := 0x1
, PROCESS_VM_READ := 0x10, PROCESS_QUERY_INFORMATION := 0x400, PROCESS_VM_OPERATION := 0x8
SetBatchLines, -1
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_QUERY_INFORMATION
, Int, 0, UInt, DllCall("GetCurrentProcessId"), Ptr)
VarSetCapacity(MBI, size := A_PtrSize*5 + 4*2, 0)
addr := 0
while DllCall("VirtualQuery", Ptr, addr, Ptr, &MBI, Ptr, size)
{
BaseAddress := NumGet(MBI)
RegionSize := NumGet(MBI, A_PtrSize*3)
State := NumGet(MBI, A_PtrSize*4, "UInt")
Protect := NumGet(MBI, A_PtrSize*4 + 4, "UInt")
addr += RegionSize
if (BaseAddress < 0xFFFFF && A_PtrSize = 8) || (BaseAddress < 0x7FFFFF && A_PtrSize = 4)
continue
if (State != MEM_COMMIT || (Protect & PAGE_NOACCESS) || (Protect & PAGE_GUARD))
continue
VarSetCapacity(buff, RegionSize, 0)
if !DllCall("ReadProcessMemory", Ptr, hProcess, Ptr, BaseAddress, Ptr, &buff, Ptr, RegionSize, PtrP, BytesRead) {
MsgBox, Ошибка чтения памяти %A_LastError%
break
}
Loop % BytesRead - A_PtrSize
{
p := &buff + (A_Index - 1)
if NumGet(p+0) != pPtr
continue
err := i := 0
Loop
num := NumGet(p - 16 - A_Index*4, "Int"), i += 4
until num = 0 || (A_Index = 20 && err := 1)
if err
continue
if RegExMatch(str := StrGet(p - 16 - i + 4 + (A_PtrSize = 4 ? 4 : 0)), "^[\w#_@\$]+$")
break 2
}
VarSetCapacity(buff, 0)
}
DllCall("CloseHandle", Ptr, hProcess)
Return str
}
Но это шутка, конечно.
Разработка AHK-скриптов:
e-mail
dfiveg@mail.ruTelegram
jollycoder