Вылет Win2000 при загрузке моей DLL

Тема в разделе "WASM.WIN32", создана пользователем Llirik, 17 апр 2011.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я свою dll прописываю в параметре AppInit_DLLs ключа HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows. В WinXP и Win Server 2003 она работает, а вот в w2k во время загрузки винды комп уходит в перезагруз.
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\kernel32.lib
    5. includelib  C:\masm32\lib\user32.lib
    6. includelib  C:\masm32\lib\gdi32.lib
    7. includelib  C:\masm32\lib\advapi32.lib
    8.  
    9. includelib  C:\masm32\lib\dinput.lib
    10. includelib  C:\masm32\lib\dxguid.lib
    11. includelib  C:\masm32\lib\Uuid.Lib
    12. includelib  C:\masm32\lib\oldnames.lib
    13. ;include C:\masm32\include\dinput.inc
    14. include C:\masm32\include\Windows.inc
    15. include C:\masm32\include\Kernel32.inc
    16. include C:\masm32\include\gdi32.inc
    17. include C:\masm32\include\advapi32.inc
    18. include C:\masm32\include\user32.inc
    19. ;include C:\masm32\include\winuser.INC
    20. include \masm32\Macros\Strings.mac
    21. extrn DirectInputCreateA@16:near
    22. .data
    23. trak db "C:\Program Files\NaturalPoint\TrackIR5\TrackIR5.exe",0
    24.     lpdi        dd        0
    25. regi db   0
    26. .CODE
    27.  
    28.  DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
    29.  
    30. local acModulePath[MAX_PATH]:CHAR
    31. .if reason == DLL_PROCESS_ATTACH
    32. invoke GetFullPathName, 0, sizeof acModulePath, addr acModulePath, 0
    33.  
    34.         push    ebx
    35.         push    ecx
    36.         xor       eax,eax
    37.         xor       ebx,ebx
    38.      xor ecx,ecx
    39.         lea       eax,trak
    40.     lea ebx,acModulePath
    41. buk:
    42.         mov         cl,[eax]
    43.        cmp     cl,0
    44.     je  prod
    45.     mov ch,[ebx]
    46.     inc eax
    47.     inc ebx
    48.     cmp cl,ch
    49.     je  buk
    50. pop ecx
    51. pop ebx
    52. cmp regi,1
    53. jne yyyy
    54.     push 0
    55.     push offset lpdi
    56.     push 0500h
    57.     push hInstDLL
    58.     call DirectInputCreateA@16
    59. jmp yyyy
    60. prod:
    61. mov regi,1
    62. pop ecx
    63. pop ebx
    64. yyyy:
    65. .endif
    66.            mov  eax,TRUE
    67.            ret
    68.  
    69.    DllEntry Endp
    70.  
    71. End  DllEntry
    Почему?
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    1) Загрузи систему в режиме "нет автоматической перезагрузки ...." - жмешь F8 в момент загрузки и выбираешь. Будет синий экран и там увидишь.
    Возможно в 2000-м этот режим в другом месте включается - я давно уже 2000-й забросил.
    2) Сначала проверь работу своей DLL без внедрения во все процессы - может что и увидишь.
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я выяснил что перезагрузка происходит из-за mov eax, TRUE, а остальной код даже не важен, причём BSOD`а нет. комп просто перезагружается. Почему?
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Это что, запретная инструкция для Win2k ?
    Думаю, как раз mov eax, TRUE не при чём, а остальной код и является проблемой.
    Иначе винда просто бы не загружалась от того количества mov eax, TRUE, которые выполняются процессором.
     
  5. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    а что это за вызов GetFullPathName с первым нулевым параметром? в мсдне об этом ничего не написано. Это типа пародия на GetModuleFileNameA? бред какой-то))
     
  6. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так я сегодня это и проверял
    Код (Text):
    1.  DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
    2. local acModulePath[MAX_PATH]:CHAR
    3. mov  eax,TRUE
    4.            ret
    5.  
    6.    DllEntry Endp
    7.  
    8. End  DllEntry
    Всё. Перезагрузка.
    В XP и в WIN SEVRER 2003 это работает
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    mov eax,TRUE всего лишь установка индикатора ошибки и означает, что dll успешно выполнила необходимую для её работы начальную инициализацию и теперь будет доступна как источник исполняемого кода. Если что-то в процессе загрузки/инициализации пошло не так, и возникли ошибки, надо вернуть в еах ноль, чтобы система выгрузила некорректно работающий модуль.
    Ошибка не в mov eax,TRUE, а в том что модуль твой некорректно работает, может собран без учёта особенностей win2k, может в нем есть код, который в хр работает, а в win2k - нет. Гадать можно долго.
    Бери Олю за хобот и вперед на мины
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А как должен взять Олю за хобот, если винда перезагружается не успев загрузиться?
     
  9. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Llirik
    1) Для начала, убедитесь, что ваша длл вообще работает под 2000 - внедрите ее в какой-нить процесс под 2000
    (тут как раз Олю можно подключить) другим способом
    2) Приведите таблицу импорта этой длл - чего она там требует? Т.к. длл, загружаемые через AppInit_DLLs проецируются на АП сразу после user32.dll, то какие-то библиотеки могут быть и недоступны...
    DirectInputCreate - это вроде ком-итерфейс... а dll грузится во все процессы (и в системные на ранних стадиях загрузки) - может ком еще не инициализирован системой(??)
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Llirik
    Working with the AppInit_DLLs registry value
    А твоя длл-ка не только сама лезет в early loading, но тащит за собой 100кг другого "хлама", нарушая таким образом нормальный порядок инициализации dll. Вообще не понятно, как мелкософты додумались юзать LoadLibrary при инициализации user32.dll, хотя сами же предупреждают о возможных последствиях
    DllMain Entry Point
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я добавил
    Код (Text):
    1. yyyy:
    2. [b]ret[/b]
    3. .endif
    4.            mov  eax,TRUE
    5.            ret
    и комп перезагружаться перестал, но DirectInputCreate в вин2000 почему-то не работает(
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Llirik
    Ну вам же leo практически на блюдечке выложил все, что надо. Можно я поработаю переводчиком с русского на русский?

    Вся проблема в том, что у вас в длл статически слинкован ряд вызовов АПИ. А безпроблемно (в AppInit-библиотеках) возможно использовать функции только из kernel32. Поэтому перекомпилируйте с LoadLibrary все, что наваяли. И я не о инициализации, а о всем остальном, что есть в вашей длл. Проблема не в вашей процедуре инициализации - проблема в том, что автоматом инициализируется еще куча длл, и это как раз и вешает/крашит систему.