一、注册表更改SpeedDuplex
1.注册表SpeedDuplex定义
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001\Ndi\params\*SpeedDuplex\enum]
"0"="自动侦测"
"1"="10 Mbps 半双工"half-duplex
"2"="10 Mbps 全双工" full duplex
"3"="100 Mbps 半双工"half-duplex
"4"="100 Mbps 全双工"full duplex
"6"="1.0 Gbps 全双工"full duplex
"0"="自动侦测"
"1"="10 Mbps 半双工"half-duplex
"2"="10 Mbps 全双工" full duplex
"3"="100 Mbps 半双工"half-duplex
"4"="100 Mbps 全双工"full duplex
"6"="1.0 Gbps 全双工"full duplex
2.改动位置
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0001]
3.实现代码
HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set = _T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}\\0001");
//if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, NULL, 0, KEY_WRITE, NULL, &hKEY, 0))
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_ALL_ACCESS, &hKEY))
{
CString itemvalue = _T("1");//定义字符串变量
DWORD size = itemvalue.GetLength();//获取字符串长度
//设置项值
//if (ERROR_SUCCESS == RegSetValueEx(hKEY, data_Set, 0, REG_SZ, (unsigned char*)itemvalue.GetBuffer(0), size))
if (ERROR_SUCCESS == RegSetValueEx(hKEY, _T("*SpeedDuplex"), 0, REG_SZ, (unsigned char*)itemvalue.GetBuffer(0), size))
{
//MessageBox( TEXT("10 Mbps half-duplex"), NULL, MB_OK);
DisableLAN();
EnableLAN();
}
else
{
//printf("Error: unable to query information about the registry");
//return 1;
ErrorExit(TEXT("RegSetValueEx"));
exit(1);
}
}
else
{
//printf("Error: unable to query information about the registry");
//return 1;
ErrorExit(TEXT("RegOpenKeyEx"));
exit(1);
}
//RegFlushKey(hKEY);
RegCloseKey(hKEY);//关闭键句柄
//当RegSetValueEx函数的返回值为ERROR_SUCCESS时,表示设置成功
4.重启网卡
// lan2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <Setupapi.h>
#include <objbase.h>
#pragma comment(lib, "Setupapi.lib")
#include "Restart.h"
#include "ErrorExit.h"
int DisableLAN(void)
{
HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
if (INVALID_HANDLE_VALUE == hDevInfo)
return GetLastError();
//EnumDevices(hDevInfo);
SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
LPOLESTR guid;
TCHAR devName[128];
TCHAR instanceId[128];
for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
{
StringFromCLSID(DeviceInfoData.ClassGuid, &guid);
SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);
// if(!SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL))
//ErrorExit(TEXT("SetupDiClassNameFromGuid"));//错误分析
//MessageBox(NULL,(LPCWSTR)GetLastError(),NULL,MB_OK);
//printf("%s\n", devName);
if (!strcmp(devName, _T("Net")))
//if (!wcscmp(devName, _T("Net")))
{
SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL);
//if(!SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL))
// ErrorExit(TEXT("SetupDiClassNameFromGuid"));//错误分析
//printf("instanceId1:%s\n", instanceId);
if (!strncmp(instanceId, _T("PCI"), 3))
{
//wprintf(L"guid:%s\n", guid);
// printf("devName:%s\n", devName);
// printf("instanceId2:%s\n", instanceId);
SP_PROPCHANGE_PARAMS params = { sizeof(SP_CLASSINSTALL_HEADER) };
params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
params.Scope = DICS_FLAG_CONFIGSPECIFIC;
params.StateChange = DICS_DISABLE;
//params.StateChange = DICS_ENABLE;
params.HwProfile = 0;
SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)¶ms, sizeof(SP_PROPCHANGE_PARAMS));
//if(!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)¶ms, sizeof(SP_PROPCHANGE_PARAMS)))
// ErrorExit(TEXT("SetupDiClassNameFromGuid"));//错误分析
SetupDiChangeState(hDevInfo, &DeviceInfoData);
}
}
CoTaskMemFree(guid);
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
int EnableLAN(void)
{
HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
if (INVALID_HANDLE_VALUE == hDevInfo)
return GetLastError();
//EnumDevices(hDevInfo);
SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };
LPOLESTR guid;
TCHAR devName[128];
TCHAR instanceId[128];
for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
{
StringFromCLSID(DeviceInfoData.ClassGuid, &guid);
SetupDiClassNameFromGuid(&DeviceInfoData.ClassGuid, devName, 128, NULL);
//printf("%s\n", devName);
if (!strcmp(devName, _T("Net")))
{
SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, instanceId, 128, NULL);
//printf("instanceId1:%s\n", instanceId);
if (!strncmp(instanceId, _T("PCI"), 3))
{
//wprintf(L"guid:%s\n", guid);
// printf("devName:%s\n", devName);
// printf("instanceId2:%s\n", instanceId);
SP_PROPCHANGE_PARAMS params = { sizeof(SP_CLASSINSTALL_HEADER) };
params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
params.Scope = DICS_FLAG_CONFIGSPECIFIC;
// params.StateChange = DICS_DISABLE;
params.StateChange = DICS_ENABLE;
params.HwProfile = 0;
SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)¶ms, sizeof(SP_PROPCHANGE_PARAMS));
SetupDiChangeState(hDevInfo, &DeviceInfoData);
}
}
CoTaskMemFree(guid);
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
二、网速监控
控制台案例可参考下面基于C++的输出当前网速的小代码-带效果图,我也是对别人的代码移植,采用定时器+消息机制+线程,
unsigned int __stdcall ThreadProc_Speed(LPVOID lpParameter)
{
CspeedDuplexDlg *pDlg= (CspeedDuplexDlg *)lpParameter;
PMIB_IFTABLE m_pTable = NULL;
DWORD m_dwAdapters = 0;
ULONG uRetCode = GetIfTable(m_pTable, &m_dwAdapters, TRUE);
if (uRetCode == ERROR_NOT_SUPPORTED)
{
//return (-1);
exit(-1);
}
if (uRetCode == ERROR_INSUFFICIENT_BUFFER)
{
m_pTable = (PMIB_IFTABLE)new BYTE[65535]; //假设端口数不超过65535个
}
DWORD dwLastIn = 0; //上一秒钟的接收字节数
DWORD dwLastOut = 0; //上一秒钟的发送字节数
DWORD dwBandIn = 0; //下载速度
DWORD dwBandOut = 0; //上传速度
while (1)
{
GetIfTable(m_pTable, &m_dwAdapters, TRUE);
DWORD dwInOctets = 0;
DWORD dwOutOctets = 0;
//将所有端口的流量进行统计
for (UINT i = 0; i < m_pTable->dwNumEntries; i++)
{
MIB_IFROW Row = m_pTable->table[i];
dwInOctets += Row.dwInOctets;
dwOutOctets += Row.dwOutOctets;
}
dwBandIn = dwInOctets - dwLastIn; //下载速度
dwBandOut = dwOutOctets - dwLastOut; //上床速速
if (dwLastIn <= 0)
{
dwBandIn = 0;
}
else
{
dwBandIn = dwBandIn / 1024; //b转换成kb
}
if (dwLastOut <= 0)
{
dwBandOut = 0;
}
else
{
dwBandOut = dwBandOut / 1024; //b转换成kb
}
dwLastIn = dwInOctets;
dwLastOut = dwOutOctets;
printf("收到字节: %u bytes\n", dwLastIn);
printf("发送字节: %u bytes\n", dwLastOut);
printf("下行速度: %u KB\n", dwBandIn);
printf("上行速度: %u KB\n", dwBandOut);
printf("--------------------------\n");
//CStatic *pStatic = (CStatic *)GetDlgItem(IDC_STATIC1);
// CString box;
// box.Format(_T("下行速度:%u KB"), dwBandIn);
// m_static1.SetWindowText(box);
// SendMessage(hView,MYWM_CHANGE_EDIT, wParam,lParam);
PostMessage(pDlg->m_hWnd, WM_MY_MESSAGE, dwBandIn, dwBandOut);
Sleep(1000);
//休眠一秒钟
}
delete[] m_pTable;
return 0;
}
源码:http://download.csdn.net/detail/greless/9839755(VS2015 ANSI编码 管理员模式)
参考:
使用GetIfTable获取MIB_IFTABLE和MIB_IFROW获取网络接口信息