用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,造成有兩個網絡卡都被啟用,如下圖: