· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Импорт функции по ordinal'у

Посл.отвђт Сообщенiе


Дата: Сен 20, 2004 02:08:24 · Поправил: krid24

Есть DLL'ка и imported .LIB для нее. DLL'ка экспортирует функцию по ordinal'у (без имени).
Вопрос: как импортировать такую функцию в свою asm прогу? (т.е, что надо прописать в .asm и/или .def ? Или как-то по-другому?).
Спасибо.


Дата: Сен 20, 2004 05:41:39

Юзай fasm и будет тебе счастье :-)


Дата: Сен 20, 2004 05:50:28

krid24
GetProcAddress?


Дата: Сен 20, 2004 05:59:35

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


Дата: Сен 20, 2004 06:28:07

krid24
„DLL'ка экспортирует функцию по ordinal'у (без имени).“
Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит.

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


Дата: Сен 20, 2004 07:01:52 · Поправил: krid24

Вот конкретный пример: есть в SHELL32.DLL функция, которая показывает диалог выбора иконки (как в свойствах ярлыка -> изменить значок). В SHELL32 эта ф-ция экспортируется не по имени, а по ординалу 62 (если кому интересно, вот прототип (имя произвольное):
BOOL WINAPI PickIconDlg(
     HWND     hwndOwner, 
     LPSTR    lpstrFile, 
     DWORD    nMaxFile, 
     LPDWORD  lpdwIconIndex);
).

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

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

2Quantum: А что, такое действительно может быть: в .DLL - ординал, а в .LIB - еще и имя, на которое можно ссылаться в asm коде?
И еще: в .DEF можно включать раздел IMPORTS. Он для чего?
Просветите, плз.

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


Дата: Сен 20, 2004 08:13:24

krid24
„А что, такое действительно может быть: в .DLL - ординал, а в .LIB - еще и имя, на которое можно ссылаться в asm коде?“
Угу.

„И еще: в .DEF можно включать раздел IMPORTS. Он для чего?“
Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает.

„Как мне в своей asm (masm,tasm) проге ее заюзать?“
Первым делом нужно определить символ _PickIconDlg@16 в либе, т.е. сгенерировать свой shell32.lib. Можно так:
; shell32.asm:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.CODE
DllEntry PROC hInstance:DWORD,reason:DWORD,resvd:DWORD
    mov eax,1
    ret
DllEntry ENDP

PickIconDialog PROC p1:DWORD,p2:DWORD,p3:DWORD,p4:DWORD
    ret
PickIconDialog ENDP
END DllEntry

;shell32.def:
LIBRARY SHELL32
EXPORTS PickIconDialog @62

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

Итак, тестовая прога:
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
includelib \path\shell32.lib ; <- это новый shell32.lib

; Прототип
externdef _imp__PickIconDialog@16:PTR pr4
PickIconDialog equ <_imp__PickIconDialog@16>

.DATA
shell32 db "shell32.dll"
shell32_len equ $ - shell32
index dd 0

.CODE
start:
invoke PickIconDialog,0,OFFSET shell32,shell32_len,OFFSET index
invoke ExitProcess,0
END start

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


Дата: Сен 20, 2004 19:44:42

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

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

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


Дата: Сен 21, 2004 12:05:42 · Поправил: Asterix

А вообще, нужно fasm юзать ;-)

---------------------------------------------------------------------- -------------------
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:
Code:

  export 'ERRORMSG.DLL',\
         ShowErrorMessage,'ShowErrorMessage',\  ; ordinal 1 
         ShowLastError,'ShowLastError'          ; ordinal 2




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

  import errormsg,\
         ShowLastError,2

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


Дата: Сен 23, 2004 09:39:27 · Поправил: krid24

Всем огромный спасиб!


Дата: Сен 23, 2004 10:18:26 · Поправил: krid24

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

Quantum Сен 20, 2004 06:28:07
"Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит."

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


Дата: Сен 23, 2004 20:04:20

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


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088