ShellExecute не отдает управление

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 6 сен 2009.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Eсть библиотека которая подгружаеться при помощи Rundll32 и вызывает указаную функ.
    которая должна через ShellExecute открыть b explorer каталог.
    Но проблема в том что если два раза(но при этом первая еще не выгрузилась) так подгрузить библиотеку то при втором вызове ShellExecute происходит подвисание на ShellExecute....до тех пор пока не заkрить первый запусченый Rundll32.
    Можна как то сделать так чтоб такого подвисания не было и при этом открывался второй католог в explorer?
    Bариант с CreateProcess не подходить так как оболчка может быть и не explorer.
    И еще вопрос что делает ctfmon.exe ?

    Вот так я подгружаю библ. rundll32.exe F:\project\project2.dll, MainFunc
    Код (Text):
    1. library Project2;
    2.  
    3. uses
    4.   shellapi,messages,windows;
    5.  
    6. {$R *.res}
    7. procedure mian;
    8. begin
    9.  ShellExecute(0,'open','f:\',nil,'f:\',  SHOW_OPENWINDOW);
    10. sleep(1000000);
    11. end;
    12. exports
    13.  mian name 'MainFunc';
    14. begin
    15. end.
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Доставь дампы rundll – выполняющегося и "подвисшего на ShellExecute". Может быть кто-нибудь посмотрит.
    Один может и сам посмотреть – нужно взять DTW, запустить "WinDbg -p RundllPID" и посмотреть стектрейс – команда "k". Будет видно, где остановлено выполнение. В общем-то можно и через Olly посмотреть, и через ProcessExplorer.
    (Дамп можно сделать с помощью WinDbg – ".dump /ma dumpfile.dmp", или через procdump.exe с параметром -ma, либо TaskManager'ом).
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Остановки нету...там где тов ShellExecute происходит подвисание как будто она висит на WaitForSingleObject или тому подобному...при запуске через Olly, ни каких остановов нету...
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Какие есчо дампы, это ведь юзермодный функционал, а есчо мне говорили не стрелять по воробьям из пушки :)
    Ничего удивительного нет что виснет, вероятно обычная синхронизация, скомпиленный тестовый модуль в студию, сурцы не нужны.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Clerk
    Ага, юзермодный. Мы и просим юзермодный минидамп – там информация о потоках (в т.ч. время выполнения и контексты), стеки потоков, инфа о хендлах, полное адресное пространство приложения (в т.ч. скомпиленный модуль, ага). Кстати, вроде ни слова не говорили по поводу твоих методов – это дают о себе знать наши множественные склерозы или кто-то таки пользует Sol-ID без лицензии? )

    XshStasX
    Остановка, "подвисание" – одно и то же в нашем контексте. Мы не просто так сказали про дампы, кстати.
       
    Несколько минут парсили. Ставь тире или хотя бы пробелы, чёрт побери.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    ясно как токо на днях скачаю DTW, закину их сюда...
    эт случайно так записал...
     
  7. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Sol_Ksacap
    Расскажите-ка как сдампить процесс Диспетчером задач.
    Может спит очень долго? Оставь просто - end;
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Смысла нет дампить адресное пространство, ибо есть рабочий процесс на рабочей системе. Я бы выполнил суспенд треда который висит и бактрейс. Тогда увидим где тред подвис, а для чего раскажут отладочные символы.
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Clerk
    В общем-то да, пожалуй многомегабайтный дамп здесь – излишество. С другой стороны, если нет прямого доступа к процессу, то, нам кажется, проще выполнить те же действия с дампом и потом показать\прокомментировать лог, нежели пытаться по шагам объяснить что и как.

    AndreyMust19
    Task Manager Dump
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Не понимаю зачем чтото дампить, не защита ведь вскрывается. Олю подключить и посмотреть чего виснет, пару минут займёт. А что дамп даст, в нём контекста треда не будет и есчо много чего, да и вручную многое проблемно определить без реалтайма, как например из дампа определить адрес страницы TEB треда.. Анализ полных дампов(ядра в частности) на своей системе вобще не нужен, это используется для анализа крэшдампов с других машин.
     
  11. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Clerk
    Мы предложили получить дами исключительно из-за того, что не нашли простого пути для формулировки исчерпывающего и понятного ОПу описания шагов по поиску и устранению бага. Фразу "выполни 'procdump.exe -ma rundll_PID'", с другой стороны, очень легко и собрать, и распарсить. Проще, чем любое предложение в этом посте.

    Clerk
    Это не тот тип дампа, где только кусок адресного пространства же. Например, дамп "application1.dmp" был получен с помощью Task Manager:
    Код (Text):
    1. cmd> windbg -z C:\Users\John\AppData\Local\Temp\application1.DMP
    2.  
    3. Дамп открылся в windbg:
    4.  
    5. <..>
    6. 0:000:x86> .dumpdebug
    7. ----- User Mini Dump Analysis
    8.  
    9. MINIDUMP_HEADER:
    10. Version         A793 (6903)
    11. NumberOfStreams 11
    12. Flags           1826
    13.                 0002 MiniDumpWithFullMemory
    14.                 0004 MiniDumpWithHandleData
    15.                 0020 MiniDumpWithUnloadedModules
    16.                 0800 MiniDumpWithFullMemoryInfo
    17.                 1000 MiniDumpWithThreadInfo
    18. <..>
    19.  
    20. 0:000:x86> ~
    21. .  0  Id: d18.108c Suspend: 0 Teb: 7efdb000 Unfrozen
    22.    1  Id: d18.1258 Suspend: 0 Teb: 7efd8000 Unfrozen
    23.    2  Id: d18.e38 Suspend: 0 Teb: 7efaa000 Unfrozen
    24.  
    25.  
    26. 0:000:x86> ~1s
    27. user32!NtUserGetMessage+0x15:
    28. 763a65b7 c21000          ret     10h
    29.  
    30. 0:001:x86> ? @$teb
    31. Evaluate expression: 2130542592 = 7efd8000
    32.  
    33. 0:001:x86> ?? @$teb->NtTib
    34. struct _NT_TIB
    35.    +0x000 ExceptionList    : 0x7efda000 _EXCEPTION_REGISTRATION_RECORD
    36.    +0x008 StackBase        : 0x00a5fd20
    37.    +0x010 StackLimit       : 0x00a5a000
    38.    +0x018 SubSystemTib     : (null)
    39.    +0x020 FiberData        : 0x00001e00
    40.    +0x020 Version          : 0x1e00
    41.    +0x028 ArbitraryUserPointer : (null)
    42.    +0x030 Self             : 0x7efd8000 _NT_TIB
    Пойми нас правильно – мы не агитируем кого-либо для каждой ситуации создавать дамп и анализировать уже его. Просто в данном случае именно это действие для нас выглядело наиболее простым.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    XshStasX
    Тред висит в SendMessageTimeout(), вызывает функа из Shell32.dll с именем GetConversationWindow().
    [​IMG]
    Как верно заметил AndreyMust19 следует убрать задержку, дабы не нарушать синхронизацию и сообщение отослалось(видимо далее какаято работа происходит, смотреть в сурцах там есть указанная функция.)
    Sol_Ksacap
    Пара кликов мышем в оле и не нужны никакие ядерные дебуггеры и дампы.
     
  13. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Приаттачься отладчиком к зависнувшему процессу и посмотри - что в нем происходит. Или включи лог с записью вызываемых API-функций.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AndreyMust19
    Верно, аттачь + бактрейс.
     
  15. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    [​IMG]

    А с какой версии Windows там этот пункт?
     
  16. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Мы таки скомпилили код из этих двух строчек, запустили, и... И ничего не висит, всё верно выполняется. Лол.

    zet
    Детектируй по UAC-иконке :)
    В XP sp2 ещё не было, в висте sp1 уже было.