Народ, объясните плиз. Почему при,примерно, таком коде Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\kernel32.inc include \masm32\include\iphlpapi.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\iphlpapi.lib .data buf_size db 648 dup(0) ip_adapter_info_struc dd 648 .code start: invoke GetAdaptersInfo,ip_adapter_info_struc, buf_size invoke ExitProcess,0 end start Оля выдаёт ошибку(в LastErr) ERROR_RESOURCE_DATA_NOT_FOUND (00000714)
ну это я понимаю, но в чём ошибка то? Места под структуру мало чтоли? но там другая ошибка должны быть
p0tap Структура у тебя в секции данных. Проверь валидность своего экзешника в каком-нибудь PE-Viewerе.
p0tap Ошибку надо смотреть не в LastErr, а в EAX. Для твоего кода это будет 57h - ERROR_INVALID_PARAMETER. Смотри документацию - первый параметр _адрес_ буфера, второй - его размер.
Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\kernel32.inc include \masm32\include\iphlpapi.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\iphlpapi.lib .data buf_size dd 648 ip_adapter_info_struc dd 648 dup(0) .code start: invoke GetAdaptersInfo,ip_adapter_info_struc, buf_size mov esi,ip_adapter_info_struc invoke ExitProcess,0 end start Да. с передаваемыми параметрами я накосячил. Еще кой что, почему теперь прога исполняется, но при трасировке как то всё не так, не хочет возвращатся из функции GetAdaptersInfo. И в eax обнаруживается 00000004. Походу опять код ошибки..Поидее функция должна вернуть в ip_adapter_info_struc инф. о сетевых интерфесах. Но вот у меня чтото всё никак с ней не получается, объясните проблему пожалуйста
p0tap DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen ); Параметры pAdapterInfo Указатель на буфер, в который записывается список структур IP_ADAPTER_INFO. pOutBufLen Указатель на переменную ULONG, которая содержит размер, требуемый для буфера pAdapterInfo. Проверь, правильно ли ты передаешь параметры и правильно ли их создаешь. Пример на С Код (Text): #include <stdio.h> #include <windows.h> #include <iphlpapi.h> main() { IP_ADAPTER_INFO * AdapterInfo; ULONG ulOutBufLen; AdapterInfo = (IP_ADAPTER_INFO *) GlobalAlloc(GPTR,sizeof(IP_ADAPTER_INFO)); ulOutBufLen = sizeof(IP_ADAPTER_INFO); GetAdaptersInfo(AdapterInfo, &ulOutBufLen); }
Код (Text): DWORD re,cbSize = sizeof(IP_ADAPTER_INFO); PIP_ADAPTER_INFO ai = (PIP_ADAPTER_INFO)HeapAlloc(GetProcessHeap(),0,cbSize); if((re = GetAdaptersInfo(ai, &cbSize) == ERROR_BUFFER_OVERFLOW){ HeapReAlloc(GetProcessHeap(),0,ai,cbSize); re = GetAdaptersInfo(ai, &cbSize); } if(!re){ // iterate adapter records }else{ // error } HeapFree(GetProcessHeap(),0,ai);
нет, ну например было Код (Text): .data ip_adapter_info_struc dd 100 dup(0) buf_size dd 100 Смотрим оли: Код (Text): 00401023 |. FF35 90314000 PUSH DWORD PTR DS:[403190] ;здесь у нас переменная с кол-вом байтов под структуру 00401029 |. 68 00304000 PUSH prog_.00403000 ;здесь адрес на начало области памяти 0040102E |. E8 1F000000 CALL <JMP.&iphlpapi.GetAdaptersInfo> Стёк: Код (Text): 0012FFBC 00403000 prog_.00403000 0012FFC0 00000064 ;64 при переводе в 10тиричную - 100 параметры справа налево,т.е. всё норм. еслибы был маленький буфер,он бы выдал соотв. ошибку,а тут какаято беда
блин,я не знаю С.знаю С#, но это делу не поможет =) Тут вроде как раздел асмы,а примеры на сях толкают=)
p0tap Иногда на С легче объяснить... Ассемблерный вариант всегда можешь посмотреть либо в самой среде разработки, либо в дебуггере. Проверь еще раз, правильно ли ты передаешь параметры вызываемой функции.
То так, но на асме будет примерно то же самое. А надо - адрес переменной: invoke GetAdaptersInfo,addr ip_adapter_info_struc, addr buf_size Но и это не поможет, т.к. 1й параметр - не структура, а список их, поэтому память надо выделять динамически - см.выше.
Спасибо. А вот что с этим делать? IP_ADAPTER_INFO, её самому перегонять под асм или что? в \masm32\include\windows.inc данная структура не определена. Просто как то уж больно жутко она выглядит =) --------------------------------- Вот в одном из примеров нашёл Код (Text): **** .data pinfo IP_ADAPTER_INFO <> **** У меня компилятор ругается на эту строку. Я в асме не силён, рассчитываю на Вашу помощь
ппц. там получается 3-4 структуры перебивать прийдётся..а я не думаю,что у меня получится.мб всё таки есть другие способы?=)) вот код в инете нашёл для получения мак адреса сет. карты. Код (Text): .586 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\IpHlpApi.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\IpHlpApi.lib .data pinfo IP_ADAPTER_INFO <> len dd 0 String db '%02X:%02X:%02X:%02X:%02X:%02X',0 Buffer db 18 dup (0) Text db 'MAC Address,',0 .code Start: invoke GetAdaptersInfo,addr pinfo,addr len invoke GlobalAlloc,GMEM_FIXED,len push eax invoke GetAdaptersInfo,eax,addr len pop esi push esi assume esi:ptr IP_ADAPTER_INFO movzx eax,byte ptr [esi].Address[5] push eax movzx eax,byte ptr [esi].Address[4] push eax movzx eax,byte ptr [esi].Address[3] push eax movzx eax,byte ptr [esi].Address[2] push eax movzx eax,byte ptr [esi].Address[1] push eax movzx eax,byte ptr [esi].Address[0] push eax push offset String push offset Buffer call wsprintf pop eax invoke GlobalFree,eax invoke MessageBox,0,addr Buffer,addr Text,MB_OK invoke ExitProcess,eax end Start И рядом в раре лежит экзэшник. Инклудятся у меня теже либы и пр.,у него Код (Text): pinfo IP_ADAPTER_INFO <> И как то получилось скомпилировать, а у меня касячит страшно. Донесите до меня, мб я тугой, но в чём прекол то?
ок. всё,проблема разрешилась. спасибо всем за помощь,наставления ЗЫ мб кому пригодятся структуры Код (Text): IP_ADDRESS_STRING struct String db 16 dup (?) IP_ADDRESS_STRING ends IP_ADDR_STRING struct Next dd ? IpAddress db 16 dup (?) IpMask db 16 dup (?) Context dd ? IP_ADDR_STRING ends IP_ADAPTER_INFO struct Next dd ? ComboIndex dd ? AdapterName db 260 dup (?) Description db 132 dup (?) AddressLength dd ? Address db 8 dup (?) Index dd ? tType dd ? DhcpEnabled dd ? CurrentIpAddress dd ? IpAddressList IP_ADDR_STRING <> GatewayList IP_ADDR_STRING <> DhcpServer IP_ADDR_STRING <> HaveWins dd ? PrimaryWinsServer IP_ADDR_STRING <> SecondaryWinsServer IP_ADDR_STRING <> LeaseObtained dd ? LeaseExpires dd ? IP_ADAPTER_INFO ends