На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Функция козявит регистры и стек
    Добрый день.
    Пишу хук, в функции перехвата вставляю свою функцию обработчик(она не на Си и у нее соглашение __stdcall), и после ее работы у стека другой указатель, а в регистрах другие значения.
    Если ее убрать то все ок работает. Но она мне нужна. Без нее могу только prinf пакета сделать... Вроде же функции после своей работы должны сами за собой прибирать и возвращать все как было? Или с __stdcall не так?
    Помогите исправить, очень нужно...


    ExpandedWrap disabled
      void bb_ClientPacket(void *Src, int Size);
       
      void __fastcall SendXClient_Hook(unsigned int *This, void *_EDX, void *Src, int Size){
          bb_ClientPacket(Src, Size);                                                       // Этот обработчик все козявит, если его убрать то все ок, у него соглашение __stdcall
          SendXClient(This, _EDX, Src, Size);                                               // Здесь вызываю оригинальную функцию соглашение __fastcall
      }
      Цитата Rzonex @
      Если ее убрать то все ок работает. Но она мне нужна.


      ExpandedWrap disabled
        void bb_ClientPacket(void *Src, int Size);
         
        void __fastcall SendXClient_Hook(unsigned int *This, void *_EDX, void *Src, int Size){
            bb_ClientPacket(Src, Size);                                                       // Этот обработчик все козявит, если его убрать то все ок, у него соглашение __stdcall
            SendXClient(This, _EDX, Src, Size);                                               // Здесь вызываю оригинальную функцию соглашение __fastcall
        }

      1. А так ?:
      ExpandedWrap disabled
        void __stdcall bb_ClientPacket(void *Src, int Size);
         
        void __fastcall SendXClient_Hook(unsigned int *This, void *_EDX, void *Src, int Size){
            bb_ClientPacket(Src, Size);                                                       // Этот обработчик все козявит, если его убрать то все ок, у него соглашение __stdcall
            SendXClient(This, _EDX, Src, Size);                                               // Здесь вызываю оригинальную функцию соглашение __fastcall
        }



      2. Попробуй написать её на С.
      Пусть хотя бы просто пустую, "без никто" для начала.
      Сообщение отредактировано: ЫукпШ -
        Цитата ЫукпШ @
        Цитата Rzonex @
        Если ее убрать то все ок работает. Но она мне нужна.


        ExpandedWrap disabled
          void bb_ClientPacket(void *Src, int Size);
           
          void __fastcall SendXClient_Hook(unsigned int *This, void *_EDX, void *Src, int Size){
              bb_ClientPacket(Src, Size);                                                       // Этот обработчик все козявит, если его убрать то все ок, у него соглашение __stdcall
              SendXClient(This, _EDX, Src, Size);                                               // Здесь вызываю оригинальную функцию соглашение __fastcall
          }

        1. А так ?:
        ExpandedWrap disabled
          void __stdcall bb_ClientPacket(void *Src, int Size);
           
          void __fastcall SendXClient_Hook(unsigned int *This, void *_EDX, void *Src, int Size){
              bb_ClientPacket(Src, Size);                                                       // Этот обработчик все козявит, если его убрать то все ок, у него соглашение __stdcall
              SendXClient(This, _EDX, Src, Size);                                               // Здесь вызываю оригинальную функцию соглашение __fastcall
          }



        2. Попробуй написать её на С.
        Пусть хотя бы просто пустую, "без никто" для начала.

        Цитата
        А так ?:

        А так компилятор ругается матом. У этих функций строго определенный порядок вызова. Это функции из языка BlitzMax. Основа проги на BlitzMax, а те функции которые там невозможно использовать (т.к. там нет __stdcall)- я юзаю экстерном из C инклюда.
        Цитата
        Попробуй написать её на С.

        Ненавижу С :wall:
        Проблема явно в разных соглашениях о вызове, нужен переходник...
          Цитата Rzonex @
          Ненавижу С :wall:
          Проблема явно в разных соглашениях о вызове, нужен переходник...

          я не предлагаю писать на С.
          Нужно убедиться, что проблема именно в разных соглашениях о вызове,
          а не во внутреннем функционировании импортируемой из другого языка функции.
            Цитата ЫукпШ @
            Ненавижу С :wall:
            И пишешь на нём именно поэтому?
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0244 ]   [ 16 queries used ]   [ Generated: 18.04.24, 13:21 GMT ]