编程实现启用禁用网卡
生活随笔
收集整理的這篇文章主要介紹了
编程实现启用禁用网卡
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*****************************************************************************
演示如何編程實現啟用禁用網卡
Mady By ZwelL
2004.7.29
zwell@sohu.com
*****************************************************************************/
#include <windows.h>
#include <setupapi.h>
#include <tchar.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"setupapi.lib")
BOOL DisableNetInterface(bool bStatus)
{
????IN LPTSTR HardwareId ;
????//硬件ComponentId,注冊表地址:system/currentcontrolset/class/{4D36E972-E325-11CE-BFC1-08002BE10318}/0000
????
????HardwareId="PCI//VEN_10EC&DEV_8139&SUBSYS_813910EC" ;
????
????DWORD NewState ;
????
????if(bStatus)
????{
????????NewState=DICS_DISABLE ;
????????//禁用
????}
????else
????{
????????NewState=DICS_ENABLE ;
????????//啟用
????}
????
????//調用ddk函數,來禁用網卡
????
????DWORD i,err ;
????BOOL Found=false ;
????
????HDEVINFO hDevInfo ;
????SP_DEVINFO_DATA spDevInfoData ;
????
????//訪問系統的硬件庫
????hDevInfo=SetupDiGetClassDevs(NULL,"PCI",NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);
????if(hDevInfo==INVALID_HANDLE_VALUE)
????{
????????printf("訪問系統硬件出錯!");
????????return false ;
????}
????
????//枚舉硬件,獲得需要的接口
????spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
????for(i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData);i++)
????{
????????DWORD DataT ;
????????LPTSTR p,buffer=NULL ;
????????DWORD buffersize=0 ;
????????
????????//獲得硬件的屬性值
????????while(!SetupDiGetDeviceRegistryProperty(
????hDevInfo,
????&spDevInfoData,
????SPDRP_HARDWAREID,
????&DataT,
????(PBYTE)buffer,
????buffersize,
????&buffersize))
????????{
????????????if(GetLastError()==ERROR_INVALID_DATA)
????????????{
????????????????//不存在HardwareID. Continue.
????????????????break ;
????????????}
????????????else if(GetLastError()==ERROR_INSUFFICIENT_BUFFER)
????????????{
????????????????//buffer size不對.
????????????????if(buffer)
????????????????LocalFree(buffer);
????????????????buffer=(char*)LocalAlloc(LPTR,buffersize);
????????????}
????????????else
????????????{
????????????????//未知錯誤
????????????????goto cleanup_DeviceInfo ;
????????????}
????????}
????????
????????if(GetLastError()==ERROR_INVALID_DATA)
????????continue ;
????????
????????//比較,找到和網卡ID相同的項
????????for(p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
????????{
????????????
????????????if(!_tcscmp(HardwareId,p))
????????????{
????????????????//找到網卡
????????????????Found=TRUE ;
????????????????break ;
????????????}
????????}
????????
????????if(buffer)
????????LocalFree(buffer);
????????
????????//如果相等
????????if(Found)
????????{
????????????//禁用該設備
????????????
????????????SP_PROPCHANGE_PARAMS spPropChangeParams ;
????????????
????????????spPropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);
????????????spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE ;
????????????spPropChangeParams.Scope=DICS_FLAG_GLOBAL ;
????????????spPropChangeParams.StateChange=NewState ;
????????????//禁用:DICS_DISABLE,DICS_ENABLE啟用
????????????
????????????//
????????????if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))
????????????{
????????????????DWORD errorcode=GetLastError();
????????????}
????????????
????????????if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))
????????????{
????????????????DWORD errorcode=GetLastError();
????????????}
????????????
????????????switch(NewState)
????????????{
????????????????case DICS_DISABLE :
???? printf("成功禁用網絡!");
????????????????break ;
????????????????case DICS_ENABLE :
???? printf("成功啟用網絡!");
????????????????break ;
????????????}
????????????
????????????break ;
????????}
????????
????}
????
????//退出時,清理工作環境
????cleanup_DeviceInfo :
????err=GetLastError();
????SetupDiDestroyDeviceInfoList(hDevInfo);
????SetLastError(err);
????
????return true ;
}
void usage(char *exefile)
{
printf("Usage:%s [-e|-d]/r/n", exefile);
printf("/t-e: Enable the network card./r/n");
printf("/t-d: Disable the network card./r/n");
exit(0);
}
int main(int argc,char**argv)
{
if(argc<2)
??usage(argv[0]);
if(!DisableNetInterface((strstr(argv[1],"-d")>0?TRUE:FALSE)))
??printf("對網卡操作失敗!");
????return 0;
}
---
Welcome to my blog:
演示如何編程實現啟用禁用網卡
Mady By ZwelL
2004.7.29
zwell@sohu.com
*****************************************************************************/
#include <windows.h>
#include <setupapi.h>
#include <tchar.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"setupapi.lib")
BOOL DisableNetInterface(bool bStatus)
{
????IN LPTSTR HardwareId ;
????//硬件ComponentId,注冊表地址:system/currentcontrolset/class/{4D36E972-E325-11CE-BFC1-08002BE10318}/0000
????
????HardwareId="PCI//VEN_10EC&DEV_8139&SUBSYS_813910EC" ;
????
????DWORD NewState ;
????
????if(bStatus)
????{
????????NewState=DICS_DISABLE ;
????????//禁用
????}
????else
????{
????????NewState=DICS_ENABLE ;
????????//啟用
????}
????
????//調用ddk函數,來禁用網卡
????
????DWORD i,err ;
????BOOL Found=false ;
????
????HDEVINFO hDevInfo ;
????SP_DEVINFO_DATA spDevInfoData ;
????
????//訪問系統的硬件庫
????hDevInfo=SetupDiGetClassDevs(NULL,"PCI",NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);
????if(hDevInfo==INVALID_HANDLE_VALUE)
????{
????????printf("訪問系統硬件出錯!");
????????return false ;
????}
????
????//枚舉硬件,獲得需要的接口
????spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
????for(i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData);i++)
????{
????????DWORD DataT ;
????????LPTSTR p,buffer=NULL ;
????????DWORD buffersize=0 ;
????????
????????//獲得硬件的屬性值
????????while(!SetupDiGetDeviceRegistryProperty(
????hDevInfo,
????&spDevInfoData,
????SPDRP_HARDWAREID,
????&DataT,
????(PBYTE)buffer,
????buffersize,
????&buffersize))
????????{
????????????if(GetLastError()==ERROR_INVALID_DATA)
????????????{
????????????????//不存在HardwareID. Continue.
????????????????break ;
????????????}
????????????else if(GetLastError()==ERROR_INSUFFICIENT_BUFFER)
????????????{
????????????????//buffer size不對.
????????????????if(buffer)
????????????????LocalFree(buffer);
????????????????buffer=(char*)LocalAlloc(LPTR,buffersize);
????????????}
????????????else
????????????{
????????????????//未知錯誤
????????????????goto cleanup_DeviceInfo ;
????????????}
????????}
????????
????????if(GetLastError()==ERROR_INVALID_DATA)
????????continue ;
????????
????????//比較,找到和網卡ID相同的項
????????for(p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
????????{
????????????
????????????if(!_tcscmp(HardwareId,p))
????????????{
????????????????//找到網卡
????????????????Found=TRUE ;
????????????????break ;
????????????}
????????}
????????
????????if(buffer)
????????LocalFree(buffer);
????????
????????//如果相等
????????if(Found)
????????{
????????????//禁用該設備
????????????
????????????SP_PROPCHANGE_PARAMS spPropChangeParams ;
????????????
????????????spPropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);
????????????spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE ;
????????????spPropChangeParams.Scope=DICS_FLAG_GLOBAL ;
????????????spPropChangeParams.StateChange=NewState ;
????????????//禁用:DICS_DISABLE,DICS_ENABLE啟用
????????????
????????????//
????????????if(!SetupDiSetClassInstallParams(hDevInfo,&spDevInfoData,(SP_CLASSINSTALL_HEADER*)&spPropChangeParams,sizeof(spPropChangeParams)))
????????????{
????????????????DWORD errorcode=GetLastError();
????????????}
????????????
????????????if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&spDevInfoData))
????????????{
????????????????DWORD errorcode=GetLastError();
????????????}
????????????
????????????switch(NewState)
????????????{
????????????????case DICS_DISABLE :
???? printf("成功禁用網絡!");
????????????????break ;
????????????????case DICS_ENABLE :
???? printf("成功啟用網絡!");
????????????????break ;
????????????}
????????????
????????????break ;
????????}
????????
????}
????
????//退出時,清理工作環境
????cleanup_DeviceInfo :
????err=GetLastError();
????SetupDiDestroyDeviceInfoList(hDevInfo);
????SetLastError(err);
????
????return true ;
}
void usage(char *exefile)
{
printf("Usage:%s [-e|-d]/r/n", exefile);
printf("/t-e: Enable the network card./r/n");
printf("/t-d: Disable the network card./r/n");
exit(0);
}
int main(int argc,char**argv)
{
if(argc<2)
??usage(argv[0]);
if(!DisableNetInterface((strstr(argv[1],"-d")>0?TRUE:FALSE)))
??printf("對網卡操作失敗!");
????return 0;
}
---
Welcome to my blog:
總結
以上是生活随笔為你收集整理的编程实现启用禁用网卡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法必备的 50 个代码实现
- 下一篇: 重磅!花书《深度学习》,这份精炼笔记可能