请问如何(VC/MFC)禁用指定的网卡(要有禁用无线的或禁用有线的两种选择)???? 急救!! 就是说要求能在(启用)禁用时可以选择是(启用)禁用无线网卡还是有线网卡急救!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #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; } //转的,没有测试。禁用无线和禁用有线网卡没有区别。程序中有段读取设备列表的代码,将这段代码获得的设备写入combo让用户选择,是否可以? 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 supportprotected: 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 handlersBOOL 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); } }}//////ChangeStatusBOOL 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); } 你编译的方式是不是Win32的,可以试试x64的编译,两者编译出来的Tool是不一样的。前者是Win32系统运行的Tool,后者是Win64系统运行的Tool PreTranslateMessage函数和Child类型的对话框 有人去过这个论坛么 窗口透明的问题 现在从软件转到硬件晚不晚啊,我都30岁了? 为什么我的全局钩子只工作在我调用的进程上?? VC 为何老出问题 请教:(MFC程序)如何用MOUSE画曲线? 小弟是菜菜鸟,请各位大侠帮忙! U盘在程序中被识别为本地磁盘,怎么解决? 怎样编写一个收电子邮件“附件”的程序??? Edit Box控件 怎么对输入其中的字符进行控制? LINK : fatal error LNK1104: cannot open file "?.exe"
#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;
} //转的,没有测试。禁用无线和禁用有线网卡没有区别。程序中有段读取设备列表的代码,将这段代码获得的设备写入combo让用户选择,是否可以?
你的方法好像禁用了所有网卡
如果禁用所有网卡的话可以根据GUID,不用枚举所有的设备,档主的意思是想禁用无线网卡或普能的网卡其中一种是吧,如果楼主想到了思路或找到答案请告诉我一下,我也想知道怎么做
这样你就可以开启禁用任何硬件了~`
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);
}