f979c2ca4b
Signed-off-by: Michael Fabian Dirks <michael.dirks@realitybends.de>
150 lines
4.9 KiB
C++
150 lines
4.9 KiB
C++
// BlitzPointer - Adding Pointers to Blitz.
|
|
// Copyright (C) 2015 Project Kube (Michael Fabian Dirks)
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "BlitzPointer.h"
|
|
|
|
// Hybrid specific defines.
|
|
#define CALLFUNCTION_DECL_BEGIN_64(NAME) DLL_EXPORT int64_t BlitzPointer_CallFunction##NAME(intptr_t lpFunctionPointer
|
|
#define CALLFUNCTION_IMPL_PARAMETER_64(INDEX, NAME) __asm MOV RAX, [NAME] __asm mov [esp + INDEX * 4], RAX
|
|
#define CALLFUNCTION_IMPL_CALL_64() __asm CALL QWORD ptr[lpFunctionPointer]
|
|
#define CALLFUNCTION_IMPL_RESULT_64() int64_t result; __asm MOV [result], RAX
|
|
|
|
/*
|
|
// No Parameters
|
|
CALLFUNCTION_DECL_BEGIN_64(Q0)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_CALL_64()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
// One Parameter
|
|
CALLFUNCTION_DECL_BEGIN_64(Q1D)
|
|
CALLFUNCTION_DECL_PARAMETER(int32_t, p1)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(1)
|
|
CALLFUNCTION_IMPL_PARAMETER(0, p1)
|
|
CALLFUNCTION_IMPL_CALL_64()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN_64(Q1Q)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p1)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(1)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(0, p1)
|
|
CALLFUNCTION_IMPL_CALL_64()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
// Two Parameters
|
|
CALLFUNCTION_DECL_BEGIN(D2DQ)
|
|
CALLFUNCTION_DECL_PARAMETER(int32_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN(D2QD)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int32_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN(D2QQ)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN_64(Q2DD)
|
|
CALLFUNCTION_DECL_PARAMETER(int32_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN_64(Q2DQ)
|
|
CALLFUNCTION_DECL_PARAMETER(int32_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN_64(Q2QD)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int32_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
CALLFUNCTION_DECL_BEGIN_64(Q2QQ)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p1)
|
|
CALLFUNCTION_DECL_PARAMETER(int64_t, p2)
|
|
CALLFUNCTION_DECL_END() CALLFUNCTION_IMPL_BEGIN()
|
|
CALLFUNCTION_IMPL_SAFEGUARD()
|
|
CALLFUNCTION_IMPL_PREPARE(2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(1, p2)
|
|
CALLFUNCTION_IMPL_PARAMETER_64(0, p1)
|
|
CALLFUNCTION_IMPL_CALL()
|
|
CALLFUNCTION_IMPL_RESULT_64()
|
|
CALLFUNCTION_IMPL_RETURN()
|
|
CALLFUNCTION_IMPL_END()
|
|
|
|
*/ |