Я свою dll прописываю в параметре AppInit_DLLs ключа HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows. В WinXP и Win Server 2003 она работает, а вот в w2k во время загрузки винды комп уходит в перезагруз. Код (Text): .386p option casemap:none .model flat, stdcall includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\gdi32.lib includelib C:\masm32\lib\advapi32.lib includelib C:\masm32\lib\dinput.lib includelib C:\masm32\lib\dxguid.lib includelib C:\masm32\lib\Uuid.Lib includelib C:\masm32\lib\oldnames.lib ;include C:\masm32\include\dinput.inc include C:\masm32\include\Windows.inc include C:\masm32\include\Kernel32.inc include C:\masm32\include\gdi32.inc include C:\masm32\include\advapi32.inc include C:\masm32\include\user32.inc ;include C:\masm32\include\winuser.INC include \masm32\Macros\Strings.mac extrn DirectInputCreateA@16:near .data trak db "C:\Program Files\NaturalPoint\TrackIR5\TrackIR5.exe",0 lpdi dd 0 regi db 0 .CODE DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD local acModulePath[MAX_PATH]:CHAR .if reason == DLL_PROCESS_ATTACH invoke GetFullPathName, 0, sizeof acModulePath, addr acModulePath, 0 push ebx push ecx xor eax,eax xor ebx,ebx xor ecx,ecx lea eax,trak lea ebx,acModulePath buk: mov cl,[eax] cmp cl,0 je prod mov ch,[ebx] inc eax inc ebx cmp cl,ch je buk pop ecx pop ebx cmp regi,1 jne yyyy push 0 push offset lpdi push 0500h push hInstDLL call DirectInputCreateA@16 jmp yyyy prod: mov regi,1 pop ecx pop ebx yyyy: .endif mov eax,TRUE ret DllEntry Endp End DllEntry Почему?
1) Загрузи систему в режиме "нет автоматической перезагрузки ...." - жмешь F8 в момент загрузки и выбираешь. Будет синий экран и там увидишь. Возможно в 2000-м этот режим в другом месте включается - я давно уже 2000-й забросил. 2) Сначала проверь работу своей DLL без внедрения во все процессы - может что и увидишь.
Я выяснил что перезагрузка происходит из-за mov eax, TRUE, а остальной код даже не важен, причём BSOD`а нет. комп просто перезагружается. Почему?
Это что, запретная инструкция для Win2k ? Думаю, как раз mov eax, TRUE не при чём, а остальной код и является проблемой. Иначе винда просто бы не загружалась от того количества mov eax, TRUE, которые выполняются процессором.
а что это за вызов GetFullPathName с первым нулевым параметром? в мсдне об этом ничего не написано. Это типа пародия на GetModuleFileNameA? бред какой-то))
Так я сегодня это и проверял Код (Text): DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD local acModulePath[MAX_PATH]:CHAR mov eax,TRUE ret DllEntry Endp End DllEntry Всё. Перезагрузка. В XP и в WIN SEVRER 2003 это работает
mov eax,TRUE всего лишь установка индикатора ошибки и означает, что dll успешно выполнила необходимую для её работы начальную инициализацию и теперь будет доступна как источник исполняемого кода. Если что-то в процессе загрузки/инициализации пошло не так, и возникли ошибки, надо вернуть в еах ноль, чтобы система выгрузила некорректно работающий модуль. Ошибка не в mov eax,TRUE, а в том что модуль твой некорректно работает, может собран без учёта особенностей win2k, может в нем есть код, который в хр работает, а в win2k - нет. Гадать можно долго. Бери Олю за хобот и вперед на мины
Llirik 1) Для начала, убедитесь, что ваша длл вообще работает под 2000 - внедрите ее в какой-нить процесс под 2000 (тут как раз Олю можно подключить) другим способом 2) Приведите таблицу импорта этой длл - чего она там требует? Т.к. длл, загружаемые через AppInit_DLLs проецируются на АП сразу после user32.dll, то какие-то библиотеки могут быть и недоступны... DirectInputCreate - это вроде ком-итерфейс... а dll грузится во все процессы (и в системные на ранних стадиях загрузки) - может ком еще не инициализирован системой(??)
Llirik Working with the AppInit_DLLs registry value А твоя длл-ка не только сама лезет в early loading, но тащит за собой 100кг другого "хлама", нарушая таким образом нормальный порядок инициализации dll. Вообще не понятно, как мелкософты додумались юзать LoadLibrary при инициализации user32.dll, хотя сами же предупреждают о возможных последствиях DllMain Entry Point
Я добавил Код (Text): yyyy: [b]ret[/b] .endif mov eax,TRUE ret и комп перезагружаться перестал, но DirectInputCreate в вин2000 почему-то не работает(
Llirik Ну вам же leo практически на блюдечке выложил все, что надо. Можно я поработаю переводчиком с русского на русский? Вся проблема в том, что у вас в длл статически слинкован ряд вызовов АПИ. А безпроблемно (в AppInit-библиотеках) возможно использовать функции только из kernel32. Поэтому перекомпилируйте с LoadLibrary все, что наваяли. И я не о инициализации, а о всем остальном, что есть в вашей длл. Проблема не в вашей процедуре инициализации - проблема в том, что автоматом инициализируется еще куча длл, и это как раз и вешает/крашит систему.