All of the above are now possible
*IanM's matrix1utils plugin is required*
Add the following code to an include file in your project:
function argInit()
global argEquateSSPtr
` Insert ASM code into getReturnEBP:
` 0x8B 0x45 0x00 mov eax, [ebp+0]
` 0xC3 ret
` (Bytes reversed to get correct endian-ness:)
poke dword get ptr to function("getReturnEBP"), 0xC300458B
coredll = load dll("dbprocore.dll")
argEquateSSPtr = get ptr to dll function(coredll, "?EquateSS@@YAKKK@Z")
endfunction
function argSetInteger(arg, value)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
poke integer addr, value
endfunction arg
function argSetFloat(arg, value#)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
poke float addr, value#
endfunction arg
function argSetString(arg, value$)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
assignString(addr, value$)
endfunction arg
function assignString(addr, value$)
result = call function ptr(argEquateSSPtr, peek integer(addr), get string ptr(value$))
poke integer addr, result
endfunction
function assignStringPtr(addr, ptr)
result = call function ptr(argEquateSSPtr, peek integer(addr), ptr)
poke integer addr, result
endfunction
function argSetDword(arg, value as dword)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
poke dword addr, value
endfunction arg
function argSetWord(arg, value as word)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 7
exitfunction arg
endif
if v = 0x81
dec arg, 13
addr = peek integer(arg+1) + peek integer(arg+8)
else
if v = 0xA1
dec arg, 7
addr = peek integer(arg+2)
else
dec arg, 8
addr = ebp + peek integer(arg+3)
endif
endif
poke word addr, value
endfunction arg
function argSetByte(arg, value as byte)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA0
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
poke byte addr, value
endfunction arg
function argSetBoolean(arg, value as byte)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA0
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
poke byte addr, value
endfunction arg
function argSetDoubleInteger(arg, value as double integer)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-7)
if v = 0xB8
dec arg, 14
exitfunction arg
endif
if v = 0x81
dec arg, 21
addr = peek integer(arg+1) + peek integer(arg+15)
else
if v = 0xA1
dec arg, 14
addr = peek integer(arg+8)
else
dec arg, 16
addr = ebp + peek integer(arg+10)
endif
endif
poke double integer addr, value
endfunction arg
function argSetDoubleFloat(arg, value as double float)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-23)
if v = 0x81
dec arg, 29
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0x05
dec arg, 24
addr = peek integer(arg+2)
else
dec arg, 24
addr = ebp + peek integer(arg+2)
endif
endif
poke double float addr, value
endfunction arg
function argSetUDT(arg, ptr, name$)
ebp = peek integer(getReturnEBP())
repeat
dec arg, 7
v = peek byte(arg+2)
until v
v = peek byte(arg-3)
if v = 0xB8
dec arg, 3
addr = peek integer(arg+1)
size = peek integer(arg+6)
else
v = peek byte(arg-8)
if v = 0xB8
dec arg, 8
addr = peek integer(arg+1) + peek integer(arg+6)
size = peek integer(arg+11)
else
dec arg, 5
addr = ebp + peek integer(arg+3)
size = peek integer(arg+8)
endif
endif
pattern$ = get type pattern$(name$, 0)
plen = fast len(pattern$)
offset = 0
for i = 1 to plen
c$ = mid$(pattern$, i)
select c$
case "S"
assignStringPtr(addr + offset, peek integer(ptr + offset))
inc offset, 4
endcase
case "O"
poke double integer addr + offset, peek double integer(ptr + offset)
inc offset, 8
endcase
case "R"
poke double integer addr + offset, peek double integer(ptr + offset)
inc offset, 8
endcase
case default
poke integer addr + offset, peek integer(ptr + offset)
inc offset, 4
endcase
endselect
next i
endfunction arg
function argSkipInteger(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 12
else
if v = 0xB8 or v = 0xA1
dec arg, 6
else
dec arg, 7
endif
endif
endfunction arg
function argSkipFloat(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 12
else
if v = 0xB8 or v = 0xA1
dec arg, 6
else
dec arg, 7
endif
endif
endfunction arg
function argSkipString(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 12
else
if v = 0xB8 or v = 0xA1
dec arg, 6
else
dec arg, 7
endif
endif
endfunction arg
function argSkipDword(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 12
else
if v = 0xB8 or v = 0xA1
dec arg, 6
else
dec arg, 7
endif
endif
endfunction arg
function argSkipWord(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 13
else
if v = 0xB8 or v = 0xA1
dec arg, 7
else
dec arg, 8
endif
endif
endfunction arg
function argSkipByte(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 12
else
if v = 0xB8 or v = 0xA0
dec arg, 6
else
dec arg, 7
endif
endif
endfunction arg
function argSkipBoolean(arg)
v = peek byte(arg-6)
if v = 0x81
dec arg, 12
else
if v = 0xB8 or v = 0xA0
dec arg, 6
else
dec arg, 7
endif
endif
endfunction arg
function argSkipDoubleInteger(arg)
v = peek byte(arg-7)
if v = 0x81
dec arg, 21
else
if v = 0xB8 or v = 0xA1
dec arg, 14
else
dec arg, 16
endif
endif
endfunction arg
function argSkipDoubleFloat(arg)
v = peek byte(arg-23)
if v = 0x81
dec arg, 29
else
dec arg, 24
endif
endfunction arg
function argSkipUDT(arg)
repeat
dec arg, 7
v = peek byte(arg+2)
until v
v = peek byte(arg-3)
if v = 0xB8
dec arg, 3
else
v = peek byte(arg-8)
if v = 0xB8
dec arg, 8
else
dec arg, 5
endif
endif
endfunction arg
function argGetFirst()
addr = peek integer(getReturnEBP()+4)
arg = addr-5
endfunction arg
function argGetPtrToInteger(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToFloat(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToString(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToDword(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA1
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToWord(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 7
exitfunction arg
endif
if v = 0x81
dec arg, 13
addr = peek integer(arg+1) + peek integer(arg+8)
else
if v = 0xA1
dec arg, 7
addr = peek integer(arg+2)
else
dec arg, 8
addr = ebp + peek integer(arg+3)
endif
endif
endfunction addr
function argGetPtrToByte(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA0
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToBoolean(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-6)
if v = 0xB8
dec arg, 6
exitfunction arg
endif
if v = 0x81
dec arg, 12
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0xA0
dec arg, 6
addr = peek integer(arg+1)
else
dec arg, 7
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToDoubleInteger(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-7)
if v = 0xB8
dec arg, 14
exitfunction arg
endif
if v = 0x81
dec arg, 21
addr = peek integer(arg+1) + peek integer(arg+15)
else
if v = 0xA1
dec arg, 14
addr = peek integer(arg+8)
else
dec arg, 16
addr = ebp + peek integer(arg+10)
endif
endif
endfunction addr
function argGetPtrToDoubleFloat(arg)
ebp = peek integer(getReturnEBP())
v = peek byte(arg-23)
if v = 0x81
dec arg, 29
addr = peek integer(arg+1) + peek integer(arg+7)
else
if v = 0x05
dec arg, 24
addr = peek integer(arg+2)
else
dec arg, 24
addr = ebp + peek integer(arg+2)
endif
endif
endfunction addr
function argGetPtrToUDT(arg)
ebp = peek integer(getReturnEBP())
repeat
dec arg, 7
v = peek byte(arg+2)
until v
v = peek byte(arg-3)
if v = 0xB8
dec arg, 3
addr = peek integer(arg+1)
else
v = peek byte(arg-8)
if v = 0xB8
dec arg, 8
addr = peek integer(arg+1) + peek integer(arg+6)
else
dec arg, 5
addr = ebp + peek integer(arg+3)
endif
endif
endfunction addr
function addressOfInteger(var)
addr = argGetPtrToInteger(argGetFirst())
endfunction addr
function addressOfFloat(var as float)
addr = argGetPtrToFloat(argGetFirst())
endfunction addr
function addressOfString(var as string)
addr = argGetPtrToString(argGetFirst())
endfunction addr
function addressOfDword(var as dword)
addr = argGetPtrToDword(argGetFirst())
endfunction addr
function addressOfWord(var as word)
addr = argGetPtrToWord(argGetFirst())
endfunction addr
function addressOfByte(var as byte)
addr = argGetPtrToByte(argGetFirst())
endfunction addr
function addressOfBoolean(var as boolean)
addr = argGetPtrToBoolean(argGetFirst())
endfunction addr
function addressOfDoubleInteger(var as double integer)
addr = argGetPtrToDoubleInteger(argGetFirst())
endfunction addr
function addressOfDoubleFloat(var as double float)
addr = argGetPtrToDoubleFloat(argGetFirst())
endfunction addr
` Will be replaced by ASM code at init time
function getReturnEBP()
endfunction result
And call "argInit()" at the start of your program. Now you can use it how you want.
Examples
A function to set an integer variable to 42
argInit()
myvar = 1
print myvar
SetTo42(myvar)
print myvar
sync : sync
wait key
end
function SetTo42(param)
arg = argGetFirst()
arg = argSetInteger(arg, 42)
endfunction
Multiple arguments (as you can see, calling a set function will return the next argument so it's easy to set multiple arguments):
argInit()
myinteger = 1
myfloat# = 1.0
mystring$ = "1"
print myinteger
print myfloat#
print mystring$
SetTo42(myinteger, myfloat#, mystring$)
print myinteger
print myfloat#
print mystring$
sync : sync
wait key
end
function SetTo42(param, param#, param$)
arg = argGetFirst()
arg = argSetInteger(arg, 42)
arg = argSetFloat(arg, 42.0)
arg = argSetString(arg, "42")
endfunction
Skipping arguments (sometimes you only want to set some of the arguments):
argInit()
myinteger = 1
myfloat# = 1.0
mystring$ = "1"
print myinteger
print myfloat#
print mystring$
SetTo42(myinteger, myfloat#, mystring$)
print myinteger
print myfloat#
print mystring$
sync : sync
wait key
end
function SetTo42(param, param#, param$)
arg = argGetFirst()
arg = argSkipInteger(arg)
arg = argSkipFloat(arg)
arg = argSetString(arg, "42")
endfunction
The parameter passed into one of these functions must have exactly the right type or nothing will happen (ie. passing a dword to a function which takes an integer and tries to change it will result in the dword not being changed).
These functions should work in all cases except with arrays, which are not yet supported.
Returning UDTs can be acheived by having the calling code pass in the UDT as a parameter, and then the function can call "argSetUDT" with the address of a UDT containing the result. You can get the address of a UDT by getting the address of the first member of the UDT using the "addressOfXXX" functions.
[b]