Показать сообщение отдельно

  #9  
Старый 09.07.2018, 13:21
NarutoUA
Постоянный
Регистрация: 26.05.2013
Сообщений: 692
С нами: 6822856

Репутация: 213


По умолчанию

Цитата:
Сообщение от #CJ  

Повторюсь с вопросом,так как уже заебался...
Происходит конфликт двух плагинов,а то есть перезапись хука HandleRPCPacketFunc,как исправить данную хурму?
Цитата:
Сообщение от Спойлер  


Код:





Код:
#define SAMP_HOOKENTER_HANDLE_RPC                    0x3743D
#define SAMP_HOOKENTER_HANDLE_RPC2                    0x373C9

#define SAMP_HOOKEXIT_HANDLE_RPC                    0x37443
#define SAMP_HOOKEXIT_HANDLE_RPC2                    0x37451

void HandleRPCPacketFunc(unsigned char id, RPCParameters *rpcParams, void(*callback) (RPCParameters *))
{
    if (rpcParams != nullptr && rpcParams->numberOfBitsOfData >= 8)
    {
        BitStream    bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
        switch (id)
        {
            case  RPC_DeathMessage:
            {
                pSAMP->addMessageToChat(-1, "plugin ONE");
                int16_t        plaerid, killerid;
                int8_t            resaon;
          
                bsData.ResetReadPointer();
                bsData.Read(killerid);
                bsData.Read(plaerid);
                bsData.Read(resaon);
                break;
            }

        }
    }
    callback(rpcParams);
}
void _declspec (naked) hook_handle_rpc_packet(void)
{
    static RPCParameters *pRPCParams = nullptr;
    static RPCNode *pRPCNode = nullptr;
    static DWORD dwTmp = 0;

    __asm pushad;
    __asm mov pRPCParams, eax;
    __asm mov pRPCNode, edi;

    HandleRPCPacketFunc(pRPCNode->uniqueIdentifier, pRPCParams, pRPCNode->staticFunctionPointer);
    dwTmp = pSAMP->getSAMPAddr() + SAMP_HOOKEXIT_HANDLE_RPC;

    __asm popad;
    __asm add esp, 4
    __asm jmp dwTmp;
}
void _declspec (naked) hook_handle_rpc_packet2(void)
{
    static RPCParameters *pRPCParams = nullptr;
    static RPCNode *pRPCNode = nullptr;
    static DWORD dwTmp = 0;

    __asm pushad;
    __asm mov pRPCParams, ecx;
    __asm mov pRPCNode, edi;

    HandleRPCPacketFunc(pRPCNode->uniqueIdentifier, pRPCParams, pRPCNode->staticFunctionPointer);
    dwTmp = pSAMP->getSAMPAddr() + SAMP_HOOKEXIT_HANDLE_RPC2;

    __asm popad;
    __asm jmp dwTmp;
}

void InstallAllHooks()
{
    static int    iSAMPHooksInstalled;
    if (!iSAMPHooksInstalled)
    {
        if (pSAMP->getInfo() == NULL)
            return;
/*
https://github.com/sr-tream/UniLib/blob/master/UniLib/CHooks.hpp
*/
        HookRPC1 = new CHookJmp(pSAMP->getSAMPAddr() + SAMP_HOOKENTER_HANDLE_RPC, hook_handle_rpc_packet, 6); //
        HookRPC2 = new CHookJmp(pSAMP->getSAMPAddr() + SAMP_HOOKENTER_HANDLE_RPC2, hook_handle_rpc_packet2, 8);
        iSAMPHooksInstalled = 1;
    }

}


Парсишь адрес функции которую вызывает хук и вызываешь в своём хуке (работает только если твой плагин грузится после первого), или ставишь хук в другом месте
 
Ответить с цитированием