Доброго времени суток. У меня возникла непонятная проблема: прочитал статью 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): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib include \masm32\include\Packet.inc includelib \masm32\lib\Packet.lib .data UsAd db "Using Adapter",0 .data? lpAdapter LPADAPTER ? ;Описатель сетевого адаптера lpPacket LPPACKET ? ;Описатель пакета AdapterBuff db 256 dup (?) ;Буфер для имени адаптера AdapterName db 512 dup(?) ;Буфер для всех имен адаптеров в системе AdapterLen dd ? ;Длина буфера AdapterName packetbuff db 100 dup(?) ;Буфер в котором формируется пакет IPstr db 11h dup(?) ;Буфер содержащие введенный IP-адрес .code start: mov AdapterLen, sizeof AdapterName invoke RtlZeroMemory,addr AdapterName,AdapterLen invoke PacketGetAdapterNames, addr AdapterName, addr AdapterLen cmp eax,FALSE je Error lea esi,AdapterName lea edi,AdapterBuff Next: movsb cmp byte ptr [esi],0 jne Next invoke MessageBox,HWND,addr AdapterBuff,addr UsAd,MB_OK Error: invoke MessageBox,HWND,NULL,NULL,NULL end start Помогите кто может!
includelib \masm32\lib\Packet.lib а есть там такая либа разве? может она у тебя отдельно прикручена ? указать тогда правильный путь ...
Я её скачал с сайта и поместил в каталог lib. Я так понимаю, что самое главное в этом деле- это файл packet.dll в котором и находятся все функции, а прототипы их находятся в packet.inc (не знаю зачем тогда нужен и что хранится в packet.lib). Может сам packet.dll нужно разместить где то в другом месте(у меня он находится в system32)?
хде? в систем 32? тогда - проще всего подключить длл-ку как положено с этими либами всё запутано... примеров полно ... и длл разумеется нужно поместить в папку с проектом...
Значит я копирую.dll в папку проекта и пишу include \masm32\my_proj\packet.dll вместо includelib \masm32\lib\Packet.lib и все?
GeBit Плохо читаете господа Первый файл я вам выложил. Второй файл можно скачать у разработчиков, но масм его не поймет. По крайней мере тот что я использовал, его не понимал. Следовательно необходимо создать свой. Как? Ну а что в этом сложного ? Читаем: http://www.wasm.ru/article.php?article=1018001
TermoSINteZ Огромное спасибо! Прочитал статью- библиотека создалась. Не понятен только один момент: раз библиотека содержит информацию о прототипах функций(имя, параметры), тогда зачем нужен .inc файл, в котором также содержатся прототипы функций? В .inc файле функция например имеет описание: PacketGetAdapterNames PROTO STDCALL WORD, WORD А для создания dll её нужно описывать так: PacketGetAdapterNames proc param1WORD, param2WORD PacketGetAdapterNames endp В чем же отличие??
GeBit lib нужна линкеру, чтоб настроить таблицу импорта в выходном файле. Иначе как загрузчик узнает, по какому адресу эти функции в библиотеке лежат... А inc нужен чтоб компилятор сгенерировал корретный объектный код. Прототип функции описывается, чтобы вызывать ее из любого места программы. Вы их подключаете в любой модуль, а реализация самих функции описываются в другом 1 модуле. То есть написав в inc файле PacketGetAdapterNames PROTO STDCALL WORD, WORD и подключив его в наш исходник, мы тем самым можем использовать далее вызовы invoke. Для создания длл они описываются по другому так как длл - содержит уже саму реализацию. А написав каркасы, мы получим lib файл, который нужен линкеру, а длл можно заменить на другую, где реальная реализация, а не каркас.
А раз мы имеем дело с функцией, то почему тогда нет в прототипе типа возвращаемого результата(скажем: DWORD:PacketGetAdapterNames proc param1WORD, param2WORD)? И вообще, где можно найти инфу о том куда функции из packet.dll помещают свой результат?
Я вот как раз про эту ситуацию и хотел спросить: ведь где сказано,что PacketGetAdapterNames возвращает результат в виде двойного слова именно в регистр eax? А как же я тогда узнаю о местонахождении результатов других функции, например PacketOpenAdapter или PacketAllocatePacket? А статью я перечитал не один раз ). А вот по поводу winpcap- я действительно не понимаю зачем он нужен. Я его установил. Но когда запустил программу- в ней выдалось: Press Ctr+C to stop server . Объясните пожалуйста!
GeBit Это просто стандарт программирования. Результат dword обычно в EAX, если длиннее то пара EAX:EDX