Как объявить переменные на экспорт из DLL

Тема в разделе "WASM.ASSEMBLER", создана пользователем yureckor, 13 июн 2005.

  1. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    subj

    MASM32, можно ли в def файле указать переменные на экспорт?
     
  2. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
  3. _staier

    _staier New Member

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

    но дело вот в чём , в ассемблере нет разницы между функцией или данными там есть только адрес.

    подпрограмма это кусок кода который потом возвращает управление назад , например посредством ret( но можно и без этого )



    то есть если ты напишешь что- то типа такого



    proc theFuckproc

    dd 0

    endp



    а потом экспортируешь theFuckproc из dll

    то всё будет ок



    хотя , наверное можно и проще как то



    адрес есть адрес , не важно данные это или код
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Код (Text):
    1. theFuckproc label dword
    2. dd 0
    3.  




    не проканает ?
     
  5. Asterix

    Asterix New Member

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





    А попробовать? Экспортируются так же само как и функции.
    Код (Text):
    1. LIBRARY имя_DLL
    2. EXPORTS
    3. имя_переменной
     
  6. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    вот товаришь Asterix

    подсказывает , что видимо и подтверждает мою мысль о том что экспортируется не переменная или функция а адрес , так что пофиг
     
  7. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    в коде пишем
    Код (Text):
    1. public VarName
    , а в def-e
    Код (Text):
    1. VarName
    и все экспортируется
     
  8. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    чето у меня проблема:

    в DLL все нормально (Public var и в def var), т.е. в DLL и LIB все есть.

    В asm ставлю Extrn var, все линкуется, но переменная не верна, т.е. не то содержит. Проверяю GetModuleHandle/GetProcAddress все нормально.

    В чем может быть глюк?


    Код (Text):
    1.  
    2.      mov edi, OF tx_1
    3.      invoke sobrat_s, tx("abc"), edi
    4.      add edi, 3
    5.      mpectex 'edi=', edi
    6.      mpectex 'sobrat_s_kon=', [sobrat_s_kon] ;здесь неверно
    7.      inva_win GetModuleHandle, tx("sctx.dll")
    8.      inva_win GetProcAddress, eax, tx("sobrat_s_kon")
    9.      mov edi, [eax]
    10.      mpectex 'edi2=', edi
    11.  
     
  9. IceStudent

    IceStudent Active Member

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


    О, господи, что это? :)
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    IceStudent

    отладочный макрос
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    yureckor

    Ты бы нарисовал без своих макросов, чтобы хоть что-то можно было разглядеть в этом эээ... коде :)

    А без макросов глядишь и переменная нормально вылезет :)
     
  12. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    В аттаче пример, который ассемблируется и линкуется, но работает неправильно. При получении адресов переменных из DLL динамически все работает.

    Это глюк MASM'а или я чего-то не догоняю?



    [​IMG] 331500593__test.rar
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Так ведь в первом случае (когда "неправильно") ты читаешь из самого exe ячейки по адресам 401130h и 401136h (var1 и var2). А во втором случае, когда "правильно", читаются совсем другие ячейки памяти из подгруженной dll: соответственно 10003020h и 10003024h. И ф-ция proba меняет именно содержимое этих ячеек, а не 401130h и 401136h.
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Когда из viv.exe вызывается ф-ция proba, то подгружается твоя dll и дальше в пошаговом режиме olly показывает:


    Код (Text):
    1. 10001013 > C705 20300010 63>MOV DWORD PTR DS:[var1],63
    2. 1000101D   C705 24300010 64>MOV DWORD PTR DS:[var2],64
    3. 10001027   83C8 FF          OR EAX,FFFFFFFF
    4. 1000102A   C3               RETN




    Обрати внимание на адреса: 10001013h и т.д.

    При этом Olly выводит снизу подсказку:

    DS:[10003020]=00000000

    Что явно указывает, куда именно будет происходить запись 99 и 100: в переменные подгруженной dll, а не в exe-шник.
     
  15. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    да в этом и вопрос! Я нигде не объявлял переменные var1 и var2, а написал Extern Var1, Extern Var2 как рекомендовал masquer. Если убрать includelib mydll.lib то линкер говорит unresolved external ... Тока если ее поставить он их пихает хз куда.
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    yureckor

    1) в def указываем, что это данные

    2)
    Код (Text):
    1. proba   proto
    2. Extrn _imp__var1:DWORD
    3. Extrn _imp__var2:DWORD
    4. var1 equ <_imp__var1>
    5. var2 equ <_imp__var2>
    6. ...
    7.     mov edx,[var1]
    8.     mov eax,[var2]
    9.  invoke wsprintf, ADDR tx1_lc, tx("Перед выполнением: var1=%lu, var2=%lu."),
    10.    dword ptr [edx], dword ptr [eax]
    11.  




    1 — дело в объявлении линкеру, что это данные, а не код. Какая ему разница — не представляю, фасм делает и без этого корректно.

    2 — не смог заставить понять линкер var1, var2 - получилось только через _imp

    3 — переменные стали указателями на переменные. Если по фасму, то:



    var1 - адрес элемента 'var1' в таблице импорта

    [var1] - корректный адрес переменной var1

    [[var1]] - значение переменной var1 (правда, такого оператора не существует но смысл понятен).
     
  17. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    не выходит, говорит unreaolved ... _imp__... и т.д.

    попробовал DLL слинковать не через link, а polink.exe, вообще ничего достать не могу.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
  19. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    а это как 1) в def указываем, что это данные ?
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    msdn.





    Так же, как и с функциями, в пределах своего модуля это просто адрес, а в других - переменная, в которую лоадер записывает этот адрес.