1. 程式人生 > >用SetupDi* 啟用/禁用網絡卡

用SetupDi* 啟用/禁用網絡卡

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>   // cfgmgr32.h 在Microsoft Windows 2000 DDK 中.
#pragma comment(lib,"setupapi.lib")

BOOL IsDisableable(DWORD dwDevID, HDEVINFO hDevInfo) ;
BOOL IsDisabled(DWORD dwDevID, HDEVINFO hDevInfo) ;
BOOL StateChange( DWORD dwNewState, DWORD dwDevID, HDEVINFO hDevInfo) ;

//////////////////////////////////////////////////////////////////////////
// 獲得設備註冊表中的內容
//////////////////////////////////////////////////////////////////////////
BOOL GetRegistryProperty( HDEVINFO DeviceInfoSet, 
                        PSP_DEVINFO_DATA DeviceInfoData, 
                        ULONG Property, 
                        PVOID Buffer, 
                        PULONG Length ) 
{ 
    while ( !SetupDiGetDeviceRegistryProperty( DeviceInfoSet, 
                                               DeviceInfoData, 
                                               Property, 
                                               NULL, 
                                               (BYTE *)*(TCHAR **)Buffer, 
                                               *Length, 
                                               Length)) 
    { 
        // 長度不夠則重新分配緩衝區
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
        { 
            if (*(LPTSTR *)Buffer) 
                LocalFree(*(LPTSTR *)Buffer); 

            *(LPTSTR *)Buffer = (PCHAR)LocalAlloc(LPTR,*Length); 
        } 
        else 
        {
            return false; 
        }
    } 

    return (BOOL)(*(LPTSTR *)Buffer)[0]; 
} 

BOOL EnableDevice(DWORD dwDevID, HDEVINFO hDevInfo)
{
    return StateChange(DICS_ENABLE,dwDevID,hDevInfo);
}

BOOL DisableDevice(DWORD dwDevID, HDEVINFO hDevInfo)
{
    return StateChange(DICS_DISABLE,dwDevID,hDevInfo);
}

BOOL ControlDevice(DWORD dwDevID, HDEVINFO hDevInfo)
{
    BOOL bCanDisable;
    bCanDisable = (IsDisableable(dwDevID,hDevInfo) && (!IsDisabled(dwDevID,hDevInfo)));
    if(bCanDisable)
        return DisableDevice(dwDevID,hDevInfo);
    else
        return EnableDevice(dwDevID,hDevInfo);
}



void EnumNetCards() 
{         
    
    DWORD Status, Problem; 
    LPTSTR Buffer = NULL; 
    DWORD BufSize = 0; 

    // 返回所有裝置資訊
    HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES) ; 

    if (INVALID_HANDLE_VALUE == hDevInfo )        
        return; 

    
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; 

    
        

    //////////////////////////////////////////////////////////////////////////
    // 列舉裝置
    //////////////////////////////////////////////////////////////////////////
    for ( DWORD DeviceId=0; 
        SetupDiEnumDeviceInfo( hDevInfo,DeviceId,&DeviceInfoData); 
        DeviceId++) 
    { 

        // 獲得裝置的狀態
        if (CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst ,0) != CR_SUCCESS) 
            continue; 
                

        // 獲取裝置類名
        TCHAR szDevName [MAX_PATH] = _T("") ;
        if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize)) 
        {
            lstrcpyn( szDevName, Buffer, MAX_PATH ) ;            
        }


        if ( lstrcmp( szDevName, _T("Net") ) == 0 )            
        {             
            TCHAR szName [MAX_PATH] = _T("") ;
            if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize)) 
            {
                lstrcpyn( szName, Buffer, MAX_PATH ) ;
            }


            if ( lstrcmp( szName, _T("ROOT") ) != 0 )                
            { 

                if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize)) 
                {
                    lstrcpyn( szName, Buffer, MAX_PATH ) ;

                    // 獲取裝置描述
                    if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize)) 
                    {
                        
                        lstrcpyn( szName, Buffer, MAX_PATH ) ;

                        
                        if(ControlDevice(DeviceId,hDevInfo))
                        {
                            printf("Successful\n");
                        }
                        else 
                        {
                            printf("FAILED\n");        
                        }
                        
                    }                    
                }
            } 
        } 
    } 

    SetupDiDestroyDeviceInfoList(hDevInfo);
} 

