Аттач к exe-шнику

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 14 фев 2006.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Есть A.exe и B.exe.

    B.exe содержит таблицу экспорта.

    Запускаем A.exe.

    A.exe вызывает CreateProcess и запускает B.exe

    A.exe вызывает LoadLibrary c параметром B.exe



    А теперь вопрос. Как сделать так, чтобы инстанц B.exe не продублировался, а взялся уже существующий?
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    - ты же запустил B.exe - у него теперь свой процесс и он выполняется с его родной базой

    - потом в свой процесс ты мапишь B.exe, можно сказать просто прочитал файл к себе, тут база у него может быть любая свободная



    Как понимать продублирование инстанца?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан




    Чтобы B.exe не мапился второй раз в память, а взялся от уже отмапленного exe-шника, т.е. чтобы HINSTANCE B.exe был равен HMODULE B.exe
     
  4. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    АП разные будут. А мапить надо в конкретное АП.

    А вообще как родился такой интересный вопрос? Зачем поставлена такая цель?
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Bill_Prisoner







    Это ясен болт. Вот и интересно, как их в одно пространство замапить.







    Интересно посмотреть на поведение просесса, когда у него снаружи будут дергать экспортируемые функции. Сначала хотелось таким образом управлять процессом, но чувствую будет гемор с синхронизацией. Вобщем, как это часто бывает, надобность отпала, но вопрос остался :)
     
  6. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    _DEN_





    Так зделать невозможно, т.к. для нового процесса создается новое адресное пространство.
     
  7. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Попробуй так, может и выйдет:

    1)A.exe вызывает LoadLibrary c параметром B.exe

    2)создаёшь поток с точкой входа в уже промапленом B.exe.

    Правда косяков всяких возникнуть может.
     
  8. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Гм. Раз вопрос немного исказили. Будем говорить о траблах метода asd:

    1) CreateProcess может запускать программу любой подсистемы, а здесь только для подсистемы win32

    2) АП пространство процесса будет более узкое из-за модулей A.exe

    3) Траблы с приоритетами процесса.

    4) Если B.exe - консольное приложение, то оно не появиться автоматически. Его придеться создавать вручную.

    5) Параметры командной строки отменяются.

    6) Нормальная работа GetModuleHandle(NULL) отменяеться.

    7) Переменные окружения отменяються. Они будут, но совместное использование переменных не желательно.

    8) Функции требующие hProcess обламываются.

    9) Размер стека потока для B.exe может отличаться от размера стека потока A.exe.

    10) релоков в большинстве exe сейчас нету, а в данном случае b.exe промэппиться точно не по базовому адресу. Крах обеспечен.

    11) CreateWindow обломиться т.к. она требует hInstance, а hInstance получается с помощью вызова GetModuleHandle(смотри 6).



    Это только то что сразу пришло в голову, а если смотреть более подробно, то...
     
  9. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Ну, для конкретного случая может и подойти.

    7)Ладно окружение, без него можно и обойтись, а вот переменные в В.ехе

    10)А вот про релоки интересно: если В.ехе будет что-либо экспортировать, то не вставит ли компилятор релоки автоматически.
     
  10. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    asd

    Смотря какой компилер, но все таки это очень зависит от самой проги B.exe и ее создателя. Если он захочет вставить релоки, то он их вставит.



    Если есть конечно цель, создать именно такую прогу, то это подойдет, но в большинстве случает будет оболом.
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    А может просто DllMain B.exe будет делать jmp на WinMain B.exe ? :))
     
  12. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    _DEN_

    Можно то можно, но все проблемы остануться.

    Это как говориться - "грибы можно есть все, но только некоторые один раз в жизни".
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Bill_Prisoner



    Ну какие проблемы тут будут с HINSTANCE? Один хрен он будет на MZ указывать?
     
  14. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    _DEN_

    Очень просто. Есть функция GetModuleHandle. Передаем ей параметр NULL. Это означаем что мы получем описатель модуля из которого вызывается функция. НО при вызове ее из DLL которой является B.exe(DLL - потому что мы загружаем ее через LoadLibrary) функция возвращет адрес A.exe, а yt адрес B.exe. А MZ-то полюбому будет.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Bill_Prisoner



    Ну это да.
     
  16. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Совсем не уверен, но возможно так:

    CreateProcess ("b.exe",...);

    GetModuleHandle ("b.exe");
     
  17. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    _DEN_

    Ну какие проблемы тут будут с HINSTANCE?

    Ну если тебя только эта проблема занимает, то тут решение просто. Вместо GetModuleHandle находи базу ручками.
     
  18. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    dr_dred

    Так не прокатит. Учи матчасть.
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Хмм... А что будет если в DllMain по PROCESS_ATTACH создать поток, который не будет завершен по выходу из DllMain? Всмысле, какая дальнейшая судьба потока?
     
  20. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    _DEN_

    Поток созданный в DllMain как правило начнет выполнятся (а стало быть и сможет завершится) после выхода из DllMain. Уникальный в своем роде трабл, его надо учитывать при написании внутрипроцессных серверов. Например попытка "подождать" такой поток с помощью Wait функции приведет к таймауту ожидания или вечному ожиданию.