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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • B 站上有哪些很好的学习资源?[通俗易懂]

    B 站上有哪些很好的学习资源?[通俗易懂]哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!!最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇдˇ◕ฺ;)ノ下面我们就来盘点一下B站上优质的学习资源:综合类Oeasy:综合…

    2022年7月17日
    11
  • 小波变换和小波阈值法去噪[通俗易懂]

    小波变换和小波阈值法去噪[通俗易懂]小波变换是一种信号的时间——尺度(时间——频率)分析方法,它具有多分辨分析的特点,而且在时频两域都具有表征信号局部特征的能力,。在小波分析中经常用到近似和细节,近似表示信号的高尺度,即低频信息;细节表示信号的低尺度,即高频信息。对含有噪声的信号,噪声分量的主要能量集中在小波解的细节分量中。在以上过程中,小波基和分解层数的选择,阈值的选取规则,和阈值函数的设计,都是影响最终去噪效果的关键因素。

    2022年5月29日
    37
  • PLSQL Developer 安装使用教程详解

    PLSQL Developer 安装使用教程详解下载plsqldeveloper:官网下载:https://www.allroundautomations.com/registered-plsqldev/我下载的是10.0.3这个版本,目前版本已经达到了14,下载后顺带把ChineseLanguagepack下载一下,一会可以将软件的语言改为中文;安装plsqldeveloper下载完成后:选择plsqldev文件(注意这里标注的默认安装路径需要修改,改成路径中不含空格和中文的路径,否则,安装了,无法进行远程连接。)安

    2022年6月6日
    53
  • android 骨骼动画教程,使用DragonBones开发FLASH骨骼动画入门教程

    android 骨骼动画教程,使用DragonBones开发FLASH骨骼动画入门教程转载自:http://dragonbones.github.io/getting_started_cn.htmlDragonBones快速入门指南DragonBones快速入门指南采用知识共享协议3.0版本。目录DragonBones是什么?DragonBones是一套开源的2D骨骼动画框架和工具,它包含了基于FlashPro的骨骼动画编辑面板DragonBonesDesignPanel及骨骼…

    2022年6月11日
    24
  • 递归和迭代的差别

    递归和迭代的差别

    2021年11月30日
    38
  • dpkg详解_historian授权

    dpkg详解_historian授权1.dpkg描述    dpkg是一个安装、创建、移除和管理debian包的工具。更多使用界面友好的dpkg的前端”dselect”,。dpkg完全受控于命令行参数,和零个或更多参数正确的组成一个操作方式。参数告诉dpkg要做什么和多种选项控制不同的行为。dpkg不仅提供了大量的参数选项,同时也提供了许多子命令比如:dpkg-debdpkg-divertdpkg-query

    2022年10月6日
    0

发表回复

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

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