Проблема такая: Есть код, вызывающий messagebox, к примеру. Этот код находится в моей ДЛЛ. Моя ДЛЛ прописана в импорт к ДЛЛ, используемой lsass.exe... Тоесть при загрузке этого процесса должна загружаться моя ДЛЛ и выводить мессагу. При загрузке системы вылетает ошибка 0xc0000005 в lsass.exe и все падает... Если вызвать через rundll32 функцию из моей ДЛЛ(есть там одна - просто заглушка), то происходит загрузка ДЛЛ, используемой lsass.exe, загрузка моей ДЛЛ и появляется окошко с мессагой... Тоесть импорты прописаны правильно, файлы не битые... Может ли быть проблема в том, что к моменту старта lsass.exe еще нельзя использовать API функции ? Пример: Код (Text): ULONG (__stdcall *MessageBx)( IN HWND KeyHandle, IN LPCTSTR txt, IN LPCTSTR cap, IN UINT Type ); ... if (ul_reason_for_call==DLL_PROCESS_ATTACH) { HMODULE hLib = LoadLibrary("USER32.DLL"); MessageBx = (ULONG (__stdcall *)(HWND, LPCTSTR, LPCTSTR, UINT ))GetProcAddress(hLib, "MessageBoxA"); MessageBx(NULL, "Welcome!", "Message", MB_OK); } Подскажите куда копать...
Ну проблема классическая. И Ваши предположения верны. Внутри 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, который будет ждать проверяя некоторые условия и после этого уже вызывать любые функции, которые ему нравятся.
Глянем, спасибо за совет. Mental_Mirror Большое спасибо за столь развернутый ответ. Но тогда не совсем понятно, почему это работает при вызове через rundll32... Или просто раз на раз не приходится ?
vobbs Да, как раз - раз на раз не приходиться, будет просто не стабильности, о чем нас вежливо предупреждает DllMain / Remarks. Код (Text): 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 =) Фсе я в баню парица)
Понял, вопрос закрыт, всем спасибо П.С. Баня, пожалуй, единственное место, где можно ПАРИТЬСЯ с удовольствием
vobbs Кстати, даже если ты и научишся запускать MessageBox из сервиса, то всеравно, в висте тебя ждет неприятный сурпзыз)))
Ну вот в ХР походу примерно тоже... Без каких-то флагов не пашет... Но вобщем-то не в гуях дело =) они и не очень-то нужны...