[转载]一个获取网络适配器信息的例子
文章作者:罗云彬<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Sample code for < Win32ASM Programming ><BR>; by 罗云彬, [url]http://asm.yeah.net[/url]<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; NetInfo.asm<BR>; 获取本地计算机的网络配置信息<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 使用 nmake 或下列命令进行编译和链接:<BR>; ml /c /coff NetInfo.asm<BR>; rc NetInfo.rc<BR>; Link /subsystem:windows NetInfo.obj NetInfo.res<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR> .386<BR> .model flat, stdcall<BR> option casemap :none<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Include 文件定义<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>include windows.inc<BR>include user32.inc<BR>includelib user32.lib<BR>include kernel32.inc<BR>includelib kernel32.lib<BR>include IpTypes.inc<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Equ 等值定义<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>ICO_MAIN equ 1000<BR>DLG_MAIN equ 1000<BR>IDC_ADPT equ 1001<BR>IDC_TYPE equ 1002<BR>IDC_MAC equ 1003<BR>IDC_IP equ 1004<BR>IDC_GATEWAY equ 1005<BR>IDC_WINS equ 1006<BR>IDC_DHCP equ 1007<BR>IDC_REFRESH equ 1008<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 数据段<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR> .data?<BR>hInstance dd ?<BR>hWinMain dd ?<BR>hDll dd ?<BR>lpGetInfo dd ?<BR>dwStructSize dd ?<BR>lpInfo dd ?<BR>lpMemory dd ?<BR>szBuffer db 1024 dup (?)<BR>szBuffer1 db 1024 dup (?)<BR> .const<BR>szDll db 'Iphlpapi.dll',0<BR>szGetInfo db 'GetAdaptersInfo',0<BR>szErrNoAdapter db '没有安装网络适配器!',0<BR>szNA db 'N/A',0<BR>szMac db '%02X:%02X:%02X:%02X:%02X:%02X',0<BR>szSpar db '/',0<BR>szCrLf db 0dh,0ah,0<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 代码段<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR> .code<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 将IP地址字符串整理到缓冲区中<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_GetIPString proc _lpIP,_lpOut,_dwSize,_dwIfMask<BR><BR> pushad<BR> invoke RtlZeroMemory,_lpOut,_dwSize<BR> mov esi,_lpIP<BR> assume esi:ptr IP_ADDR_STRING<BR> @@:<BR> .if byte ptr [esi].IpAddress<BR> invoke lstrcat,_lpOut,addr [esi].IpAddress<BR> .if (byte ptr [esi].IpMask) && _dwIfMask<BR> invoke lstrcat,_lpOut,addr szSpar<BR> invoke lstrcat,_lpOut,addr [esi].IpMask<BR> .endif<BR> .endif<BR> mov esi,[esi].Next<BR> .if esi<BR> invoke lstrcat,_lpOut,addr szCrLf<BR> jmp @B<BR> .endif<BR> assume esi:nothing<BR> popad<BR> ret<BR><BR>_GetIPString endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_ShowInfo proc<BR><BR> pushad<BR> mov esi,lpInfo<BR>;********************************************************************<BR>; 根据有没有下一个适配器激活或灰化“下一个”按钮<BR>;********************************************************************<BR> assume esi:ptr IP_ADAPTER_INFO<BR> .if [esi].Next<BR> invoke GetDlgItem,hWinMain,IDOK<BR> invoke EnableWindow,eax,TRUE<BR> .else<BR> invoke GetDlgItem,hWinMain,IDOK<BR> invoke EnableWindow,eax,FALSE<BR> .endif<BR> invoke SetDlgItemText,hWinMain,IDC_ADPT,addr [esi].Description<BR> invoke SetDlgItemInt,hWinMain,IDC_TYPE,[esi]._Type,FALSE<BR>;********************************************************************<BR>; 转换 MAC 地址<BR>;********************************************************************<BR> lea edi,[esi].Address<BR> mov ebx,6<BR> .while ebx<BR> movzx eax,byte ptr [edi+ebx-1]<BR> push eax<BR> dec ebx<BR> .endw<BR> invoke wsprintf,addr szBuffer,addr szMac<BR> add esp,6 * 4<BR> invoke SetDlgItemText,hWinMain,IDC_MAC,addr szBuffer<BR>;********************************************************************<BR>; 转换 IP 地址、网关、DHCP 等信息<BR>;********************************************************************<BR> invoke _GetIPString,addr [esi].IpAddressList,addr szBuffer,sizeof szBuffer,TRUE<BR> invoke SetDlgItemText,hWinMain,IDC_IP,addr szBuffer<BR> invoke _GetIPString,addr [esi].GatewayList,addr szBuffer,sizeof szBuffer,FALSE<BR> .if szBuffer<BR> invoke SetDlgItemText,hWinMain,IDC_GATEWAY,addr szBuffer<BR> .endif<BR> .if [esi].DhcpEnabled<BR> invoke _GetIPString,addr [esi].DhcpServer,addr szBuffer,sizeof szBuffer,FALSE<BR> invoke SetDlgItemText,hWinMain,IDC_DHCP,addr szBuffer<BR> .endif<BR> .if [esi].HaveWins<BR> invoke _GetIPString,addr [esi].PrimaryWinsServer,addr szBuffer,sizeof szBuffer,FALSE<BR> invoke _GetIPString,addr [esi].SecondaryWinsServer,addr szBuffer1,sizeof szBuffer,FALSE<BR> .if szBuffer1<BR> invoke lstrcat,addr szBuffer,addr szCrLf<BR> invoke lstrcat,addr szBuffer,addr szBuffer1<BR> .endif<BR> invoke SetDlgItemText,hWinMain,IDC_WINS,addr szBuffer<BR> .endif<BR> assume esi:nothing<BR> popad<BR> ret<BR><BR>_ShowInfo endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_GetInfo proc<BR><BR>;********************************************************************<BR>; 分配一块 IP_ADAPTER_INFO 结构大小的内存<BR>;********************************************************************<BR> .if lpMemory<BR> invoke GlobalFree,lpMemory<BR> mov lpMemory,0<BR> .endif<BR> mov ebx,IDC_ADPT<BR> .while ebx <= IDC_DHCP<BR> invoke SetDlgItemText,hWinMain,ebx,addr szNA<BR> inc ebx<BR> .endw<BR> invoke GetDlgItem,hWinMain,IDOK<BR> invoke EnableWindow,eax,FALSE<BR> invoke GlobalAlloc,GPTR,sizeof IP_ADAPTER_INFO<BR> .if eax<BR> mov lpMemory,eax<BR> mov dwStructSize,sizeof IP_ADAPTER_INFO<BR> @@:<BR> push offset dwStructSize<BR> push lpMemory<BR> call lpGetInfo<BR>;********************************************************************<BR>; 如果缓冲区不够大,则重新修改内存块的大小<BR>;********************************************************************<BR> .if eax == ERROR_BUFFER_OVERFLOW<BR> invoke GlobalReAlloc,lpMemory,dwStructSize,GMEM_MOVEABLE<BR> .if ! eax<BR> jmp @F<BR> .endif<BR> mov lpMemory,eax<BR> jmp @B<BR> .elseif eax == ERROR_SUCCESS<BR> push lpMemory<BR> pop lpInfo<BR> invoke _ShowInfo<BR> .elseif eax == ERROR_NO_DATA<BR> invoke MessageBox,NULL,addr szErrNoAdapter,NULL,MB_OK or MB_ICONWARNING<BR> .endif<BR> .endif<BR> @@:<BR> ret<BR><BR>_GetInfo endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam<BR><BR> mov eax,wMsg<BR>;********************************************************************<BR> .if eax == WM_COMMAND<BR> mov eax,wParam<BR> .if ax == IDOK<BR> mov eax,lpInfo<BR> mov eax,[eax]<BR> mov lpInfo,eax<BR> invoke _ShowInfo<BR> .elseif ax == IDC_REFRESH<BR> invoke _GetInfo<BR> .endif<BR>;********************************************************************<BR> .elseif eax == WM_CLOSE<BR> invoke EndDialog,hWnd,NULL<BR>;********************************************************************<BR> .elseif eax == WM_INITDIALOG<BR> push hWnd<BR> pop hWinMain<BR> invoke LoadIcon,hInstance,ICO_MAIN<BR> invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax<BR> invoke _GetInfo<BR>;********************************************************************<BR> .else<BR> mov eax,FALSE<BR> ret<BR> .endif<BR> mov eax,TRUE<BR> ret<BR><BR>_ProcDlgMain endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>start:<BR> invoke LoadLibrary,addr szDll<BR> .if eax<BR> mov hDll,eax<BR> invoke GetProcAddress,eax,offset szGetInfo<BR> .if eax<BR> mov lpGetInfo,eax<BR> .endif<BR> .endif<BR> invoke GetModuleHandle,NULL<BR> mov hInstance,eax<BR> invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL<BR> invoke ExitProcess,NULL<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR> end start页:
[1]