Не создается EXEшник

Тема в разделе "WASM.ASSEMBLER", создана пользователем GeBit, 20 мар 2008.

  1. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    Доброго времени суток.
    У меня возникла непонятная проблема: прочитал статью http://www.wasm.ru/article.php?article=othergalaxy- про то,как можно создать свой собственный пакет и отправить его в сеть. На первом этапе ограничился лишь тем, что хочу вывести имя своего сетевого адаптера. Для этого использую packet.lib и packet.inc вместе с kernel32, user32. Но почему то создается только объектный фаил(хотя и выдается ошибка), а .exe не создается. Ошибки такие:
    myfile.obj: error LNK 2001: unresolved external symbol _PacketGetAdapterNames@8
    myfile.exe: fatal error LNK1120: 1 unresolved externals
    Link error

    Хотя прототип функции PacketGetAdapterNames прописан в packet.inc
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\user32.lib
    8. includelib \masm32\lib\kernel32.lib
    9. include \masm32\include\Packet.inc
    10. includelib \masm32\lib\Packet.lib
    11.  
    12. .data
    13. UsAd db "Using Adapter",0
    14.  
    15. .data?
    16. lpAdapter LPADAPTER     ?                  ;Описатель сетевого адаптера
    17. lpPacket LPPACKET   ?                   ;Описатель пакета
    18.   AdapterBuff       db  256 dup (?)     ;Буфер для имени адаптера
    19.    AdapterName      db  512 dup(?)      ;Буфер для всех имен адаптеров в системе
    20. AdapterLen      dd  ?       ;Длина буфера AdapterName
    21. packetbuff      db  100 dup(?)  ;Буфер в котором формируется пакет
    22.   IPstr         db  11h dup(?)             ;Буфер содержащие введенный IP-адрес
    23. .code
    24. start:
    25.  
    26. mov AdapterLen, sizeof AdapterName     
    27. invoke RtlZeroMemory,addr AdapterName,AdapterLen
    28. invoke PacketGetAdapterNames, addr AdapterName, addr AdapterLen
    29.                 cmp eax,FALSE
    30.                 je Error
    31.                        lea esi,AdapterName             
    32.         lea edi,AdapterBuff
    33.     Next:  
    34.         movsb
    35.         cmp byte ptr [esi],0
    36.         jne Next
    37. invoke MessageBox,HWND,addr AdapterBuff,addr UsAd,MB_OK
    38.  Error:
    39. invoke MessageBox,HWND,NULL,NULL,NULL
    40.  
    41. end start
    Помогите кто может!
     
  2. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    includelib \masm32\lib\Packet.lib


    а есть там такая либа разве?

    может она у тебя отдельно прикручена ? указать тогда правильный путь ...
     
  3. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    Я её скачал с сайта и поместил в каталог lib. Я так понимаю, что самое главное в этом деле- это файл packet.dll в котором и находятся все функции, а прототипы их находятся в packet.inc (не знаю зачем тогда нужен и что хранится в packet.lib). Может сам packet.dll нужно разместить где то в другом месте(у меня он находится в system32)?
     
  4. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    хде? в систем 32?

    тогда - проще всего подключить длл-ку как положено с этими либами всё запутано... примеров полно ... и длл разумеется нужно поместить в папку с проектом...
     
  5. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    Значит я копирую.dll в папку проекта и пишу include \masm32\my_proj\packet.dll вместо includelib \masm32\lib\Packet.lib и все?
     
  6. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    И так тоже не хочет...
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    GeBit
    Плохо читаете господа
    Первый файл я вам выложил. Второй файл можно скачать у разработчиков, но масм его не поймет. По крайней мере тот что я использовал, его не понимал.

    Следовательно необходимо создать свой. Как?
    Ну а что в этом сложного ? Читаем: http://www.wasm.ru/article.php?article=1018001
     
  8. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    TermoSINteZ
    Огромное спасибо! Прочитал статью- библиотека создалась.
    Не понятен только один момент: раз библиотека содержит информацию о прототипах функций(имя, параметры), тогда зачем нужен .inc файл, в котором также содержатся прототипы функций?
    В .inc файле функция например имеет описание:
    PacketGetAdapterNames PROTO STDCALL :lol: WORD, :lol: WORD
    А для создания dll её нужно описывать так:
    PacketGetAdapterNames proc param1:lol: WORD, param2:lol: WORD
    PacketGetAdapterNames endp

    В чем же отличие?? :)
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    GeBit
    lib нужна линкеру, чтоб настроить таблицу импорта в выходном файле. Иначе как загрузчик узнает, по какому адресу эти функции в библиотеке лежат...
    А inc нужен чтоб компилятор сгенерировал корретный объектный код.

    Прототип функции описывается, чтобы вызывать ее из любого места программы. Вы их подключаете в любой модуль, а реализация самих функции описываются в другом 1 модуле.

    То есть написав в inc файле PacketGetAdapterNames PROTO STDCALL :lol: WORD, :lol: WORD
    и подключив его в наш исходник, мы тем самым можем использовать далее вызовы invoke.
    Для создания длл они описываются по другому так как длл - содержит уже саму реализацию.
    А написав каркасы, мы получим lib файл, который нужен линкеру, а длл можно заменить на другую, где реальная реализация, а не каркас.
     
  10. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    А раз мы имеем дело с функцией, то почему тогда нет в прототипе типа возвращаемого
    результата(скажем: DWORD:PacketGetAdapterNames proc param1:lol: WORD, param2:lol: WORD)?
    И вообще, где можно найти инфу о том куда функции из packet.dll помещают свой результат?
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    гг видимо не ходили на сайт winpcap
    да даже статью читали невнимательно
     
  12. GeBit

    GeBit New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    7
    Я вот как раз про эту ситуацию и хотел спросить: ведь где сказано,что PacketGetAdapterNames
    возвращает результат в виде двойного слова именно в регистр eax? А как же я тогда узнаю о местонахождении результатов других функции, например PacketOpenAdapter или PacketAllocatePacket? А статью я перечитал не один раз :)).
    А вот по поводу winpcap- я действительно не понимаю зачем он нужен. Я его установил. Но когда запустил программу- в ней выдалось: Press Ctr+C to stop server .
    Объясните пожалуйста! :)
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    GeBit
    Это просто стандарт программирования. Результат dword обычно в EAX, если длиннее
    то пара EAX:EDX
     
  14. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Наоборот, EDX:EAX
    Младшее двойное слово в EAX.