Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1326101
  • 博文数量: 436
  • 博客积分: 7854
  • 博客等级: 少将
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 16:30
文章分类

全部博文(436)

文章存档

2013年(2)

2012年(56)

2011年(70)

2010年(308)

分类:

2010-06-12 16:15:11

IPHELP库里的函数,可惜我的VS2005没了。又不想去下SDK(要是SDK是一个文件还好,偏偏那么多)

于是想到,直接从DLL里获得函数地址
存在于这个文件中

其函数原型如下:
DWORD GetAdaptersInfo(
__out    PIP_ADAPTER_INFO pAdapterInfo,
__inout PULONG pOutBufLen
);
我们要从DLL中定位并使用这个函数,就必须申明其用到的结构

这个结构体的原型
typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO *Next;//结构列表的下一个节点
DWORD                   ComboIndex;//保留
char                    AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//网卡名称
char                    Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//网卡描述
UINT                    AddressLength;//网卡地址长度
BYTE                    Address[MAX_ADAPTER_ADDRESS_LENGTH];//MAC地址
DWORD                   Index;//网络接口索引号
UINT                    Type;//网络接口类型
UINT                    DhcpEnabled;//是否启用DHCP
PIP_ADDR_STRING         CurrentIpAddress;//当前IP地址(不知道为什么我输出错误--!)
IP_ADDR_STRING          IpAddressList;//IP地址列表
IP_ADDR_STRING          GatewayList;//网关地址列表
IP_ADDR_STRING          DhcpServer;//DHCP服务器地址
BOOL                    HaveWins;//是否启动了Wins服务
IP_ADDR_STRING          PrimaryWinsServer;//主Wins服务地址
IP_ADDR_STRING          SecondaryWinsServer;//次Wins服务
time_t                  LeaseObtained;//DHCP租赁时间
time_t                  LeaseExpires;//DHCP租赁失效时间
}IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

这个结构体中,有几个宏,其定义如下
#define MAX_ADAPTER_NAME_LENGTH 256
#define MAX_ADAPTER_DESCRIPTION_LENGTH 128
#define MAX_ADAPTER_ADDRESS_LENGTH 8

其中表示IP地址列表的结构
typedef struct _IP_ADDR_STRING {
    struct _IP_ADDR_STRING* Next;//下一个节点
    IP_ADDRESS_STRING IpAddress;//IP地址
    IP_MASK_STRING IpMask;//子网掩码
    DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;

表示IP的结构
typedef struct {
char String[4 * 4];
}IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;

最后是这个函数的压栈声明
//函数压栈申明
typedef DWORD (__stdcall *pGetAdaptersInfo)(PIP_ADAPTER_INFO,PULONG);

以上就是用到的全部结构的声明

在这个dll中定位

HMODULE hInst = LoadLibrary("iphlpapi.dll");
    if(!hInst)
    {
        MessageBox("无法加载iphlpapi.dll!","错误",MB_OK+MB_ICONSTOP);
    }
    pGetAdaptersInfo GetAdaptersInfo = (pGetAdaptersInfo)GetProcAddress(hInst,"GetAdaptersInfo");
    if (GetAdaptersInfo==NULL)
    {
        MessageBox("无法定位到函数GetAdaptersInfo地址!","错误",MB_OK+MB_ICONSTOP);
        exit(0);
    }
    else
    {
        //
        int nIndex=0;
        ULONG uOutBufLen=0;//存放网卡信息的缓冲区大小
        pIPAdapterInfo=(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
        //第一次调用GetAdapterInfo获取ulOutBufLen大小
        if((GetAdaptersInfo(pIPAdapterInfo,&uOutBufLen))==ERROR_BUFFER_OVERFLOW)
        {
            //获取需要的缓冲区大小
            free(pIPAdapterInfo);
            pIPAdapterInfo=(PIP_ADAPTER_INFO)malloc(uOutBufLen);//分配所需要的内存
        }
        if((GetAdaptersInfo(pIPAdapterInfo,&uOutBufLen))==NO_ERROR)//获取网卡信息
        {
            //保存网卡信息
            //...........
        }
    }

程序运行界面

由于文件不大,我就把程序直接压制到下面的图片里了

另存图片到本地,改图片扩展名为rar,解压就可以看到程序了

以太网网卡

ADSL拨号网卡


微软一直给我们提供头文件,把大家都惯坏了。用起dll定位来,真麻烦
阅读(5647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~