BOOL StateChange( DWORD dwNewState, DWORD dwDevID, HDEVINFO hDevInfo)
{
    SP_PROPCHANGE_PARAMS PropChangeParams;
    SP_DEVINFO_DATA        DevInfoData = {sizeof(SP_DEVINFO_DATA)};
    SP_DEVINSTALL_PARAMS devParams;

    //查詢裝置資訊
    if (!SetupDiEnumDeviceInfo( hDevInfo, dwDevID, &DevInfoData))
    {
        OutputDebugString("SetupDiEnumDeviceInfo FAILED");
        return FALSE;
    }

    //設定裝置屬性變化引數
    PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    PropChangeParams.Scope = DICS_FLAG_GLOBAL; //使修改的屬性儲存在所有的硬體屬性檔案
    PropChangeParams.StateChange = dwNewState;
    PropChangeParams.HwProfile = 0;


    //改變裝置屬性
    if (!SetupDiSetClassInstallParams( hDevInfo,
                                        &DevInfoData,
                                        (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
                                        sizeof(PropChangeParams)))
    {
        OutputDebugString("SetupDiSetClassInstallParams FAILED");
        return FALSE;
    }
    
    
    PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;//使修改的屬性儲存在指定的屬性檔案
    PropChangeParams.StateChange = dwNewState;
    PropChangeParams.HwProfile = 0;

    //改變裝置屬性並呼叫安裝服務
    if (!SetupDiSetClassInstallParams( hDevInfo,
                                       &DevInfoData,
                                       (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
                                       sizeof(PropChangeParams)) ||
        !SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DevInfoData))
    {
        OutputDebugString("SetupDiSetClassInstallParams or SetupDiCallClassInstaller FAILED");
        return TRUE;
    }
    else
    { 
        //判斷是否需要重新啟動
        devParams.cbSize = sizeof(devParams);
        if (!SetupDiGetDeviceInstallParams( hDevInfo, &DevInfoData, &devParams))
        {
            OutputDebugString("SetupDiGetDeviceInstallParams FAILED");
            return FALSE;
        }

        if (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))
        {
            OutputDebugString("Need Restart Computer");
            return TRUE;
        }
        return TRUE;
    }
}


BOOL IsDisableable(DWORD dwDevID, HDEVINFO hDevInfo)
{
    SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)};
    DWORD    dwDevStatus,dwProblem;
    if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData))
    {
        OutputDebugString("SetupDiEnumDeviceInfo FAILED");
        return FALSE;
    }
    //查詢裝置狀態
    if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)
    {
        OutputDebugString("CM_GET_DevNode_Status FAILED");
        return FALSE;
    }
    return ((dwDevStatus & DN_DISABLEABLE) && (dwProblem != CM_PROB_HARDWARE_DISABLED));
}

BOOL IsDisabled(DWORD dwDevID, HDEVINFO hDevInfo)
{
    SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)};
    DWORD    dwDevStatus,dwProblem;
    if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData))
    {
        OutputDebugString("SetupDiEnumDeviceInfo FAILED");
        return FALSE;
    }

    //查詢裝置狀態
    if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)
    {
        OutputDebugString("CM_GET_DevNode_Status FAILED");
        return FALSE;
    }
    return ((dwDevStatus & DN_HAS_PROBLEM) && (dwProblem == CM_PROB_DISABLED));
}

int main(int argc, char* argv[])
{        
    EnumNetCards() ;
    return 0 ;
}  

一個啟用/禁用網絡卡的程式,在VC 6.0編譯執行,需要安裝windows DDK,更新VC庫檔案,安裝windows SDK。

相關推薦

SetupDi* 啟用/禁用

#include <windows.h> #include <tchar.h> #include <stdio.h> #include <SetupAPI.h> #include <cfgmgr32.h> //

Windows 下通過命令列啟用禁用

建議將系統的網絡卡名改成英文名,這樣在輸入命令的時候會很方便。 例如: 第一塊無線網絡卡可取名為 wlan0 第一塊有線網絡卡可取名為 eth0,依此類推。 我電腦中的網絡卡命名如下圖所示: 首先以管理員身份身份執行 cmd 程式 禁用無線網絡卡:netsh inter

啟用無線至monitor模式遇到的問題

安裝完Kali Linux系統後就要投入運用,那麼最首先的,也是最低階的,是要破解WEP加密,這就要用到aircrak-ng包含的元件airmon-ng,而這個元件用於改變無線網絡卡的工作模式,以便其他工具的順利使用。 1.插入無線網絡卡,輸入命令iwconfig:   可

linux啟用無線上網

1、使用cat /proc/version檢視linux核心版本號,我的系統是Linux version 2.6.32-220.el6.i686 2、使用cat /etc/issue檢視linux發行版本號,我的系統是Red Hat Enterprise Linux Ser

win10 同步批處理禁用啟用

    @ echo off echo 正在啟用超級管理員許可權... %1 %2 ver|find "5.">nul&&goto :st mshta vbscript:createobject("shell.application").shelle

bat指令碼控制禁用啟用

純DOS就可以搞定。 核心程式碼: netsh interface set interface "本地連線" disabled netsh interface set interface "本地連線" enabled 其中"本地連線"是網絡卡的名字,通過“控制面板\網路和

linux 如何禁用啟用

