现在的位置: 首页 > 综合 > 正文

WinCE冷启动自动修改IP

2012年08月09日 ⁄ 综合 ⁄ 共 3604字 ⁄ 字号 评论关闭
include   <winioctl.h>
#include   <ntddndis.h>

void main()
{
 CString m_strIp,m_strMask,m_strGateWay,m_strServerIP;
 DWORD m_dwServerPort = 0;
 FILE * fp;
 if ((fp = fopen("//Flash Disk//IP.txt","r")) == NULL)//读取存卡中的配置文件
 {
  MessageBox(NULL,_T("打开Ip.txt文件失败"),NULL,0);
  return;
 }
 char buf[MAX_PATH];
 memset(buf,0,MAX_PATH);
 fscanf(fp,"%s",buf);
 fclose(fp);
 char * p = buf;

//读取IP地址
 while (*p && *p !=',')
 {
  m_strIp += *p++;
 }
 p++;

//读取子网掩码

 while (*p && *p !=',')
 {
  m_strMask += *p++;
 }
 p++;

//读取网关
 while (*p && *p !=',')
 {
  m_strGateWay += *p++;
 }
 p++;

//读取服务器IP

 while (*p && *p !=',')
 {
  m_strServerIP += *p++;
 }
 p++;

//读取服务器端口
 while (*p && *p !=',')
 {
  m_dwServerPort *= 10;
  m_dwServerPort += (*p++ -'0');
 }

 //获得网卡的设备名
 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 )
 {
  MessageBox(NULL,_T("获得网卡名时打开设备错误"),NULL,0);
  return;
 }
 
 // Get list of adapter names
 if (!DeviceIoControl(m_hFileHandle,
  IOCTL_NDIS_GET_ADAPTER_NAMES,
  NULL,0,
  Names,MAX_PATH,&bytes,NULL))
 {
  MessageBox(NULL,_T("获得网卡名错误"),NULL,0);
  return;
 }
 DWORD len = wcslen(Names);
 Names[len] = 0;
 Names[len+1] = 0;
 CString strKeyName;
 strKeyName.Format(_T("Comm//%s//Parms//TCPIP"),Names);
 

//打开注册表对网卡IP信息对应子健进行修改
 HKEY   hkey; 
 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName,0,KEY_WRITE,&hkey)   !=   ERROR_SUCCESS)  
 {
  MessageBox(NULL,TEXT("打开注册表错误"),NULL,0);  
  return;
 }
    DWORD   value;  
 value   =   0;
 WCHAR buffer[50];

 //set   EnableDHCP  
 if(RegSetValueEx(hkey,TEXT("EnableDHCP"),0,REG_DWORD,(const   unsigned   char   *)&value,sizeof(DWORD))   !=   ERROR_SUCCESS)  
  MessageBox(NULL,TEXT("关闭自动获得IP错误"),NULL,0);  
 //set   ip   address  
 memset(buffer,0,100);
 memcpy(buffer,m_strIp.GetBuffer(0),m_strIp.GetLength()*2);
 if(RegSetValueEx(hkey,TEXT("IpAddress"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, m_strIp.GetLength()*2+2) !=   ERROR_SUCCESS)  
  MessageBox(NULL,TEXT("设置IP错误"),NULL,0);
 //set   subnet   mask 
 memset(buffer,0,100);
 memcpy(buffer,m_strMask.GetBuffer(0),m_strMask.GetLength()*2);
 if(RegSetValueEx(hkey,TEXT("SubnetMask"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, m_strMask.GetLength()*2+2) !=   ERROR_SUCCESS)  
  MessageBox(NULL,TEXT("设置子网掩码错误"),NULL,0);  
 //set   gateway
 memset(buffer,0,100);
 memcpy(buffer,m_strGateWay.GetBuffer(0),m_strGateWay.GetLength()*2);
 if(RegSetValueEx(hkey,TEXT("DefaultGateway"),0,REG_MULTI_SZ,(const   unsigned   char   *)buffer, m_strGateWay.GetLength()*2+2) !=   ERROR_SUCCESS)  
  MessageBox(NULL,TEXT("设置网关错误"),NULL,0);
 RegFlushKey(hkey);
 RegCloseKey(hkey);

// 重启网卡,不用机器热启动
 HANDLE hNdis = CreateFile(_T("NDS0:"), 0,  0,  NULL,
  OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL,
  (HANDLE) INVALID_HANDLE_VALUE);
 if( hNdis == INVALID_HANDLE_VALUE )
 {
  MessageBox(NULL,_T( "重启网络驱动时打开设备错误"),NULL,0);
  return;
 }
 
 // Send the device command.
 if (!DeviceIoControl( hNdis, IOCTL_NDIS_REBIND_ADAPTER,
  Names, _tcslen( Names) + sizeof( TCHAR ),    // buf contains the name of the
  NULL, 0, NULL, NULL ) )
 {
  MessageBox(NULL,_T( "重启网络驱动错误"),NULL,0); 
 }
 
 CloseHandle( hNdis );

//下面为把服务器的IP和端口存入注册表

 HKEY hOpenKey;
 DWORD dwOpenStyle;
 long lResult = 0;

 LPCTSTR keyName = L"MySoftware//CEClient";
 lResult = RegCreateKeyEx(HKEY_CURRENT_USER,keyName,0,L"",0,0,NULL,&hOpenKey,&dwOpenStyle);
 ASSERT(lResult == ERROR_SUCCESS);
 
    //write host
 lResult = RegSetValueEx(hOpenKey, L"host",0,REG_SZ,(BYTE *)m_strServerIP.GetBuffer(0),m_strServerIP.GetLength() * 2);
 ASSERT(lResult == ERROR_SUCCESS);

 //write port
 lResult = RegSetValueEx(hOpenKey, L"port",0,REG_SZ,(BYTE *)&m_dwServerPort,sizeof(m_dwServerPort));
 ASSERT(lResult == ERROR_SUCCESS);

 RegCloseKey(hOpenKey);
 

附:IP.txt文件内容如下:

10.18.3.103,255.255.0.0,10.18.3.1,10.18.3.191,8062

 

抱歉!评论已关闭.