请问如何(VC/MFC)禁用指定的网卡(要有禁用无线的或禁用有线的两种选择)???? 急救!!
就是说要求能在(启用)禁用时可以选择是(启用)禁用无线网卡还是有线网卡
急救!!
[解决办法]
- C/C++ code
#include "stdafx.h" #include <tchar.h> #include <windows.h> #include <setupapi.h> #pragma comment (lib,"setupapi") #define UnknownDevice TEXT("") HDEVINFO hDevInfo = 0; BOOL StateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO hDevInfo) { SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)}; SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; HCURSOR hCursor; // // This may take a while :^( // hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); // // Get a handle to the Selected Item. // if (!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData)) { printf("EnumDeviceInfo"); return FALSE; } // // Set the PropChangeParams structure. // PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; PropChangeParams.Scope = DICS_FLAG_GLOBAL; PropChangeParams.StateChange = NewState; if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams, sizeof(PropChangeParams))) { printf("SetClassInstallParams"); SetCursor(hCursor); return FALSE; } // // Call the ClassInstaller and perform the change. // if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData)) { printf("SetClassInstallParams"); SetCursor(hCursor); return TRUE; } SetCursor(hCursor); return TRUE; } BOOL IsClassNet( GUID * ClassGuid ) { #define MAX_NUM 50 HKEY hKeyClass; LONG lRet; char ClassType[MAX_NUM]; char NetClass[MAX_NUM] = "Net"; DWORD dwLength = MAX_NUM,dwType = REG_SZ; if (hKeyClass = SetupDiOpenClassRegKey(ClassGuid,KEY_READ)) { lRet = RegQueryValueEx(hKeyClass, TEXT("Class"), NULL, &dwType, LPBYTE(ClassType), &dwLength); RegCloseKey(hKeyClass); if (lRet != ERROR_SUCCESS) return FALSE; if (!strcmp(ClassType,NetClass)) return TRUE; } return FALSE; } int main(int argc, char* argv[]) { if (INVALID_HANDLE_VALUE == (hDevInfo = SetupDiGetClassDevs(NULL,NULL,0, DIGCF_PRESENT |DIGCF_ALLCLASSES))) { printf("GetClassDevs"); return 0; } DWORD i, Status, Problem; SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; HKEY hKeyClass; char DeviceName[200]; for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++) { if (IsClassNet(&DeviceInfoData.ClassGuid)) { printf(" the class's index is %d\n",i); // //DICS_DISABLE-->禁用网络 //DICS_ENABLE--->恢复网络 // if (StateChange(DICS_ENABLE,i,hDevInfo)) printf("NetWork stopped"); } } return 0; }
[解决办法]
lfchen
你的方法好像禁用了所有网卡
如果禁用所有网卡的话可以根据GUID,不用枚举所有的设备,
档主的意思是想禁用无线网卡或普能的网卡其中一种是吧,
如果楼主想到了思路或找到答案请告诉我一下,我也想知道怎么做
[解决办法]
通过WMI class Win32_NetworkAdapter.Disable method.
[解决办法]
subtype为硬件的hardwareId
这样你就可以开启禁用任何硬件了~`
BOOL SetDevStates(bool states,LPTSTR subtype)
{
DWORD NewState;
if(states)
{
NewState=DICS_DISABLE;
//禁用
}
else
{
NewState=DICS_ENABLE;
//启用
}
DWORD i,err;
BOOL Found=FALSE;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA spDevInfoData;
//访问系统的硬件库
hDevInfo=SetupDiGetClassDevs(NULL,NULL ,NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);
if(hDevInfo==INVALID_HANDLE_VALUE)
{
MessageBox(_T("访问系统硬件出错!"));
return FALSE;
}
//枚举硬件,获得需要的接口
spDevInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
BOOL flagEnum;
for(i=0;flagEnum = SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData);i++)
{
DWORD DataT;
CHAR buffer[500]={0};
DWORD buffersize=0;
//获得硬件的属性值
buffersize = sizeof(buffer);
while(!SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)buffer, buffersize, &buffersize))
{
DWORD a = GetLastError();
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
{
//未知错误
//退出时,清理工作环境
err=GetLastError();
SetupDiDestroyDeviceInfoList(hDevInfo);
SetLastError(err);
return FALSE;
}
}
if(GetLastError()==ERROR_INVALID_DATA)
continue;
if(NULL == buffer)
{
// LocalFree(buffer);
continue;
}
}
//MessageBox((LPCWSTR)buffer);
if(StrStr((LPCWSTR)buffer,subtype) != NULL)
{
//MessageBox((LPCWSTR)buffer);
DWORD pSize=0;
SP_PROPCHANGE_PARAMS spPropChangeParams;
spPropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);
spPropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;
spPropChangeParams.Scope=DICS_FLAG_GLOBAL; //DICS_FLAG_CONFIGSPECIFIC //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();
}
}
}
//退出时,清理工作环境
err=GetLastError();
SetupDiDestroyDeviceInfoList(hDevInfo);
SetLastError(err);
return TRUE;
}
[解决办法]
我已经找到了方法.
首先和普通的方法一样,根据GUID禁用网卡类设备,只是在禁用时枚举第i块网卡,读取其设备信息,读到有"wireless"这个串的就认为它是无线网卡,就对它使用禁用操作,否则就接着枚举第i+1块网卡,直到都枚举完.
下面给出重要结构.
// driveDemoDlg.cpp : implementation file
#include "stdafx.h"
#include "driveDemo.h"
#include "driveDemoDlg.h"
#include < windows.h >
#include < wincon.h >
#include < stdlib.h >
#include < stdio.h >
#include <string.h>
HDEVINFO hDevInfo = NULL;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
protected:
DECLARE_MESSAGE_MAP()};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
CDriveDemoDlg::CDriveDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDriveDemoDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}
void CDriveDemoDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CDriveDemoDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_SEARIALPORT1, OnButtonSearialport1)
ON_BN_CLICKED(IDC_BUTTON_SEARIALPORT2, OnButtonSearialport2)
END_MESSAGE_MAP()
// CDriveDemoDlg message handlers
BOOL CDriveDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
return TRUE; // return TRUE unless you set the focus to a control
}
void CDriveDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CDriveDemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CDriveDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CDriveDemoDlg::OnOK()
{
CDialog::OnOK();
}
void CDriveDemoDlg::FormatMSG(DWORD dwError, LPTSTR * lpszMsg)
{
BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,
MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), (LPTSTR)lpszMsg, 0, NULL);
if (!bOk)
{
HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),
NULL,
DONT_RESOLVE_DLL_REFERENCES);
if (NULL != hDll)
{
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_FROM_SYSTEM,
hDll,
dwError,
MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
(LPTSTR)lpszMsg,0, NULL);
FreeLibrary(hDll);
}
}
}
//////ChangeStatus
BOOL CDriveDemoDlg::ChangeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)
{
LPTSTR lpszMsg = NULL;
HCURSOR hCursor = NULL;
try
{
SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
// Get a handle to the Selected Item.
if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))
{
FormatMSG(GetLastError(), &lpszMsg);
throw lpszMsg;
}
// Set the PropChangeParams structure.
PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
PropChangeParams.Scope = DICS_FLAG_GLOBAL;
PropChangeParams.StateChange = NewStatus;
if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
sizeof(PropChangeParams)))
{
FormatMSG(GetLastError(), &lpszMsg);
throw lpszMsg;
}
// Call the ClassInstaller and perform the change.
if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))
{
FormatMSG(GetLastError(), &lpszMsg);
throw lpszMsg;
}
SetCursor(hCursor);
return TRUE;
}
catch (TCHAR * pszError)
{
SetCursor(hCursor);
::MessageBox(NULL,pszError,_T("提示"),MB_OK);
if (NULL != lpszMsg)
{
LocalFree((HLOCAL)lpszMsg);
}
return FALSE;
}
}
// This Function can stop/start the wireless.
// Parameters description:The nStatus has three state.-1:do nothing
// 0 :stop the wireless,1:start the wireless.
// nIndex is the parameter to said if stop the Wireless.
// if you want to stop the Wireless,you can call ControlDisk(0, 4).
BOOL CDriveDemoDlg::ControlDisk(int nStatus, int nIndex)
{
if (-1 == nStatus)
{
return FALSE;
}
LPTSTR lpszMsg = NULL;
try
{
TCHAR * GUIDString = NULL;
GUID guid;
ZeroMemory(&guid, sizeof(GUID));
GUIDString = _T("4d36e972-e325-11ce-bfc1-08002be10318");
UuidFromString((unsigned char *)GUIDString, &guid);
hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);
if (INVALID_HANDLE_VALUE == hDevInfo)
{
FormatMSG(GetLastError(), &lpszMsg);
throw lpszMsg;
}
DWORD i;int Icount=0;
SP_DEVINFO_DATA DeviceInfoData;
ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
{
//Get DeviceInfo
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
DWORD Status, Problem;
BOOL bDisabled = FALSE;
BOOL bwireless=FALSE;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC, //Read the names of the designated card
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize)
)
{
if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
{
if (buffer) LocalFree(buffer);
buffer=(char*)LocalAlloc(LPTR,buffersize);
}
else
{// Insert error handling here.
AfxMessageBox("读取网卡错误");
}
}
CString strEthernet = buffer ;
char *str=strupr(buffer);
char *str2="WIRELESS";//wireless sign
char *p;
p=strstr(str,str2);//compare
if (p!=NULL) bwireless=TRUE;//ok,found.
if (int i= CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst,0) != CR_SUCCESS)
{ FormatMSG(GetLastError(), &lpszMsg);
throw lpszMsg;
}
if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)))
{ bDisabled = FALSE;}
if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))
{ bDisabled = TRUE; }
if( (bDisabled==FALSE) && (0 == nStatus) && (bwireless) )
{ChangeStatus(DICS_DISABLE, i, hDevInfo);// 禁用
bwireless=FALSE;
}
if( (bDisabled==TRUE) && (1 == nStatus) && (bwireless) )
{ChangeStatus(DICS_ENABLE, i, hDevInfo);// 启用
bwireless=FALSE;
}
}
return SetupDiDestroyDeviceInfoList(hDevInfo);
}
catch (TCHAR * pszError)
{
::MessageBox(NULL,pszError,_T("提示"),MB_OK);
if (NULL != lpszMsg)
{
LocalFree((HLOCAL)lpszMsg);
}
return FALSE;
}
return FALSE;
}
// 禁用
void CDriveDemoDlg::OnButtonSearialport1()
{
ControlDisk(0,4);
}
// 启用
void CDriveDemoDlg::OnButtonSearialport2()
{
ControlDisk(1,4);
}