Импорт функции по ordinal'у

Тема в разделе "WASM.WIN32", создана пользователем krid24, 20 сен 2004.

  1. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    Есть DLL'ка и imported .LIB для нее. DLL'ка экспортирует функцию по ordinal'у (без имени).

    Вопрос: как импортировать такую функцию в свою asm прогу? (т.е, что надо прописать в .asm и/или .def ? Или как-то по-другому?).

    Спасибо.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Юзай fasm и будет тебе счастье :)
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    krid24

    GetProcAddress?
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    Я думаю имелось ввиду импортирование через таблицу импорта...
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    krid24



    Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит.



    .DEF - это для экспорта, а не для импорта.
     
  6. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    Вот конкретный пример: есть в SHELL32.DLL функция, которая показывает диалог выбора иконки (как в свойствах ярлыка -> изменить значок). В SHELL32 эта ф-ция экспортируется не по имени, а по ординалу 62 (если кому интересно, вот прототип (имя произвольное):
    Код (Text):
    1. BOOL WINAPI PickIconDlg(
    2.      HWND     hwndOwner,
    3.      LPSTR    lpstrFile,
    4.      DWORD    nMaxFile,
    5.      LPDWORD  lpdwIconIndex);
    6. ).


    Как мне в своей asm (masm,tasm) проге ее заюзать?



    2q_q: Как правильно заметил _DEN_ - нужно "неявное" импортирование, без LoadLibrary/GetProcAddress. Чтобы это в таблице импорта было прописано.



    2Quantum: А что, такое действительно может быть: в .DLL - ординал, а в .LIB - еще и имя, на которое можно ссылаться в asm коде?

    И еще: в .DEF можно включать раздел IMPORTS. Он для чего?

    Просветите, плз.



    Короче, как ипортировать такие "ординальные" функции в C, Delphi, etc, - я знаю, а как в asm (masm,tasm) - нет. Поможите, люди добрые.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    krid24



    Угу.





    Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает.





    Первым делом нужно определить символ _PickIconDlg@16 в либе, т.е. сгенерировать свой shell32.lib. Можно так:
    Код (Text):
    1. ; shell32.asm:
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8. .CODE
    9. DllEntry PROC hInstance:DWORD,reason:DWORD,resvd:DWORD
    10.     mov eax,1
    11.     ret
    12. DllEntry ENDP
    13.  
    14. PickIconDialog PROC p1:DWORD,p2:DWORD,p3:DWORD,p4:DWORD
    15.     ret
    16. PickIconDialog ENDP
    17. END DllEntry
    18.  
    19. ;shell32.def:
    20. LIBRARY SHELL32
    21. EXPORTS PickIconDialog @62


    Компилим и получаем shell32.lib с символом _PickIconDialog@16 и ординалом 62. В данную либу желательно добавить остальные символы из стандартного масмовского shell32.lib.



    Итак, тестовая прога:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib kernel32.lib
    8. includelib \path\shell32.lib ; <- это новый shell32.lib
    9.  
    10. ; Прототип
    11. externdef _imp__PickIconDialog@16:PTR pr4
    12. PickIconDialog equ <_imp__PickIconDialog@16>
    13.  
    14. .DATA
    15. shell32 db "shell32.dll"
    16. shell32_len equ $ - shell32
    17. index dd 0
    18.  
    19. .CODE
    20. start:
    21. invoke PickIconDialog,0,OFFSET shell32,shell32_len,OFFSET index
    22. invoke ExitProcess,0
    23. END start


    Компилим и... всё OK!
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    > Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает.



    В Ида SDK в папке bin\w32 лежит файл IDA.IMP, в нем

    написано
    Код (Text):
    1. LIBRARY IDA.WLL
    2. imports
    3. .......


    т.е. файл по типу def-файла
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    А вообще, нужно fasm юзать :derisive:



    ---------------------------------------------------------------------- -------------------

    Also, the ordinals are preserved according to the order in which you put the functions

    after the "export" macro. At the same time, new "import" macro allows you to import by

    ordinal. For example, the export section of ERRORMSG.DLL example DLL may look like:


    Код (Text):
    1. Code:
    2.  
    3.   export 'ERRORMSG.DLL',\
    4.          ShowErrorMessage,'ShowErrorMessage',\  ; ordinal 1
    5.          ShowLastError,'ShowLastError'          ; ordinal 2








    And you can import the ShowLastError function by ordinal this way:


    Код (Text):
    1. Code:
    2.  
    3.   import errormsg,\
    4.          ShowLastError,2


    ---------------------------------------------------------------------- -------------------
     
  10. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    Всем огромный спасиб!
     
  11. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    мелкомягкие могли бы как-нить и попроще, без создания этих псевдо-либов. Пришлось наклепать прогу, которая сама это делает. У Microsoft все - конструктор "сделай сам" :)



    Quantum Сен 20, 2004 06:28:07

    "Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит."



    Кстати, нашел имя этой ф-ции в shell32.pdb, а в .lib'e его нету.
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    krid24

    Да, я уже заметил. Иначе не было бы необходимости создавать псевдо-либу.