首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

GetAdaptersInfo函数在64位系统上返回ERROR_NOACCESS的有关问题

2012-11-23 
GetAdaptersInfo函数在64位系统下返回ERROR_NOACCESS的问题实际应用中一个程序在长时间运行后内存占用较高

GetAdaptersInfo函数在64位系统下返回ERROR_NOACCESS的问题

实际应用中一个程序在长时间运行后内存占用较高时发生崩溃,从dump信息中,发现GetAdaptersInfo函数返回了一个奇怪的错误码998(ERROR_NOACCESS),百度搜索不到相关的信息。MSDN上GetAdaptersInfo函数的错误码正常情况下只有5种。并且一共发生的两次崩溃都出现在一台Win7 64位机器上,其他测试机器均正常。

有问题的代码如下:

?

void GetMacAddr(char *buf) {    BOOL bNewState = TRUE;    //PIP_ADAPTER_INFO结构体指针存储本机网卡信息    PIP_ADAPTER_INFO pIpAdapterInfo = new(std::nothrow) IP_ADAPTER_INFO;    if (pIpAdapterInfo == NULL)    {        return;    }    //得到结构体大小,用于GetAdaptersInfo参数    unsigned long stSize = sizeof(IP_ADAPTER_INFO);    //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量    ULONG ulRel = GetAdaptersInfo (pIpAdapterInfo, &stSize);    if (ERROR_BUFFER_OVERFLOW == ulRel)    {        bNewState = FALSE;        delete pIpAdapterInfo;        //重新申请内存空间用来存储所有网卡信息        pIpAdapterInfo = (PIP_ADAPTER_INFO)new(std::nothrow) BYTE[stSize];        if (pIpAdapterInfo == NULL)        {            return;        }        //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量        ulRel = GetAdaptersInfo (pIpAdapterInfo, &stSize);     }    string strIpMac;    if (ERROR_SUCCESS==ulRel)    {        //输出网卡信息        //可能有多网卡,因此通过循环去判断        PIP_ADAPTER_INFO pIpAdapterInfoTmp = pIpAdapterInfo;        while (pIpAdapterInfoTmp != NULL)        {            char szMac[10] = {0};            for (UINT i =0; i < pIpAdapterInfoTmp->AddressLength; i++)            {                if (i==pIpAdapterInfoTmp->AddressLength-1)                {                    _snprintf_s(szMac, 10, "%02x;", pIpAdapterInfoTmp->Address[i]);                    strIpMac += szMac;                }                else                {                    _snprintf_s(szMac, 10, "%02x-", pIpAdapterInfoTmp->Address[i]);                    strIpMac += szMac;                }            }            pIpAdapterInfoTmp = pIpAdapterInfoTmp->Next;        }    }    //释放内存空间    if (pIpAdapterInfo != NULL)    {        if (bNewState == FALSE)        {            delete[] pIpAdapterInfo;        }        else        {            delete pIpAdapterInfo;        }    }    if (strIpMac[strIpMac.length()-1] == ';')    {        strIpMac[strIpMac.length()-1] = '\0';    }    sprintf(buf,"%s",strIpMac.c_str());    return;}
?

?

?

?

?

即32位程序,运行在64位操作系统,超过2GB的进程内存占用,同样佐证了我们的猜测。

热点排行