ifup、ifdown:linux命令   實時地手動修改一些網路介面引數,可以利用ifconfig來實現,如果是要直接以配置檔案,亦即是在 /etc/sysconfig/network-scripts裡面的ifcfg-ethx等檔案的設定引數來啟動的話,那就

CentOS啟用&系統MAC地址重複

編輯配置檔案: # vi /etc/sysconfig/network-scripts/ifcfg-eth0  將ONBOOT=no改成yes 儲存退出,重啟網絡卡 vm虛擬機器克隆,系統MAC和UUID會重複,導致獲取不到IP 報錯:device eth0 does not seem

ifconfig命令,只有lo,沒有其他(拷貝來的虛擬機器)

1. ifconfig -a 檢視當前的網絡卡 2. ifconfig *** up 將你需要的網絡卡啟動 。此時用ifconfig,只能看到inet6(ipv6?)的地址,沒有inet的地址(即Xshell連線輸入的ip)。 3. 修改/etc/sysconfig/network

複製linux虛擬機器後不能的解決方法

複製Linux虛擬機器,發現原eth0網絡卡無法使用。原來只有eth0網絡卡,卻新增了一個eth1網絡卡,IP地址配置在eth0上。 原因: VM複製後,MAC地址變動,Linux認為新網絡卡,那原網絡卡不可用了。       1、編輯udev下的70-persist

windows系統禁用多餘禁用看不到的虛擬(多個ip出現情況下)

轉載地址:https://jingyan.baidu.com/article/17bd8e522662b485ab2bb8eb.html 1.在計算機(我的電腦或此電腦)上點選滑鼠右鍵,選擇【管理】,開啟計算機管理控制器。 2.在計算機管理中,開啟【裝置管理器】,在右側可以看到本計算機的

linux deepin 無線不能,打不開

今天安裝了NVIDIA的大黃蜂驅動,重啟,開機,無線網打不開了, (後來又看到藍芽功能沒了,忙碌中知道了wifi和藍芽是在一起的,一損俱損!) 折騰了一下午 首先,我上deepin官網找了一圈,沒解決 然後搜尋網絡卡對應的無線網絡卡驅動,糾結著用【lspci】裡的Realtek Semiconduct

聯想筆記本連線無線卻沒禁用重啟後才能聯網,解決辦法

現象:聯想筆記本連線好無線後,過一段時間,無線還連著,但是沒有網了,重新連線無線也沒有用。 原因:重連無線也沒用,因為電腦把無線網絡卡關閉了。。。 解決:禁用無線介面卡,然後再啟動,連線無線就可以上網

VirtualBox虛擬機器中手動啟用配置網路

  1.檢查是否存在網絡卡並且網絡卡是否啟用 dmesg | grep eth 在這個命令結果中同時可獲取網絡卡MAC值 獲取已經配置完成的連線 nmcli dev show  2.去網絡卡硬體資訊檔案中去檢視網絡卡是否掃描到配置中 /etc/udev/rules.d/70

無線被自動禁用的原因

Intel英特爾PRO/Wireless 2200BG/2915ABG/3945ABG/WiFi Link 4965AGN/5100 AGN/5300 AGN/5150/5350系列無線筆記本網絡卡最新驅動12.0.4.0官方正式完整版For WinXP(2008年8月4日釋出)此版本為完整版本,包括驅動部分

RHEL7啟用

OS:RHEL7.4 進入到/etc/sysconfig/network-scripts目錄下將ifcfg-***(我的是ifcfg-ens11)裡面的ONBOOT設定為no,重啟後網絡卡就

virualbox 複製linux,啟用報錯:device "eth0" does not seem to be present, delaying initialization

virualbox 虛擬機器複製linux,啟用網絡卡報錯:device “eth0” does not seem to be present, delaying initialization 問題描述: 在virualbox中複製虛擬機器,無法查詢

ethtool 命令解決Linux 丟包

生產中有一臺Linux裝置併發比較大,droped包比較多,尤其是在跑遊戲資料包的時候,存在嚴重的丟包現象,懷疑網絡卡效能不足,在更換裝置前想能不有通過軟體方法解決,通過網上一些資料顯示,出現這種現象,也有可能是網絡卡buffer size 太小的原因,遂嘗試更改buffe

VirtualBox虛擬機器下kali對映USB無線無法啟用問題解決

Service connection timeout 1.0:ath9k_htc:Unable to initialize HTC services Failed to initialize the device ath9k_htc: USB layer deinitia

主機上有多個java指定獲取某一個ip的問題

前幾天寫過一個基於tomcat發郵件修改密碼的功能,大致是這樣: 點選修改密碼按鈕就傳送一封郵件去指定賬戶的郵箱,郵箱裡有個超連結和驗證碼,超連結開啟進入修改密碼頁面。之前能用,但是今天我的筆記本打開了獵豹免費wifi,造成有兩個網絡卡都被啟用,如下圖: