Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2011, 19:53   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Точка входа. DllEntryPoint, _DllMainCRTStartup, _CRT_INIT

Доброго времени суток Уважаемые эксперты. В такую задницу залез, реально потерялася я. Вычитал что предпочтительнее использовать _DllMainCRTStartup нежели DllEntryPoint так как ее конструкторы автоматом инициализируют что-то там в _CRT_INIT. Ладно, это все конечно круто, но находятся ли они вообще в какой-то библиотеки или нет, эти функции, данные такие как __proc_attached, _pRawDllMain?
_СRT_INIT(...) вообще никак не определяется, вообщем undefined.
Нашел на сайте пример использования, но локальные переменные меня убивают, с какой (_O_) они по вылазили, в примере были подключаемые библиотеки, но не в одной из них нет никаких флагов __proc_attached и прочей дребедени.
Кто сталкивался, будьте добры, подскажите как вообще этим управлять, я декомпилирую один *.dll файл, там используется DllEntryPoint, я собственно буду придерживаться рядом с тем что в *.dll но хотелось бы и с _DllMainCRTStartup посмотреть как будет выглядеть это.
Вообщем если кому не трудно, приведите рабочий код процедуры этой самой точки входа, за ранее благодарю за предоставленную помощь.


Код:
BOOL WINAPI _DllMainCRTStartup(
        HANDLE  hDllHandle,
        DWORD   dwReason,
        LPVOID  lpreserved
        )
{
    BOOL retcode = TRUE;

    /*
     * If this is a process attach notification, increment the process
     * attached flag. If this is a process detach notification, check
     * that there has been a prior process attach notification.
     */
    if ( dwReason == DLL_PROCESS_ATTACH )
        __proc_attached++;
    else if ( dwReason == DLL_PROCESS_DETACH ) {
        if ( __proc_attached > 0 )
            __proc_attached--;
        else
            /*
             * no prior process attach notification. just return
             * without doing anything.
             */
            return FALSE;
    }

    if ( dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_THREAD_ATTACH )
    {
        if ( _pRawDllMain )
            retcode = (*_pRawDllMain)(hDllHandle, dwReason, lpreserved);

        if ( retcode )
            retcode = _CRT_INIT(hDllHandle, dwReason, lpreserved);
    }

    if ( retcode )
        retcode = DllMain(hDllHandle, dwReason, lpreserved);

    if ( dwReason == DLL_PROCESS_DETACH || dwReason == DLL_THREAD_DETACH )
    {
        if ( _CRT_INIT(hDllHandle, dwReason, lpreserved) == FALSE )
            retcode = FALSE ;

        if ( retcode && _pRawDllMain )
            retcode = (*_pRawDllMain)(hDllHandle, dwReason, lpreserved);
    }

    return retcode ;
}

Последний раз редактировалось coNsept; 23.07.2011 в 19:59.
coNsept вне форума Ответить с цитированием
Старый 23.07.2011, 21:51   #2
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

эти точки входа скорее всего сгенерирован автоматически, поэтому собственно какой вам интерес, ведь код самой dll скорее всего начинается в DllMain
?
alex_x_x вне форума Ответить с цитированием
Старый 23.07.2011, 21:58   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Эти точки можно генерировать в ручную, в коде одной из *.dll (строки выделил красным цветом) она передает 3 параметра уже DllMain.

