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

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

  1. vobbs

    vobbs New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    20
    Проблема такая:

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

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

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

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

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

    Код (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

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

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

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Ну проблема классическая. И Ваши предположения верны. Внутри 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

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    20
    Глянем, спасибо за совет.

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

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    vobbs
    Да, как раз - раз на раз не приходиться, будет просто не стабильности, о чем нас вежливо предупреждает DllMain / Remarks.
    Код (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

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    20
    Понял, вопрос закрыт, всем спасибо :)

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

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Не говоря уже о том что выводить MessageBox из сервисов можно только передав специальный флаг.
     
  8. _DEN_

    _DEN_ DEN

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

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

    vobbs New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    20
    Что за сурпрыз, если не секрет ? =)
     
  10. vobbs

    vobbs New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    20
    Что за флаг ? Можно по-подробнее чуть-чуть ? =)
     
  11. _DEN_

    _DEN_ DEN

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

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

    vobbs New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    20
    Ну вот в ХР походу примерно тоже... Без каких-то флагов не пашет... Но вобщем-то не в гуях дело =) они и не очень-то нужны...