Wince之旅——设备控制(重启网卡为例)

Wince之旅——设备控制(重启网卡为例)

其实根据我的实践,在wince下面重启网卡其实十分简单,直接把驱动程序和网卡分离然后再绑定一次就好了。怎么绑定呢。就是一个函数DeviceIoControl和底层通信下。

方法1 :把第二个参数设为IOCTL_NDIS_REBIND_ADAPTER。直接分离和绑定

方法2 :把第二个参数设为IOCTL_NDIS_UNBIND_ADAPTER分离,然后再IOCTL_NDIS_BIND_ADAPTER绑定也能达到相同的效果。

我测试用的平台是X86的wince5.0。当然用DeviceIoControl的第一个参数需要获取设备的句柄 : 
hNdis = CreateFile(DD_NDIS_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,
                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
                        0, NULL);
        

        其实wince对网卡的控制函数做的已经不错了。用DeviceIoControl后面第二个参数带IOCTL_NDIS_GET_ADAPTER_NAMES的话很容易获取到网卡的名字,可以用来遍历网卡。如果照我所说的方法,编译出现问题,你可能没包含ntddndis.h这个头文件。

//

///WinCE下重新设置IP地址无需重新启动

//

#include <ndis.h>
    bool SetIpAddress(CString m_strIp,CString m_strMask,CString m_strGateWay)
    {

    //获得网卡的设备名
    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 false;
    }
    // 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 false;
    }
    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 false;
    }
    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 false;
    }
    // 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 );
    return true;
    }
    需注意:1 使用标准SDK的朋友,可能用到的头文件有:pkfuncs.h,toolhelp.h,lss.h,自己需要到你的WINCE500目录下搜索这几个头文件;2 你的WINCE工程目录输出若不是debug版,上面头文件可能使用有错误,使用Release版将上面函数封装成一个静态库使用。

转载于:https://my.oschina.net/u/3874841/blog/3028134

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101024.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 青蛙过河谁先过_python knn算法实现

    青蛙过河谁先过_python knn算法实现一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k – 1、k 或 k + 1 个单位。 另请注意

    2022年8月9日
    4
  • 公有云和私有云的区别 如何搭建云存储

    公有云和私有云的区别 如何搭建云存储云存储这样的隐喻或许感觉会有些夸张,但我们从中仍能感觉到和云相关的模糊的概念,对于这项技术的未来也是充满了未知,这对我们熟知的私有云存储也是一样。虽然市场上各种宣传的私有云存储都声称自己受益于在原有公有云上增加了防火墙,然而却有迹象表明私有云存储的名声却逐渐降到公共存储之下。说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此…

    2022年6月17日
    44
  • python专业版激活成功教程_pycharm专业版和社区版的区别

    python专业版激活成功教程_pycharm专业版和社区版的区别PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm最常用的两个版本就是社区版和专业版,这两个版本区别如下:专业版和社区版的区别除了这两版本之外,还有一个版本就是教育版,这三个有什么区别呢?1.收费不同首先就是三者的收费不同:专业版是收费的,另外两个是免费的。2.功能不同pyCharm专业版是功能最丰富的,与社区版相比,PYc…

    2022年8月25日
    10
  • 3D编程软件(3d动画需要编程吗)

    本篇文章中,我们学习了UnityShader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照、材质与颜色的具体写法。写了6个Shader作为本文Shader讲解的实战内容,最后创建了一个逼真的暴风雪场景进行了Shader的测试。依旧是国际惯例先上本文配套程序的截图。先是一张远眺图:

    2022年4月11日
    37
  • 使用 IntraWeb (16) – 基本控件之 TIWList、TIWListbox、TIWComboBox、TIWOrderedListbox

    使用 IntraWeb (16) – 基本控件之 TIWList、TIWListbox、TIWComboBox、TIWOrderedListbox

    2021年8月31日
    46
  • ftp客户端软件,8款最受欢迎的ftp客户端软件

    对于ftp客户端软件,你了解多少?其实一般人也接触不到这种软件。ftp客户端软件主要是针对从事网站管理的工作人员比较有利的一款工具。可以帮助他们快速的解决工作中的问题。方便、简单、快捷又明了的解决问题,下面有六款ftp客户端软件的介绍。第一款:IIS7服务器管理工具这款工具是真的好用,童叟无欺的那种好用。在我心里它是排在中文版javaftp工具类中的榜首的。它不仅拥有每个javaftp工具类都具备的批量管理功能,还具备很多你意想不到的地方,比如定时同步(上传和下载)、多任务同时进行、定时备份还能够自

    2022年4月5日
    103

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号