ПРоблемма с IF

Тема в разделе "WASM.WIN32", создана пользователем spa, 15 июл 2009.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. bool (__stdcall *truerecv)(   SOCKET s,   unsigned char* buf,   int len,  int flags) = NULL;
    2.  
    3. SOCKET g_soc;
    4. bool (__stdcall newrecv)(    SOCKET s, unsigned  char* buf,    int len,   int flags)
    5. {
    6.  
    7. bool R = (*truerecv)(s,buf,len,flags);
    8.  
    9.  
    10. if(s==g_soc)
    11. {
    12.     int i= 5+33;
    13.  
    14. }
    15.  
    16. return  R;
    17. }
    Как наверное все догадались, это перехват (метод с дизасемблером имен) recv самое интересно что если убрать if то все работает, если оставить то где то дальше по коду, уже не в моей функции вылетает ошибка доступа к памяти. Логика ошибки мне не понятна. Может у кого есть какие то соображения
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    А запустить под отладчиком и посмотреть калл стек ?
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    onSide
    да дело в том что со стеком все в порядке, потом программа в контексте которой я работаю вылетает на
    Код (Text):
    1. 0040C04A  rep movs    dword ptr es:[edi],dword ptr [esi]
    0x08fe0000 = esi
    0x0b2d90c4 = edi (буфер какой то не нашенский)
    0x08fdef44 = buf

    Т.е. проблема не с кривым стеком, а фиг знает с чем.

    PS скажите как отключить проверки типа __RTC_CheckEsp в VS 2008 все настройки прошерстил
     
  4. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Я не про выравнивание стека говорил)
    Call stack это последовательность фреймов в стеке, по которым можно посмотреть порядок вызовов ф-ций от текущей назад.
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    onSide
    я знаю, и что я увижу в чужом приложении?
     
  6. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    может и ничего,а может увидишь что вызывается какая-то ф-ция с неверными параметрами...
    Это уже от тебя зависит что ты там увидишь)))
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    onSide
    как я узнаю какие параметры верные какие нет? перехват по цепочке нормально работает, и даже в этом случае вылетает не сразу, а через какоето время ,я не знаю почему. Причем повторю убираем if и все работает
     
  8. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Может все таки у кого нибудь есть мысли по этому поводу? мне кажется дело в флагах, хотя хз что там может быть.
     
  9. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Все тему закрыли, копипаста меня убьет ((
     
  10. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    хм.
    попробуй определить переменную "i" раньше твоего ифа
    так пробовал?
    например,
    Код (Text):
    1. bool (__stdcall *truerecv)(   SOCKET s,   unsigned char* buf,   int len,  int flags) = NULL;
    2.  
    3. SOCKET g_soc;
    4. bool (__stdcall newrecv)(    SOCKET s, unsigned  char* buf,    int len,   int flags)
    5. {
    6.  
    7. bool R = (*truerecv)(s,buf,len,flags);
    8. int i=0
    9.  
    10. if(s==g_soc)
    11. {
    12.     i= 5+33;
    13.  
    14. }
    15.  
    16. return  R;
    17. }
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    6opoDuJIo
    говорю же ошитбка тупой копипаст, не bool а int вот и все