Библиотека CRT VC++ 8.0 не работают в NT SP6 - что делать?

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 14 ноя 2008.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Есть программа написанная в VC++ 8.0
    Есть ОС NT SP6
    При запуске програмки выпадает окно
    [​IMG]
    То-есть такой функции видно просто не придумали в kernell32.dll NT
    Как поступать в такой ситуации. Хочется запустить всетаки прожку.
     
  2. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Для начала затри GetLongPathNameW нулями. Если есть функцтя в импорте то это еще не значит что она используется.
    И еще совместимость GetLongPathName
    Windows XP Да
    Windows 2000 Professional Да
    Windows NT Нет
    Windows Me Да
    Windows 98 Да
    Windows 95 Нет

    может стоит обновить ось?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ыыы ну это очень вряд ли.

    Вообще я в таких случаях обычно делаю обертку. Делаю свою библиотеку например kernel33.dll, в импорте у проги меняю 32 на 33 и в своей либе все функции кроме нужной редиректю в оригинальную. а нужную реализовываю сам.
    работает даже с драйверами
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    assorted
    GetLongPathNameW - в библиотеке MSVCR80.DLL, которая обращается в kernell32

    >Для начала затри GetLongPathNameW нулями
    Взять, значит, .exe и там затереть в таблице импорта?
    А если она используется - эта злосчастная GetLongPathNameW - со строками работает.
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Great
    то есть в MSVCR80.DLL в таблице импорта сопоставляю GetLongPathNameW -> kernell33
    В kernell33 описываю GetLongPathNameW. И готовую kernell33.dll ложу в папку с .exe?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в твоей либе ты описываешь в экспорте все функции, которые требуется проге. а в Си реализовываешь только те которые надо. остальное догадливый линкер сам перенаправит в kernel32.
    а длл да - в папку с ехе.

    главное тебе найти именно ту строчку KERNEL32.DLL которая нужна =) Тут лучше не наобум искать ее, а разобрать импорт дескриптор
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    >разобрать импорт дескриптор
    а этот разбор чем ( какой утилитой ) лучше делать?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну я хз какие утилиты показывают еще и смещения полей в пе файле, проще будет быстро накатать свою программку. которая заодно и имя заменит.
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Great
    да, вот посмотрел сколько эта MSVCR80.DLL импортирует из kernel32 аж 160 функций =0
    Хотя их имена ведь достаточно просто прописать в .def. Тут же даже кол-во входных параметров не надо указывать.

    Код (Text):
    1.   ;----------------------------------------------------------------------------
    2.    ;                           kernel33.asm
    3.    ;----------------------------------------------------------------------------
    4.  
    5.    .386
    6.    .model flat,stdcall
    7.  
    8.    option casemap:none
    9.    include \masm32\include\windows.inc
    10.    include \masm32\include\user32.inc
    11.    include \masm32\include\kernel32.inc
    12.  
    13.    includelib \masm32\lib\user32.lib
    14.    includelib \masm32\lib\kernel32.lib
    15.  
    16.  
    17.    .data
    18.    .code
    19.    DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
    20.            mov  eax,TRUE
    21.      
    22.            ret
    23.    DllEntry Endp
    24.  
    25.    ;----------------------------------------------------------------------------
    26.    ; Это функция-пустышка - она ничего не делает.
    27.    ;----------------------------------------------------------------------------
    28.    GetLongPathNameW proc param1:DWORD,param2:DWORD,param3:DWORD
    29.  
    30.     sub esp,12
    31.     ret
    32.  
    33.    GetLongPathNameW endp
    34.  
    35.  
    36.    End DllEntry
    Код (Text):
    1. ;----------------------------------------------------------------------------
    2. ;                              kernel33.def
    3. ;----------------------------------------------------------------------------
    4.  
    5.    LIBRARY    kernel33
    6.    EXPORTS   LoadLibraryW
    7.    EXPORTS   GetLocalTime
    8.    EXPORTS   GetModuleFileNameA
    9.    EXPORTS   GetLongPathNameW
    10.  
    11.    ... и так 160 строк с именами
    Я правильно понял.

    А можно как-то иначе .... может перехватить как-то эту GetLongPathNameW ?
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    hiew
    f8
    f10
    Import (вторая строчка сверху)
    ентер

    М:
    4-й дворд - рва имени длл-и
    следующий - рва вектора переходников по импорту (в незагруженом файле указывают на имена импортируемых из этой длли функов + 2 "0"). конец вектора - "0" дворд

    далее такая-же структура. если все 5 двордов не равны 0 - jmp M

    ПРИМЕЧАНИЕ:
    искать в хиеве - f5 ".<требуемое рва>"
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вообще деф файл оформляется проще:

    Код (Text):
    1. EXPORTS
    2. func1
    3. func2
    4. func3
    5. ....
    функции просто берутся копипастом из dependency walker'а. ничего сложного, за пару секунд делается
     
  12. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Great
    ой, пытаюсь линковать библиотеку и вот ... все мой функции, кроме GetLongPathNameW - unresolved external symbol :dntknw:((
    > остальное догадливый линкер сам перенаправит в kernel32.
    Подскажите , мож чего не учел не прописал?

    Код (Text):
    1. C:\k33>\masm32\bin\ml /c /coff /Cp kernel33.asm
    2.  Assembling: kernel33.asm
    3.  
    4. C:\k33>\masm32\bin\link /DLL /SUBSYSTEM:WINDOWS /DEF:kernel33.def /LIBPATH:c:\masm32\lib kernel33.obj  
    5. Microsoft (R) Incremental Linker Version 5.12.8078
    6. Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
    7.  
    8. kernel33.def : error LNK2001: unresolved external symbol Beep
    9. kernel33.def : error LNK2001: unresolved external symbol CloseHandle
    10. kernel33.def : error LNK2001: unresolved external symbol CompareStringA
    11. kernel33.def : error LNK2001: unresolved external symbol CompareStringW
    12. kernel33.def : error LNK2001: unresolved external symbol CreateDirectoryA
    13. kernel33.def : error LNK2001: unresolved external symbol CreateDirectoryW
    14. ...
    kernel33.def -

    Код (Text):
    1. ;----------------------------------------------------------------------------
    2. ;                              kernel33.def
    3. ;----------------------------------------------------------------------------
    4.  
    5. LIBRARY    kernel33
    6. EXPORTS
    7. LoadLibraryW
    8. GetLocalTime
    9. GetModuleFileNameA
    10. GetModuleFileNameW
    11. GetModuleHandleA
    12. ... и т.д. 160 шт.
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _sheva740
    1) в export разделе def-файла указывают только экспортируемые функции, у тебя она пока одна;
    2) подумай и убери из кода sub esp,12.

    ps программу нельзя собрать заново, указав правильные WINVER и _WIN32_WINNT?
     
  14. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    q_q
    >1) в export разделе def-файла указывают только экспортируемые функции, у тебя она пока одна;
    да вот хотелось бы чтоб эту GetLongPathNameW как-то "заглушить"
    Наверное придется в def-е прописывать что-то подобно
    Код (Text):
    1. ;----------------------------------------------------------------------------
    2. ;                              kernel33.def
    3. ;----------------------------------------------------------------------------
    4.  
    5. LIBRARY    kernel33
    6. EXPORTS
    7. LoadLibraryW@4
    8. GetLocalTime@?? - не помню сколько
    9. Sleep@4
    10. ... и т.д. 160 шт.
    ... короче в 160 строках прописывать сумму размеров вх. параметров - правильно?

    >2) подумай и убери из кода sub esp,12.
    подумал убрал :)

    > программу нельзя собрать заново, указав правильные WINVER и _WIN32_WINNT?
    к сожалению не в моей власти. Хотел провести в жизнь метод Great - а, вроде как все логично.
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _sheva740
    > Хотел провести в жизнь метод Great
    Твое желание не противоречит моему: "указывают только экспортируемые функции".
    В исходном тексте _пока_ одна функция, а редактору связей ты указываешь 160, он не находи и ругается. Ошибки пропадут, когда: "все функции кроме нужной редиректю в оригинальную".

    > Наверное придется в def-е прописывать что-то подобно LoadLibraryW@4...
    Afaik без @ и цифр.
     
  16. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    q_q
    наверное так объявляются в dll экспортируемые функции, правильно ?

    Код (Text):
    1.    ;----------------------------------------------------------------------------
    2.    ;                           kernel33.asm
    3.    ;----------------------------------------------------------------------------
    4.  
    5.    .386
    6.    .model flat,stdcall
    7.  
    8.    option casemap:none
    9.    include \masm32\include\windows.inc
    10.    include \masm32\include\user32.inc
    11.    include \masm32\include\kernel32.inc
    12.  
    13.    includelib \masm32\lib\user32.lib
    14.    includelib \masm32\lib\kernel32.lib
    15.  
    16.     extrn  Beep                    :near
    17.     extrn  ExitProcess           :near
    18.     extrn  GetStdHandle        :near
    19.     extrn  WriteConsoleA       :near
    20.     extrn  GetModuleHandleA  :near
    21.         ...
    22.  
    23.    .code
    24.    DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
    25.            mov  eax,TRUE
    26.      
    27.            ret
    28.    DllEntry Endp ... и т.д.
    ... а то я уже начал всем 160 функциям @ и цифры вбивать :)
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _sheva740
    Импортируемые функции не твоя забота. Копилятору хватит kernel32.inc, а редактору связей - kernel32.lib.

    Тебе надо сделать что-то похожее на
    Код (Text):
    1. ;; kernel33.asm
    2.  
    3. .386
    4. .model flat,stdcall
    5. option casemap:none
    6.  
    7. .nolist
    8. include windows.inc
    9. include kernel32.inc
    10. includelib kernel32.lib
    11. .list
    12.  
    13. .code
    14.  
    15. align 4
    16. entry   proc    hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    17. ;;  push    hInstance
    18. ;;  push    reason
    19. ;;  push    reserved1
    20. ;;  add esp,0Ch
    21.     mov eax,TRUE
    22.     ret
    23. entry   endp
    24.  
    25. align 4
    26. MyCreateFileA   proc    p1,p2,p3,p4,p5,p6,p7
    27.         invoke  CreateFileA, p1,p2,p3,p4,p5,p6,p7
    28.         ret
    29. MyCreateFileA   endp
    30.  
    31. align 4
    32. MyCreateFileW   proc    p1,p2,p3,p4,p5,p6,p7
    33.         invoke  CreateFileW, p1,p2,p3,p4,p5,p6,p7
    34.         ret
    35. MyCreateFileW   endp
    36.  
    37. ...
    38.  
    39. end entry
    40.  
    41.  
    42. ;; kernel33.def
    43.  
    44. LIBRARY kernel33
    45. EXPORTS
    46. CreateFileA = MyCreateFileA
    47. CreateFileW = MyCreateFileW
    48. ...
     
  18. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    q_q
    OMG. DLL Forwarding уже отменили?

    Код (Text):
    1. EXPORTS
    2.     FunctionAlias=OtherDLLName.RealFunction
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    inviZ
    Скорее нет, чем да.
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вротмне ноги.
    1) а кто будет линковать с kernel32.lib ?
    2) насчет длл форвардинга - можно и без него. если сделать как я написал - просто указать в .def в экспортах все экспорты kernel32, а ону нужную функцию реализовать, то на все остальные догадливый линкер сам поставит заглушки вида
    Код (Text):
    1. CreateFileW:  jmp [__imp_CreateFileW]
    Еще не факт что получится меньше - с форвардингом (где надо каждый раз имена перепрописывать) или без.
    + геморройно дописывать к каждой строчке форвардинг. или руками или скрипт писать. что отнимает дополнительное время.
    лучше заглушки