падает _beginthreadex в win 2003 serv

Тема в разделе "WASM.BEGINNERS", создана пользователем Tubrik, 8 мар 2007.

  1. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    В 2003 server ф-ия _beginthreadex работает, если стартую в exe или же из dll, но как только dll'ина подцепляется explorer'ом, то на _beginthreadex все рушится.

    попробовал так:
    Код (Text):
    1.         hThread = (HANDLE)_beginthreadex( NULL, 0, &start, NULL, CREATE_SUSPENDED, NULL );
    2.         Sleep(2000);
    3.         ResumeThread(hThread);
    рушится уже на resume

    что тут не так??
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Код нового треда можно?
    Он базонезависимый?
     
  3. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    Код (Text):
    1. unsigned __stdcall start(void *pArgs)
    2. {
    3. #ifdef  _BOX_DEBUG
    4.     MessageBox(NULL, "In Start(2)", "In Start(2)", MB_OK);
    5. #endif
    6.  
    7.     _endthreadex( 0 );
    8.     return 0;
    9. }//start
     
  4. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Нет, не заработает... Код НЕ базонезависимый...

    Во первых, адрес, куда указывает мсджбох в другом процессе будет неверным.
    Во вторых, неверные становятся ВСЕ адресса, в т.ч. и адресса строковых переменных.
     
  5. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    можно поподробнее?
    так получается только когда explorer подцепляет?
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    http://www.wasm.ru/article.php?article=apihook_2
    читать тут

    А вот цитата:
     
  7. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Tubrik
    Ты ассемблер знаешь?
    В принципе если да, то таких вопросов возникать не должно...а если нет, скажи...я объясню более подробно на пальцах, что и почему...
     
  8. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    не знаю
     
  9. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    под XP, 2000 Pro все работает как надо

    Код (Text):
    1. unsigned __stdcall start(void *pArgs)
    2. {
    3.     _endthreadex( 0 );
    4.     return 0;
    5. }//start
    если оставлю так, то вряд ли она заработает
     
  10. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Tubrik
    Ну тогда туго тебе прийдется... чтобы создать удаленный поток, нужны какие-то навыки...

    Вот смотри.

    В ассемблере нет как-таковых переменных, которые ты видишь в коде программы при разработке. Есть только указатели на адреса.
    В данном случае код


    MessageBox(NULL, "In Start(2)", "In Start(2)", MB_OK);

    На ассме будет выглядеть так


    push 0
    push 401100 <-------- Это указатель на строку 1
    push 401200 <-------- Тоже но на строку 2
    push 0
    call 401400 <--------- А это указатель на импотрированную функцию MessageBoxA, точнее на джамп на нее.

    Так вот, пока ты находишься в своем процессе, все указатели верны. НО! В другом процессе по этим адресам будут совершенно другие значения. (Кстати адреса могут отличаться от мноюприведенных, но принцип тот же) .

    И естеввственно функция call вызывает исключение и вылет программы.
    Поэтому прежде чем внедрять код, попробуй хотя бы освоить азы ассемблера
     
  11. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    почему это проблема появляется только в 2003 винде?
    у меня в коде типы данных опираются на функциональность Run Time Library, выделяется динамически память и все такое, и все ок в других виндах.

    может я не до конца все описал, исходники на Си, собираю студией 2003
     
  12. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Эххх... экзешник сбрось....
     
  13. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    ща сделаю exe,
    но
    поток у меня не удаленный, а создается при загрузке dll в адресное пространство эксплоера через реестр
    если я собру exe'шник, то все будет работать
     
  14. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    тю плин... так с этого и начинать нуна было....

    саму длл бросай... посмотрим что не так..
     
  15. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    я не знал, что он не удаленный, подсказали только что)
     
  16. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Вот этот код создает удаленный поток....
     
  17. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    hThread = (HANDLE)_beginthreadex( NULL, 0, &start, NULL, 0, NULL );
     
  18. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Tubrik
    То же самое.
    Просто поток создается активным
    А в первом случае замороженным
     
  19. Tubrik

    Tubrik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    26
    да, но падает он только когда страртует, т.е. если замороженный, то падает в resume

    не могу понять, дллина прикрепилась к сообщению или нет, что - то не вижу
     
  20. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    ИМЕННО!!!!
    Падает сам поток.
    Когда замороженный, он не выполняется. Т.е. падать нечему.
    А резюм его запускает. Вот и падает.