Вернуть функцию int64 C ++ в проект C # - PullRequest
0 голосов
/ 10 ноября 2018

Я пишу DLL, которая вводится в игру, и возвращаю мой localplayer и listArrayplayer на сервер. Хорошо работает нормально Код проекта DLL: Код C ++:

__int64 RerturnLocalPlayer() {

    __int64 player = GetLocalPlayer_EX();// __Int64 GetLocalPlayer_EX() is a function that return type __int64 value
    return player;
}

в main.h:

extern "C" {

__declspec(dllexport) __int64 RerturnLocalPlayer();

}

функция MT

extern "C" {
    __declspec(dllexport) __int64  GetLocalPlayer_EX()
    {
        DWORD64 pClientGameContext = *(DWORD64*)OFFSET_CLIENTGAMECONTEXT;
        if (!(pClientGameContext)) return 0;
        DWORD64 pPlayerManager = *(DWORD64*)(pClientGameContext + 0x68);
        if (!(pPlayerManager)) return 0;

        DWORD64 pObfuscationMgr = *(DWORD64*)OFFSET_ObfuscationMgr;
        if (!(pObfuscationMgr)) return 0;

        DWORD64 LocalPlayerListXorValue = *(DWORD64*)((DWORD64)pPlayerManager + 0xF0);
        DWORD64 LocalPlayerListKey = LocalPlayerListXorValue ^ *(DWORD64 *)(pObfuscationMgr + 0x70);
        hashtable<DWORD64>* table = (hashtable<DWORD64>*)(pObfuscationMgr + 8);
        hashtable_iterator<DWORD64> iterator = { 0 };

        hashtable_find(table, &iterator, LocalPlayerListKey);
        if (iterator.mpNode == table->mpBucketArray[table->mnBucketCount])
            return 0;

        DWORD64 EncryptedPlayerMgr = (DWORD64)iterator.mpNode->mValue.second;
        if (!(EncryptedPlayerMgr)) return 0;

        DWORD MaxPlayerCount = *(DWORD *)(EncryptedPlayerMgr + 0x18);
        if (MaxPlayerCount != 1) return 0;

        return EncryptedPlayerMgr__GetPlayer(EncryptedPlayerMgr, 0);
    }
}

C # код:

[System.Runtime.InteropServices.DllImportAttribute("BFClient1.dll", EntryPoint = "RerturnLocalPlayer",
CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern Int64 RerturnLocalPlayer();                    
Int64 localp = NativeMemory.Read<Int64> (RerturnLocalPlayer());

 Console.WriteLine("LocalPlayer " + localp.ToString("X"));

проблема в том, что когда я запускаю свое приложение на c #, моя консоль открывается и через 3 секунды закрывается, а иногда и выдает ошибку: ** Попытка чтения или записи в защищенную память. Обычно это указывает на повреждение другой памяти.

Может кто-нибудь попытаться помочь мне?

1 Ответ

0 голосов
/ 10 ноября 2018

__int64 RerturnLocalPlayer() - это функция, которая возвращает 64-битное значение через некоторое соглашение о вызовах. Вы, кажется, думаете, что это stdcall, я думаю, что вы не правы. Однако у меня нет вашего исходного кода, поэтому вы можете самостоятельно биться головой об стену.

public static extern Int64 RerturnLocalPlayer(); - правильное определение (опять же, за исключением соглашения о вызовах, в 32-разрядном ЦП 64-разрядный регистр отсутствует, поэтому он не будет stdcall).

Тем не менее, Int64 localp = NativeMemory.Read<Int64> (RerturnLocalPlayer()); это просто помешательство. Вы уже получаете целое число прямо от маршаллера в качестве возвращаемого значения, используйте его как таковое! Это будет правильный способ вызова вашей функции:

Int64 localp = RerturnLocalPlayer();
...