用户操作
[即时聊天] [发私信] [加为好友]
小叶ID:constantine
11585次访问,排名10256(-3),好友41人,关注者111人。
典型的摩羯座男人
constantine的文章
原创 29 篇
翻译 0 篇
转载 14 篇
评论 21 篇
小叶的公告
所转载文章如果侵犯了你的权益,请告知我!
最近评论
Microsoft_China_Vip:


www.soAsp.net 编程学习网 技术+ 实例应用 讲解不错。 推荐大家!

有很多 技术资料也很好!



JIGSONG:在同事前哭了,太过于自己真情的流露吧。
男人都是脆弱的,呵呵
KUODY:又一次在这里找到答案,真是太感激了。感谢不尽!
constantine:那么你可以看微软提供的例子,可以先在windows上做的。我说的是单纯开发数据,可以先考虑把数据库操作封装成类。至于仿真器我没用过,像用仿真器最终也是需要编译出nk.nb0吧,然后才能用ms提供的程序让他跑起来,那么跟在板子上是一样的。wince6.0我没用过,vs2005跟wince也没直接关联,wince需要单独装的。
wang19847277:如果我没不用硬件平台,想在电脑上做,应该放到那个文件下呢?EMULATOR下?CEPC下?是WINCE500下呢,还是WINCE600下呢?装了2005就是WinCE6吧?请多指教,谢谢!
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 如何修改wince(s3c2410)的MAC地址?收藏

    新一篇: 【转】WinCE驱动开发问题精华集锦 | 旧一篇: PPPoE/PPPoA and LLC/VC

    wince中的MAC地址是在驱动中写死的。如果不修改会造成一些网络方面的功能故障。比如不能互ping。

     

    下面是我解决的方法:

     

    1.添加如下注册表
    [HKEY_LOCAL_MACHINE\Comm\CS8900\Parms]
    "MAC12"=dword:3322
    "MAC34"=dword:5544
    "MAC56"=dword:0F66

     

    2.修改CS8900驱动
    在CS8900.c文件中,作如下修改:

    1. WORD iMAC3={0x3322,0x5544,0x0F66};  //添加MAC地址的原始数据
    2. //添加函数,读取注册表中的MAC地址的值
    3. void ReadRegsister()
    4. {
    5.     HKEY hkMAC = NULL;
    6.     DWORD MAC;
    7.     DWORD dwStatus, dwType, dwSize;
    8.         TCHAR gszBaseInstance[256] = _T("\\Comm\\CS8900\\Parms");
    9.     // open the registry key and read our configuration
    10.     dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, KEY_ALL_ACCESS, &hkMAC);
    11.     dwType = REG_DWORD;
    12.     if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) 
    13.         {
    14.         dwSize = sizeof(DWORD);
    15.         //下面读取失败的话那么就用初始值作为MAC地址
    16.         dwStatus = RegQueryValueEx(hkMAC, _T("MAC12"), NULL, &dwType, (LPBYTE) &MAC, &dwSize);
    17.         if (dwStatus == ERROR_SUCCESS)
    18.         {
    19.             iMAC[0]=MAC;
    20.         }
    21.         dwStatus = RegQueryValueEx(hkMAC, _T("MAC34"), NULL, &dwType, (LPBYTE) &MAC, &dwSize);  
    22.         if (dwStatus == ERROR_SUCCESS)
    23.         {
    24.             iMAC[1]=MAC;
    25.         }
    26.         dwStatus = RegQueryValueEx(hkMAC, _T("MAC56"), NULL, &dwType, (LPBYTE) &MAC, &dwSize);  
    27.         if (dwStatus == ERROR_SUCCESS)
    28.         {
    29.             iMAC[2]=MAC;
    30.         }
    31.     }
    32. }
    33. int initCS()
    34. {   
    35.     CS8900WriteRegister(PKTPG_LINE_CTL, LINE_CTL_10_BASE_T);
    36.     CS8900WriteRegister(PKTPG_RX_CFG, RX_CFG_RX_OK_I_E);
    37.     CS8900WriteRegister(PKTPG_RX_CTL,RX_CTL_RX_OK_A | RX_CTL_IND_ADDR_A |RX_CTL_BROADCAST_A);
    38.     CS8900WriteRegister(PKTPG_TX_CFG, 0); 
    39.     CS8900WriteRegister(PKTPG_BUF_CFG, 0); 
    40.     
    41.     //modify by constantine 
    42.     ReadRegsister();
    43.     CS8900WriteRegister(PKTPG_INDIVISUAL_ADDR + 0, iMAC[0]);
    44.     CS8900WriteRegister(PKTPG_INDIVISUAL_ADDR + 2, iMAC[1]);
    45.     CS8900WriteRegister(PKTPG_INDIVISUAL_ADDR + 4, iMAC[2]);
    46.     initIrq();
    47.     return TRUE;
    48. }
    49. BOOLEAN CS8900ReadEthernetAddress(
    50.     IN PCS8900_ADAPTER Adapter
    51. )
    52. {
    53. //modify by constantine
    54.     //Adapter->PermanentAddress[0] = 0x22;
    55.     //Adapter->PermanentAddress[1] = 0x33;
    56.     //Adapter->PermanentAddress[2] = 0x44;
    57.     //Adapter->PermanentAddress[3] = 0x55;
    58.     //Adapter->PermanentAddress[4] = 0x66;
    59.     //Adapter->PermanentAddress[5] = 0x0F;
    60.     
    61.     Adapter->PermanentAddress[0] = iMAC[0]& 0x00FF;
    62.     Adapter->PermanentAddress[1] = iMAC[0]>>8;
    63.     Adapter->PermanentAddress[2] = iMAC[1]& 0x00FF;
    64.     Adapter->PermanentAddress[3] = iMAC[1]>>8;
    65.     Adapter->PermanentAddress[4] = iMAC[2]& 0x00FF;
    66.     Adapter->PermanentAddress[5] = iMAC[2]>>8; 
    67. //end    
    68.     RETAILMSG(1,
    69.         (TEXT("CS8900: PermanentAddress [ %02x-%02x-%02x-%02x-%02x-%02x ]\r\n"),
    70.             Adapter->PermanentAddress[0],
    71.             Adapter->PermanentAddress[1],
    72.             Adapter->PermanentAddress[2],
    73.             Adapter->PermanentAddress[3],
    74.             Adapter->PermanentAddress[4],
    75.             Adapter->PermanentAddress[5]));
    76.     //
    77.     // Use the burned in address as the station address, unless the
    78.     // registry specified an override value.
    79.     //
    80.     if ((Adapter->StationAddress[0] == 0x00) &
    81.         (Adapter->StationAddress[1] == 0x00) &
    82.         (Adapter->StationAddress[2] == 0x00) &
    83.         (Adapter->StationAddress[3] == 0x00) &
    84.         (Adapter->StationAddress[4] == 0x00) &
    85.         (Adapter->StationAddress[5] == 0x00)
    86.         )
    87.     {
    88.         RETAILMSG(1, (TEXT("CS8900: StationAddress Modified!...\r\n")));
    89.         Adapter->StationAddress[0] = Adapter->PermanentAddress[0];
    90.         Adapter->StationAddress[1] = Adapter->PermanentAddress[1];
    91.         Adapter->StationAddress[2] = Adapter->PermanentAddress[2];
    92.         Adapter->StationAddress[3] = Adapter->PermanentAddress[3];
    93.         Adapter->StationAddress[4] = Adapter->PermanentAddress[4];
    94.         Adapter->StationAddress[5] = Adapter->PermanentAddress[5];
    95.     }
    96.     return(TRUE);
    97. }

     

    编译后就可以了,这样就让驱动是从注册表中读取MAC地址了。那么接下来我们就有办法修改这个MAC地址了。

     

    3.写代码修改注册表

    下面是关键代码:

     

    1. void CWINCEMACDlg::ReadRegsister()
    2. {
    3.     HKEY hkMAC = NULL;
    4.     DWORD MAC=0;
    5.     DWORD dwStatus, dwType, dwSize;
    6.     TCHAR gszBaseInstance[256] = _T("\\Comm\\CS8900\\Parms");
    7.     // open the registry key and read our configuration
    8.     dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, KEY_ALL_ACCESS, &hkMAC);
    9.     dwType = REG_DWORD;
    10.     if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) 
    11.     {
    12.         dwSize = sizeof(DWORD);
    13.         dwStatus = RegQueryValueEx(hkMAC, _T("MAC12"), NULL, &dwType, (LPBYTE) &MAC, &dwSize);
    14.         if (dwStatus == ERROR_SUCCESS)
    15.         {
    16.             m_EDT0.Format(_T("%02x"),(MAC & 0x00ff));
    17.             m_EDT1.Format(_T("%02x"),(MAC >> 8));
    18.         }
    19.         dwStatus = RegQueryValueEx(hkMAC, _T("MAC34"), NULL, &dwType, (LPBYTE) &MAC, &dwSize);
    20.         if (dwStatus == ERROR_SUCCESS)
    21.         {
    22.             m_EDT2.Format(_T("%02x"),(MAC & 0x00ff));
    23.             m_EDT3.Format(_T("%02x"),(MAC >> 8));
    24.         }
    25.         dwStatus = RegQueryValueEx(hkMAC, _T("MAC56"), NULL, &dwType, (LPBYTE) &MAC, &dwSize);
    26.         if (dwStatus == ERROR_SUCCESS)
    27.         {
    28.             m_EDT4.Format(_T("%02x"),(MAC & 0x00ff));
    29.             m_EDT5.Format(_T("%02x"),(MAC >> 8));
    30.         }
    31.     }
    32.     RegCloseKey( hkMAC );
    33.     UpdateData(FALSE);
    34. }
    35. void CWINCEMACDlg::WriteRegsister()
    36. {
    37.     HKEY hkMAC = NULL;
    38.     DWORD dwStatus, dwSize;
    39.     TCHAR gszBaseInstance[256] = _T("\\Comm\\CS8900\\Parms");
    40.     dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, KEY_ALL_ACCESS, &hkMAC);
    41.     if(dwStatus == ERROR_SUCCESS ) 
    42.     {
    43.         dwSize = sizeof(DWORD);
    44.         int value;
    45.         TCHAR num[4]={0};
    46.         BYTE * lpBuffer;
    47.         UpdateData(TRUE);
    48.                 value=0;
    49.         wsprintf(num,L"0x%s", m_EDT1.GetBuffer(0));
    50.         value += _ttoi(num)<<8;
    51.         wsprintf(num,L"0x%s", m_EDT0.GetBuffer(0));
    52.         value += _ttoi(num);
    53.         lpBuffer = (BYTE *)&value;
    54.         RegSetValueEx(hkMAC, _T("MAC12"), 0, REG_DWORD, lpBuffer,dwSize);
    55.         value=0;
    56.         wsprintf(num,L"0x%s", m_EDT3.GetBuffer(0));
    57.         value += _ttoi(num)<<8;
    58.         wsprintf(num,L"0x%s", m_EDT2.GetBuffer(0));
    59.         value += _ttoi(num);
    60.         lpBuffer = (BYTE *)&value;
    61.         RegSetValueEx(hkMAC, _T("MAC34"), 0, REG_DWORD, lpBuffer,dwSize);
    62.         value=0;
    63.         wsprintf(num,L"0x%s", m_EDT5.GetBuffer(0));
    64.         value += _ttoi(num)<<8;
    65.         wsprintf(num,L"0x%s", m_EDT4.GetBuffer(0));
    66.         value += _ttoi(num);
    67.         lpBuffer = (BYTE *)&value;
    68.         RegSetValueEx(hkMAC, _T("MAC56"), 0, REG_DWORD, lpBuffer,dwSize);
    69.     }
    70.     RegCloseKey( hkMAC );
    71. }

     

    4.如果有外接EEPROM之类的话,那么一般是写在EEPROM里面的,而不是写注册表。如果这种实现方式必须采用Hive方式的注册表。不然也是保存不了的。

    5.特别说明
    MAC地址一般由12个16进制数字组成,每2个为一组,前面3组代表网络硬件制造商的编号,这个一般是由IEEE来分配。
    后面3组代表该制造商所制造的某个网络产品的序列号。这样也就为什么我们说MAC地址是唯一的了(当然前提是你没有自己修改过)。
    wince驱动由于比较特殊,6组值要写入3个IO里面一个IO只能写入16个字节,为了方便我就不按照正常定义为两个部分,
    而是简单定义成3个部分,这样容易写代码。
    必须说明的是MAC地址前3组值不是能随便更改的,我们一般就改动后3组就行了。非要改就要找一个制造商的编号才行。
    另外如果不修改MAC地址不组网是没有问题的,但是如果组网就会有一些小问题,比如ping,wince之间无法相互ping。当然还有别的。

     

     

    发表于 @ 2008年08月28日 11:05:00|评论(loading...)|编辑|收藏

    新一篇: 【转】WinCE驱动开发问题精华集锦 | 旧一篇: PPPoE/PPPoA and LLC/VC

    评论

    #kabby 发表于2008-10-17 16:16:51  IP: 172.28.92.*
    小叶你好,我想请问你关于在注册表中添加的MAC,类型为DWORD吗?为什么在我的模拟器中,添加MAC为
    DWORD,但是键值中就没有办法写入字母呢?
    例如你的 "MAC56"=dword:0F66 F就无法输入。
    是跟模拟器有关吗?我用的是CE 5.0 EMULATOR.
    谢谢!
    #constantine 发表于2008-10-17 17:38:03  IP: 61.144.174.*
    是DWORD,没有必要用字符串再解析嘛!
    你是怎么写入注册表的?写入是整数,何来‘F’,那只是16进制的表示方法,如果用远程工具链接去wince看注册表看到的是10进制的,会有差异。
    另外如果你的注册表方式不对,那么也没有什么意思。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 小叶