Цитата:
PUSH EDI = 0;
PUSH ESI = 1;
PUSH EBX = 06000000;
~DLLEntryPoint
Код:
06009B81 >/$  55            PUSH EBP
06009B82  |.  8BEC          MOV EBP,ESP
06009B84  |.  53            PUSH EBX
06009B85  |.  8B5D 08       MOV EBX,[ARG.1]
06009B88  |.  56            PUSH ESI
06009B89  |.  8B75 0C       MOV ESI,[ARG.2]
06009B8C  |.  57            PUSH EDI
06009B8D  |.  8B7D 10       MOV EDI,[ARG.3]
06009B90  |.  85F6          TEST ESI,ESI
06009B92  |.  75 09         JNZ SHORT opengl33.06009B9D
06009B94  |.  833D 24F80006>CMP DWORD PTR DS:[600F824],0
06009B9B  |.  EB 26         JMP SHORT opengl33.06009BC3
06009B9D  |>  83FE 01       CMP ESI,1
06009BA0  |.  74 05         JE SHORT opengl33.06009BA7
06009BA2  |.  83FE 02       CMP ESI,2
06009BA5  |.  75 22         JNZ SHORT opengl33.06009BC9
06009BA7  |>  A1 2CF80006   MOV EAX,DWORD PTR DS:[600F82C]
06009BAC  |.  85C0          TEST EAX,EAX
06009BAE  |.  74 09         JE SHORT opengl33.06009BB9
06009BB0  |.  57            PUSH EDI
06009BB1  |.  56            PUSH ESI
06009BB2  |.  53            PUSH EBX
06009BB3  |.  FFD0          CALL EAX
06009BB5  |.  85C0          TEST EAX,EAX
06009BB7  |.  74 0C         JE SHORT opengl33.06009BC5
06009BB9  |>  57            PUSH EDI
06009BBA  |.  56            PUSH ESI
06009BBB  |.  53            PUSH EBX
06009BBC  |.  E8 15FFFFFF   CALL opengl33.06009AD6
06009BC1  |.  85C0          TEST EAX,EAX
06009BC3  |>  75 04         JNZ SHORT opengl33.06009BC9
06009BC5  |>  33C0          XOR EAX,EAX
06009BC7  |.  EB 4E         JMP SHORT opengl33.06009C17
06009BC9  |>  57            PUSH EDI                                 ; /Arg3
06009BCA  |.  56            PUSH ESI                                 ; |Arg2
06009BCB  |.  53            PUSH EBX                                 ; |Arg1
06009BCC  |.  E8 FFA8FFFF   CALL opengl33.060044D0                   ; \opengl33.060044D0
06009BD1  |.  83FE 01       CMP ESI,1
06009BD4  |.  8945 0C       MOV [ARG.2],EAX
06009BD7  |.  75 0C         JNZ SHORT opengl33.06009BE5
06009BD9  |.  85C0          TEST EAX,EAX
06009BDB  |.  75 37         JNZ SHORT opengl33.06009C14
06009BDD  |.  57            PUSH EDI
06009BDE  |.  50            PUSH EAX
06009BDF  |.  53            PUSH EBX
06009BE0  |.  E8 F1FEFFFF   CALL opengl33.06009AD6
06009BE5  |>  85F6          TEST ESI,ESI
06009BE7  |.  74 05         JE SHORT opengl33.06009BEE
06009BE9  |.  83FE 03       CMP ESI,3
06009BEC  |.  75 26         JNZ SHORT opengl33.06009C14
06009BEE  |>  57            PUSH EDI
06009BEF  |.  56            PUSH ESI
06009BF0  |.  53            PUSH EBX
06009BF1  |.  E8 E0FEFFFF   CALL opengl33.06009AD6
06009BF6  |.  85C0          TEST EAX,EAX
06009BF8  |.  75 03         JNZ SHORT opengl33.06009BFD
06009BFA  |.  2145 0C       AND [ARG.2],EAX
06009BFD  |>  837D 0C 00    CMP [ARG.2],0
06009C01  |.  74 11         JE SHORT opengl33.06009C14
06009C03  |.  A1 2CF80006   MOV EAX,DWORD PTR DS:[600F82C]
06009C08  |.  85C0          TEST EAX,EAX
06009C0A  |.  74 08         JE SHORT opengl33.06009C14
06009C0C  |.  57            PUSH EDI
06009C0D  |.  56            PUSH ESI
06009C0E  |.  53            PUSH EBX
06009C0F  |.  FFD0          CALL EAX
06009C11  |.  8945 0C       MOV [ARG.2],EAX
06009C14  |>  8B45 0C       MOV EAX,[ARG.2]
06009C17  |>  5F            POP EDI
06009C18  |.  5E            POP ESI
06009C19  |.  5B            POP EBX
06009C1A  |.  5D            POP EBP
06009C1B  \.  C2 0C00       RET 0C

Последний раз редактировалось coNsept; 23.07.2011 в 22:06.
coNsept вне форума Ответить с цитированием
Старый 23.07.2011, 22:08   #4
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

все равно
Код:
BOOL WINAPI DllMain(
  __in  HINSTANCE hinstDLL,
  __in  DWORD fdwReason,
  __in  LPVOID lpvReserved
);
PUSH EDI = 0; // lpvReserved
PUSH ESI = 1; // fdwReason - DLL_PROCESS_ATTACH - загрузка dll
PUSH EBX = 06000000; // hinstDLL - дескриптор dll

не вижу ничего криминального - обычная загрузка
alex_x_x вне форума Ответить с цитированием
Старый 23.07.2011, 22:17   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Считаешь что ими нельзя никак манипулировать?
coNsept вне форума Ответить с цитированием
Старый 23.07.2011, 22:29   #6
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

а для какой цели?
однако стандартный код точки входа есть в
*/Microsoft Visual Studio *.*/VC/crt/src/crtdll.c
alex_x_x вне форума Ответить с цитированием
Старый 23.07.2011, 22:31   #7
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

crt в студии идет с открытым кодом
alex_x_x вне форума Ответить с цитированием
Старый 23.07.2011, 22:50   #8
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Интересно, я вот сейчас кое что проверил и заметил такую вещчь интересную.
*.dll что я декомпилирую начинает свое выполнение с точки DllEntryPoint
Скомпилил свою *.dll она начинает работу с _CRT_INIT(...)
Почему так?
coNsept вне форума Ответить с цитированием
Старый 23.07.2011, 22:59   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

наверно потому что они компилировались с разными настройками.

да и вне вашей ДЛЛ вы просто можете и не знать что есть что...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.07.2011, 22:59   #10
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

судя по коду _CRT_INIT из __DllMainCRTStartup, а та из _DllMainStartup
думаю просто символов нету
alex_x_x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форма входа Ucoz makar3000 HTML и CSS 10 13.01.2011 00:32
Не найдена точка входа в DLL, не могу разобраться Ozerich Qt и кроссплатформенное программирование С/С++ 4 21.04.2010 19:46
Точка входа CheckForReadOnlyResource не найдена Goodwin98 Операционные системы общие вопросы 3 03.03.2010 16:51
DLLentrypoint в Delphi Horus92 Общие вопросы Delphi 23 29.11.2009 14:04
не найдена точка входа. Черничный Общие вопросы Delphi 17 23.07.2008 11:54