平台:MINI 2440
系统:Windows CE6.0
问题描述:代码如下,之前在CE5.0下是能够正常使用的,而现在虽然能够通过修改注册表的方式修改IP地址,但是修改地址后调用DeviceIoControl函数来重启网卡失败;代码的返回值为9,也就是在REBIND的时候出错了。
初步分析:在创建了句柄后,使用DeviceIoControl函数获取网卡名时获取到的不是网卡的名字DM9CE1,而是另一个连接的名字USB Cable,可能正因为这个原因导致了后面对USB Cable做rebind的操作失败;
想要获得的帮助:这种在系统存在多个网络连接的情况下应该怎么对指定的网卡进行REBIND的操作呢?谢谢大家了。
//获得网卡的设备名
WCHAR Names[50];
DWORD bytes;
HANDLE m_hFileHandle = CreateFile(_T("NDS0:"), 0, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) INVALID_HANDLE_VALUE);
if( m_hFileHandle == INVALID_HANDLE_VALUE )
{
//获得网卡名时打开设备错误
return 1;
}
// Get list of adapter names
if (!DeviceIoControl(m_hFileHandle,
IOCTL_NDIS_GET_ADAPTER_NAMES,
NULL,0,
Names,MAX_PATH,&bytes,NULL))
{
//获得网卡名错误
CloseHandle(m_hFileHandle);
return 2;
}
MessageBox(NULL, Names, L"dll", MB_OK); //此处输出的网卡名为USB Cable,感觉找到的不是以太网卡
CloseHandle(m_hFileHandle);
//因为网卡实际名为DM9CE1,因此下面的修改和重启操作都使用的Names2这个数组来存放的网卡名
WCHAR Names2[50] = _T("DM9CE1");
DWORD len = wcslen(Names2);
Names2[len] = 0;
Names2[len+1] = 0;
//修改IP地址、掩码、网关等,此处省略,因为可以看到这些信息是成功设置了的
……………………
// 重启网卡,不用机器热启动
HANDLE hNdis = CreateFile(_T("NDS0:"), 0, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) INVALID_HANDLE_VALUE);
if( hNdis == INVALID_HANDLE_VALUE )
{
//重启网络驱动时打开设备错误
return 8;
}
// Send the device command.
//调用DeviceIoControl来重启网卡就出现问题,感觉是重启的操作并没有对网卡做这个操作,因为上面返回的信息是
//USB连接,不知道是不是系统上另外建立了一个基于USB的连接的原因。
BOOL retValue = DeviceIoControl( hNdis, IOCTL_NDIS_REBIND_ADAPTER,
Names2, _tcslen( Names2) + sizeof( TCHAR ), // buf contains the name of the
NULL, 0, NULL, NULL );
if (!retValue)
{
//重启网络驱动错误
CloseHandle( hNdis );
//return err_code;
return 9;
}
//这种有多个连接的情况该怎么处理呢?怎么样来实现对网卡的重启呢?
请大家帮帮忙啊,后天就要交货了,现在突然出现了这个问题。