Вылетает программа

Discussion in 'WASM.WIN32' started by drem1lin, Apr 22, 2010.

  1. drem1lin

    drem1lin Member

    Blog Posts:
    0
    есть две программы, взаимодействуют по сети. под отладчиком все здорово, но как только происходит отправка одной команды, программа получившая ее вылетает. обработчик этой команды должен получить список сетевых адаптеров на компе и отправить другой программе. пробовал и так как представлено ниже через pcap_findalldevs результат один, без отладчика падает. может кто поможет, о духи интернета? и странность, если между каждой функцией поставить по MessageBox, то все работает=(
    Code (Text):
    1. //глобальные переменные
    2. PIP_ADAPTER_INFO pAdapterInfoToDevList;
    3. PIP_ADAPTER_INFO pAdapterToDevList = NULL;
    4. ULONG len = sizeof(IP_ADAPTER_INFO);
    5. //код обработчика
    6. memset(pcap_err,0,PCAP_ERRBUF_SIZE);
    7.                                 memset(desthostname,0,255);
    8.                                 memset(DevList,0,1000);
    9.                                 strcpy(desthostname,(strrchr(lpBuffer,' ')+1));
    10.                                 int rslt=WSAEISCONN;
    11.                                 strcpy(DevList,"DeviceList!");
    12.                                 if (GetAdaptersInfo( pAdapterInfoToDevList, &len) == ERROR_BUFFER_OVERFLOW) {
    13.                                     free(pAdapterInfoToDevList);
    14.                                     pAdapterInfoToDevList = (IP_ADAPTER_INFO *) malloc (len);
    15.                                 }
    16.                                 if ((dwRetVal = GetAdaptersInfo( pAdapterInfoToDevList, &len)) == NO_ERROR)
    17.                                 {
    18.                                     pAdapterToDevList = pAdapterInfoToDevList;
    19.                                     while (pAdapterToDevList!=NULL)
    20.                                     {
    21.                                         strcat(DevList, pAdapterToDevList->Description);
    22.                                         strcat(DevList,"!");
    23.                                         pAdapterToDevList = pAdapterToDevList->Next;
    24.                                     }
    25.                                 }
    26.                                 if(TCP_CreateClient(&client,desthostname,SERVER_PORT_NUM2))
    27.                                 {
    28.                                     while(rslt==WSAEISCONN)
    29.                                     {
    30.                                         if(TCP_ConnectClient(&client))
    31.                                         {
    32.                                             if(TCP_Write(&client,DevList,strlen(DevList),&lpNumberOfBytesReadTotal))
    33.                                             {
    34.                                                 TCP_Disconnect(&client);
    35.                                             }
    36.                                         }
    37.                                         rslt=GetLastError();
    38.                                     }
    39.                                     TCP_Close(&client);
    40.                                 }
     
  2. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Первое, что я делаю в таких случаях -- дизассемблирую код ф-ии "вокруг" eip на момент падения. Обычно все сразу встает на свои места.
     
  3. mrcrown

    mrcrown Member

    Blog Posts:
    0
    Code (Text):
    1. while(rslt==WSAEISCONN)
    2.                                     {
    3.                                         if(TCP_ConnectClient(&client))
    4.                                         {
    5.                                             if(TCP_Write(&client,DevList,strlen(DevList),&lpNumberOfBytesReadTotal))
    6.                                             {
    7.                                                 TCP_Disconnect(&client);
    8.                                             }
    9.                                         }
    10.                                         rslt=GetLastError();
    11.                                     }
    а зачем в цикле отправка? что ты этим хочешь добиться?
    и покажи строки внутри ф-й TCP_
     
  4. drem1lin

    drem1lin Member

    Blog Posts:
    0
    Это код не мой, это моего друга, это просто дождаться полного выполнения функции насколько я помню. файл приложил. но Падает гдето до отправки в обратную сторону
     
  5. FatMoon

    FatMoon New Member

    Blog Posts:
    0
    Кхм. Нужен не этот код. Нужен код обработки полученной команды. Напоминает все это, что вы забываете что-то при обработке, вызывается тот же обработчик 2-й раз (!), переменные глобальные, происходит free(pAdapterInfoToDevList) во втором вызове обработчика, в то время как первый еще активен с циклом. Ну и немедленный вылет. Под отладчиком, который стопорит все пошагово, все работает. А в реальных условиях - ошибка доступа к памяти, или что-то такое. Короче, "выполнила недопустимую операцию и будет закрыта"
     
  6. FatMoon

    FatMoon New Member

    Blog Posts:
    0
    я бы тупо добавил 1 глобальную переменную, изначально заданную в True, а потом в начале обработки злосчастной команды

    if (flag_var==true) {
    flag_var=false;
    ...
    (А тут весь приведенный в #0 обработчик)
    ...
    flag_var=true;
    }
    Если прокатит, значит я прав и надо искать багу с вызовами.
     
  7. mrcrown

    mrcrown Member

    Blog Posts:
    0
    Бинарник зааттачить можешь?
     
  8. drem1lin

    drem1lin Member

    Blog Posts:
    0
    это тот который вылетает.
     
  9. drem1lin

    drem1lin Member

    Blog Posts:
    0
    Это второй, которым я управляю, вот в нем слева надо выделить Localhost и нажать получить список адаптеров
     
  10. drem1lin

    drem1lin Member

    Blog Posts:
    0
    это и был весь код обработчика=( начиная от memset И дальше до конца и двойных вызовов там по архитектуре быть не может=(
     
  11. mrcrown

    mrcrown Member

    Blog Posts:
    0
    Чет я его (бинарника) не наблюдаю
     
  12. mrcrown

    mrcrown Member

    Blog Posts:
    0
    ^^^^^^^^^^
     
  13. FatMoon

    FatMoon New Member

    Blog Posts:
    0
    Вы точно ЗНАЕТЕ, что не может, или вы ДУМАЕТЕ, что не должно? там окно есть? Окно или диалоговая форма? Вот это получение списка адаптеров - оно где расположено? как реакция на кнопку, или на какое-то сообщение, или по таймеру, после проверки на что-то?
     
  14. drem1lin

    drem1lin Member

    Blog Posts:
    0
    Там есть диалогавая форма, как интерфейс, для работы с сетью я создал совершенно отдельный поток, и получение списка адаптеров в этом отдельном потоке, и из него никуда не выходит и не передает управление.
     
  15. mrcrown

    mrcrown Member

    Blog Posts:
    0
    Code (Text):
    1. ---------------------------
    2. drv_client.exe - Не удалось найти компонент
    3. ---------------------------
    4. Приложению не удалось запуститься, поскольку packet.dll не был найден. Повторная установка приложения может исправить эту проблему.
    5. ---------------------------
    6. ОК  
    7. ---------------------------
    Code (Text):
    1. ---------------------------
    2. E:\NetClient.exe
    3. ---------------------------
    4. E:\NetClient.exe
    5.  
    6.  
    7.  
    8. Приложение не было запущено, поскольку оно некорректно настроено. Повторная установка приложения может решить данную проблему.
    9.  
    10.  
    11. ---------------------------
    12. ОК  
    13. ---------------------------
     
  16. drem1lin

    drem1lin Member

    Blog Posts:
    0
    Это ошибка связана с WinPcap, на компьютере он должен быть установлен
     
  17. mrcrown

    mrcrown Member

    Blog Posts:
    0
    ой, ты что что бы получить список адаптеров ВинПкап юзаешь??????
     
  18. drem1lin

    drem1lin Member

    Blog Posts:
    0
    да, пробовал, pcap_findalldevs, вылетало, попробовал заменить на GetAdaptersInfo, все равно летит=(. Там в программе есть простенький сетевой сниффер на WinPcap
     
  19. Mika0x65

    Mika0x65 New Member

    Blog Posts:
    0
    Так в чем проблема посмотреть в дизассемблере инструкции по адресу падения? Давно бы все стало понятно...