Порядок инициализации подсистем Windows.

Discussion in 'WASM.WIN32' started by vobbs, Dec 8, 2007.

  1. vobbs

    vobbs New Member

    Blog Posts:
    0
    Проблема такая:

    Есть код, вызывающий messagebox, к примеру. Этот код находится в моей ДЛЛ. Моя ДЛЛ прописана в импорт к ДЛЛ, используемой lsass.exe... Тоесть при загрузке этого процесса должна загружаться моя ДЛЛ и выводить мессагу.

    При загрузке системы вылетает ошибка 0xc0000005 в lsass.exe и все падает...

    Если вызвать через rundll32 функцию из моей ДЛЛ(есть там одна - просто заглушка), то происходит загрузка ДЛЛ, используемой lsass.exe, загрузка моей ДЛЛ и появляется окошко с мессагой...

    Тоесть импорты прописаны правильно, файлы не битые...

    Может ли быть проблема в том, что к моменту старта lsass.exe еще нельзя использовать API функции ?
    Пример:

    Code (Text):
    1. ULONG (__stdcall *MessageBx)(   IN HWND  KeyHandle, IN LPCTSTR  txt, IN LPCTSTR  cap, IN UINT  Type );
    2. ...
    3. if (ul_reason_for_call==DLL_PROCESS_ATTACH)
    4. {
    5.     HMODULE hLib = LoadLibrary("USER32.DLL");
    6.     MessageBx = (ULONG (__stdcall *)(HWND, LPCTSTR, LPCTSTR, UINT ))GetProcAddress(hLib, "MessageBoxA");
    7.     MessageBx(NULL, "Welcome!", "Message", MB_OK);
    8. }
    Подскажите куда копать...
     
  2. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    vobbs

    Попробуй посмотреть, что находится по адресу MessageBx...
     
  3. Mental_Mirror

    Mental_Mirror New Member

    Blog Posts:
    0
    Ну проблема классическая. И Ваши предположения верны. Внутри DllMain при DLL_PROCESS_ATTACH разрешено использовать только Kernel32.dll функции, т.к. эта библиотека гарантированна будет загружена при загрузке Вашей DLL. Ну еще естественно NTDLL.DLL, хотя ее использовать официально не поощряется. По этому поводу советую почитать MSDN - DllMain секция Remarks, вот кусочек оттуда:
    It is safe to call other functions in Kernel32.dll, because this DLL is guaranteed to be loaded in the process address space when the entry-point function is called. It is common for the entry-point function to create synchronization objects such as critical sections and mutexes, and use TLS. Do not call the registry functions, because they are located in Advapi32.dll. If you are dynamically linking with the C run-time library, do not call malloc; instead, call HeapAlloc.

    Более того, вызывать LoadLibrary из DLL_PROCESS_ATTACH также явно запрещается, т.к. это может нарушить последовательсть инициалицации динамических модулей и вызывать взаимные блокировки. Решением видиться создание потока при DLL_PROCESS_ATTACH, который будет ждать проверяя некоторые условия и после этого уже вызывать любые функции, которые ему нравятся.
     
  4. vobbs

    vobbs New Member

    Blog Posts:
    0
    Глянем, спасибо за совет.

    Mental_Mirror
    Большое спасибо за столь развернутый ответ. Но тогда не совсем понятно, почему это работает при вызове через rundll32... Или просто раз на раз не приходится ?
     
  5. Mental_Mirror

    Mental_Mirror New Member

    Blog Posts:
    0
    vobbs
    Да, как раз - раз на раз не приходиться, будет просто не стабильности, о чем нас вежливо предупреждает DllMain / Remarks.
    Code (Text):
    1. The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order.
    may, а может и не may =) Фсе я в баню парица)
     
  6. vobbs

    vobbs New Member

    Blog Posts:
    0
    Понял, вопрос закрыт, всем спасибо :)

    П.С. Баня, пожалуй, единственное место, где можно ПАРИТЬСЯ с удовольствием :)
     
  7. tylerdurden

    tylerdurden New Member

    Blog Posts:
    0
    Не говоря уже о том что выводить MessageBox из сервисов можно только передав специальный флаг.
     
  8. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    vobbs

    Кстати, даже если ты и научишся запускать MessageBox из сервиса, то всеравно, в висте тебя ждет неприятный сурпзыз)))
     
  9. vobbs

    vobbs New Member

    Blog Posts:
    0
    Что за сурпрыз, если не секрет ? =)
     
  10. vobbs

    vobbs New Member

    Blog Posts:
    0
    Что за флаг ? Можно по-подробнее чуть-чуть ? =)
     
  11. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    vobbs

    В висте процессы, гуляющие в нулевой сессии, не имеют доступа к гуям.
     
  12. vobbs

    vobbs New Member

    Blog Posts:
    0
    Ну вот в ХР походу примерно тоже... Без каких-то флагов не пашет... Но вобщем-то не в гуях дело =) они и не очень-то нужны...