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地址無需從新啓動debug

//////////////////////orm

#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版將上面函數封裝成一個靜態庫使用。ip

相關文章
相關標籤/搜索