Самовольная выгрузка длл из процесса explorer.exe

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

  1. daddyru

    daddyru New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2006
    Сообщения:
    12
    Доброе время суток!
    Если прописать сюда HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad свою длл, наблюдаю странную картину.
    После перезагрузки, она подгружается в explorer.exe, висит в нем некоторое время(примерно 3 минуты), а после насильно почему-то выгружается из этого процесса.
    Сама длл в ф-ии DllMain имеет такой код:
    Код (Text):
    1.            char moduleName[MAX_PATH];
    2.     BOOL bExpFlag=false;
    3.            g_hInst=hInstance;
    4.     GetModuleFileName(NULL,moduleName,MAX_PATH);   
    5.     strlwr(moduleName);
    6.    
    7.            if (strstr(moduleName,"explorer.exe")!=NULL) bExpFlag=true;
    8.          //char szReason[500];
    9.          //sprintf(szReason,"reason=%d,module=%s",dwReason,moduleName);
    10.          //MessageBox(NULL,szReason,"app",MB_OK);
    11.  
    12.             if (dwReason == DLL_PROCESS_ATTACH)
    13.             {
    14.        
    15.                 if (bExpFlag) {
    16.                     UINT uID;
    17.                     HANDLE hTh;
    18.                     hTh=(HANDLE)_beginthreadex(NULL,0,SomeThread,(void*)0,0,&uID);
    19.                     CloseHandle(hTh);
    20.                 }      
    21.                 _Module.Init(ObjectMap, hInstance, &LIBID_PPCLib); // модуль также выступает как КОМ объект
    22.                 DisableThreadLibraryCalls(hInstance);
    23.              }
    24.             else if (dwReason == DLL_PROCESS_DETACH){
    25.                 _Module.Term();
    26.     }
    27.            return TRUE;    // ok
    Ф-я SomeThread проста:
    Код (Text):
    1. unsigned WINAPI SomeThread(void*p){
    2.    Sleep(INFINITE);
    3. }
    Кто-то может прояснить сию ситуацию? Возможен ли вариант, что оболочка выгружает ненужные (те что не имеют активности определенное время) модули? Или я напортачил в коде что-то?
     
  2. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    как вариант создайте невидимое окно и, пока будет крутится оконная процедура, эксплорер её не выгрузит
     
  3. daddyru

    daddyru New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2006
    Сообщения:
    12
    В общем если создать невидимое окно НЕ В ПОТОКЕ, десктоп зависает. Если создать в потоке и крутить цикл его сообщений, - повторяется то же самое - примерно 5 минут и длл моя выгружается. Кто-нибудь еще сталкивался с таким поведением?
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Интересно, а где же тогда создается окно? ;)
     
  5. _s4

    _s4 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    58
    Немного не в тему, но проблема тоже связана с explorer.exe и с самодеятельностью! системы связанной с ним... Я когда заменяю его своим файлом, то через какое то время он восстанавливается... ни кто не знает, с чем это может быть связано ? Есть небольшая идея занять его(мой файл)(например открыть из другого процесса), чтобы система не смогла его удалить.
    daddyru может бред, но может он засёк что твой тред выполняет бесполезную работу :) ? К стати останавливается тред или именно библиотека выгрудается (Выполняется обработка DLL_PROCESS_DETACH) ?
     
  6. daddyru

    daddyru New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2006
    Сообщения:
    12
    Twister
    Собственно окошко можно в потоке создать и сразу запустить в этой ф-ии потока цикл сообщений. А можно создать сразу в DllMain, без потока. Если бы мне потребовалось создать свой exe модуль и в нем окошко создать, - то тогда потоки создавать не нужно, а сразу в WinMain окно создать и цикл запустить... Не понятно, почему именно так explorer.exe подгружает с ветки ShellServiceObjectDelayLoad длл-ки, что они в обязательном порядке требуют потока при условии наличия окошка и его цикла мессаджей. Почему-то бы ему не позаботиться о том, чтобы каждую длл в отдельном потоке грузить...
    _s4
    Вот именно по прошествии некоторого времени посылается DLL_PROCESS_DETACH.
    По поводу бесполезной работы - ну тут спорный вопрос. Моя длл в потоке в бесконечном цикле ожидает нотификаций от реестра (ф-я RegNotifyChangeKeyValue). Для меня это полезная работа, а какой ее считает оболочка - тут надо дяди Билла спросить :)

    пс. Вот те модули, которые по умолчанию подгружены через упомянутый ключ реестра, как то: stobject.dll, shell32.dll, webcheck.dll - они висят и не выгружаются :))))