Здравствуйте. код гдавной функции библиотеки: Код (Text): ... invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,offset SubKey,0,KEY_QUERY_VALUE,offset hKey invoke RegQueryInfoKey, hKey,0,0,0,0,0,0,0,0,offset hValue,0,0 invoke RegCloseKey,hKey invoke GetLocalTime,addr systime mov dateaddr, eax loop1: invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,offset SubKey,0,KEY_CREATE_SUB_KEY or KEY_SET_VALUE,offset hKey .if eax == ERROR_SUCCESS invoke RegSetValueEx,hKey,offset RegValue,0,REG_DWORD,offset szBuffer3,DWORD .endif invoke RegCloseKey,hKey .if ;условие.... jmp loop1 .endif invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,offset SubKey,0,KEY_CREATE_SUB_KEY or KEY_SET_VALUE,offset hKey .if eax == ERROR_SUCCESS invoke RegSetValueEx,hKey,offset RegValue,0,REG_DWORD,offset szBuffer,DWORD .endif invoke RegCloseKey,hKey ;invoke Sleep,1000 jmp loop1 При загрузке компьютера загружается эта библиотека и комп. зависает. Если этот код использовать не в библиотеке, а в exe'шнике, то всё нормально работает. В чем может быть проблема? С уважением, Илья
Конечно виснет, выже поток не отпускаете из цикла, при подгрузке вашего модуля к системному процессу он не может дальше отработать. Нужно тред создать и в нём чёрные дела делать. А так вобщем не делается. Нужно ждать изменение на сервисе(NtNotifyChangeKey/NtNotifyChangeMultipleKeys), либо в апи RegNotifyChangeKeyValue(), затем когда оно произошло писать реестр.
Наверное, я что-то не так делаю... Вот новый код: Нужно, что бы проверка на неизменность ключа была постоянно, но если ее поручать треду, то главня функция его запустит и перейдет к ret, и всё будет завершено, т.е. в любом случае, главная функция не должна никогда завершаться. Я так понимаю... Когда эту библиотеку регистрирую в автозапуске, то она запускается (без перезагрузки системы). Но нельзя запустить ни одно приложение (в т.ч. regedit) и нормально перезагрузить компьютер. Только если из "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" удалить эту библиотеку заранее написанной для этого программой, то система восстанавливает работоспособность и выше приведеннй код нормально работает(т.е. я изменяю ключ реестра, который библиотека контролирует и он тут же меняется обратно). Но если опять просто вписать в "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" имя библиотеки, то комп вешается и возобнавляет работоспособность только после удаления из AppInit_DLLs имени библиотеки специальной программой для этого. (Т.к. regedit опять отказывается запускаться, как и любая другая программа, кроме Explorer'а, т.е. мой компьтер) Старался как можно более подробно изложить суть проблемы. Скажите, пожалуйста, чем может быть вызвана такая реакция на рапись в AppInit_DLLs (всё происходило даже без перезагрузки)?
Наверное из-за того, что библиотеки из AppInit_DLLs подгружаются ко всем приложениям, использующим User32.dll Не досмотрел...
Сказал ведь, поток создай который будет крутится в цикле этом, а главный тред продолжит исполнение загрузчика.
Сделал. Для проверки в тред написал: Код (Text): invoke MessageBox,NULL,$CTA0("TEST"),$CTA0("TEST"),MB_OK ;invoke ExitThread,NULL ret Теперь приложение загружается (например calc.exe), но в это же время вылезает бесконечное множество MessageBox'ов - помогает только перезагрузка. В главном процессе нет цикла, только: Код (Text): invoke CreateThread,NULL,NULL,offset SetReg,0,0,ADDR ThreadID invoke CloseHandle,eax ret Почему идет бесконечный цикл и как вырубить этот тред?
Либа ко всем GUI-процессам грузится, разумеется нужно определить что модуль уже был загружен к другому процессу. Напимер атом создай, или эвент именованный и чекай его.
Помоему из аппинит грузится к новым процессам. Сомневаюь что у него процессы бесконечно создаются, наверное где-то в коде напорол))
Посмотрите, может что-то в коде? Код (Text): DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD invoke GetModuleFileName,NULL,offset szBufferHost,64 invoke lstrlen,offset szBufferHost invoke CharLowerBuff,offset szBufferHost,eax invoke StrStr,offset szBufferHost,offset szHost ;поиск подстроки "\calc.exe" .if eax mov eax,offset SetReg invoke CreateThread,NULL,NULL,eax,0,0,ADDR ThreadID invoke CloseHandle,eax .endif ret DllEntry Endp SetReg proc USES ecx param:DWORD invoke MessageBox,NULL,$CTA0("TEST"),$CTA0("TEST"),MB_OK ret SetReg endp При запуске калькулятора вылазят сообщения без остановки...
Это ты специально так оптимизировал ?)) Просто мне это кажется немного запутанным и ненаглядным... Во-первых добавь что-то вроде mov eax,reason cmp eax, DLL_PROCESS_ATTACH jz some_proc т.е. обрабатывай нормально атач и детач. Твои действия должны производится на атаче. и возвращай TRUE вконце DllMain если все прошло успешно.
Добавил: Код (Text): mov eax,reason ;без этого cmp eax, DLL_PROCESS_ATTACH ;множество раз выполнялся поток jnz exit_dll ... mov eax,offset SetReg invoke CreateThread,NULL,NULL,eax,0,0,ADDR ThreadID invoke CloseHandle,eax ... exit_dll: xor eax,eax ;без этого inc eax ;вылезала ошибка ret и всё пошло как надо Всем спасибо, очень помогли.
Блин...ты бы хоть документацию прочитал, особенно про ф-цию DllMain и о том что она должна возвращать. exit_dll у тебя делает не то что надо, когда возвращаешь TRUE длл остается в памяти процесса, когда FALSE - выгружается, что и надо тебе в данном случае. А у тебя она всегда в памяти остается.
Уже прочитал . Добавил обработку DLL_PROCESS_DETACH Всё примеры библиотек искал, а документацию сразу не додумался прочитать. Стыдно...