PHP Code:
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi, SetLastError = true)]
private delegate int SendPacketDetour(uint type, string format, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5, IntPtr arg6, IntPtr arg7, IntPtr arg8, IntPtr arg9, IntPtr arg10, IntPtr arg11, IntPtr arg12, IntPtr arg13, IntPtr arg14);
private static int SendHookCallback(uint opcode, string format, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5, IntPtr arg6, IntPtr arg7, IntPtr arg8, IntPtr arg9, IntPtr arg10, IntPtr arg11, IntPtr arg12, IntPtr arg13, IntPtr arg14)
{
int argumentsToPush = 0;
for (int i = 0; i < format.Length; i += 1)
{
switch (format[i])
{
case 'b':
argumentsToPush += 1;
break;
case 'd':
argumentsToPush += 1;
break;
case 'f':
argumentsToPush += 2;
break;
case 'u':
argumentsToPush += 1;
break;
case 's':
argumentsToPush += 1;
break;
case 'm':
argumentsToPush += 2;
break;
default:
Logger.Log("Unknown type: " + format[i]);
break;
}
}
return (int)_sendHook.CallOriginal(opcode, format,
argumentsToPush >= 1 ? arg1 : IntPtr.Zero,
argumentsToPush >= 2 ? arg2 : IntPtr.Zero,
argumentsToPush >= 3 ? arg3 : IntPtr.Zero,
argumentsToPush >= 4 ? arg4 : IntPtr.Zero,
argumentsToPush >= 5 ? arg5 : IntPtr.Zero,
argumentsToPush >= 6 ? arg6 : IntPtr.Zero,
argumentsToPush >= 7 ? arg7 : IntPtr.Zero,
argumentsToPush >= 8 ? arg8 : IntPtr.Zero,
argumentsToPush >= 9 ? arg9 : IntPtr.Zero,
argumentsToPush >= 10? arg10: IntPtr.Zero,
argumentsToPush >= 11? arg11: IntPtr.Zero,
argumentsToPush >= 12? arg12: IntPtr.Zero,
argumentsToPush >= 13? arg13: IntPtr.Zero,
argumentsToPush >= 14? arg14: IntPtr.Zero
);
}
It's ugly but at least it's working