n0name Нельзя, рекурсивный вызов получится. Таже InitRoutine но с другой причиной будет вызвана, когда модуль есчо не инициализирован. Освободить просто вручную: Код (Text): invoke RtlLeaveCriticalSection, addr LdrpLoaderLock Либо вызвать LdrUnlockLoaderLock(). Не пробовал, но думаю что нормально не отработает после этого. Сразу после освобождения критической секции загрузчик выполняет вызов очистку очереди потока, посредством доставки апк, если они есть в очереди(NtTestAlert), тоесть есчо до начала исполнения потоком кода, адрес которого указан как стартовый адрес потока(до исполнения NtContinue в KiUserApcDispatcher()) будет доставлена апк. Ставим в InitRoutine, когда вызов с причиной DLL_PROCESS_ATTACH апк в очередь и отпускаем поток обрабатывать лодер далее, после инициализации лоадера будет доставлена апк, но только для текущего треда, так как второй тред ждёт на симафоре в критической секции с запрещённой обработкой апк(Alertable = False), тоесть это ничего не даёт. Новый тред начинается с апк и первая - LdrInitializeThunk(), которую ядро ставит в очередь, тоесть пока не будет отработана эта, другая не будет доставлена, нативный тред ничего не даст, нет возможности указать регистр Eax для потока, который создан в остановленном состоянии(чистить очередь потока нет возможности). Обработка исключения это лучшее решение видимо, конечно можно сплайс выполнить, но это не катируется както..
2FED Пока главный тред не отработает(он будет держать крит. секцию лоадера), остальные в этой секции будут его ждать, тоесть пока основной поток не вернётся остальные не будут ничего выполнять.
Можно в начале DllMain создать поток и завершить DllMain а из созданного потока создать поток DllMain пропустив создание потока и завершение. Тем самым получаем работающий DllMain и другой поток. Вот тока нахера создавать в DllMain потоки и еб*ть моск. Скорее всего это какаято сущность, которая подгружается к приложению, которое её совсем не ждёт... Тогда будет проще в твоей DLL экспортировать функцию и пропатчить entrypoint подопытного для вызова этой заглушки. DLL подгружается и из неё вызывается функция, дальше всё как и должно было быть без неё.
punxer Например если при инициализации вызвать диалог выбора файла(GetOpenFileName() и тп), а функция создаёт несколько тредов, это приведёт к дедлоку, все потоки заблокируются и никакое окно не появится.
Clerk Знаю. На то она и нужна инициализаия... Думаю лучше на самом деле патчить исполняемый файл, что бы он вызвал фанкцию из DLL. ИМХО ,наверное, самый простой и оправданный подход из возможных.