📄 datastruct.cpp
字号:
#include "Stdafx.h"
#include "DataStruct.h"
WCHAR AdapterList[Max_Num_Adapter][256]; // 网卡的名称集合
UCHAR MACAddress[6]; // MAC地址
PARASEND pmSend; // 用作线程间的参数传递
int iHostCount = 0; // 局域网内的主机个数
typedef int (CALLBACK* DHCPNOTIFYPROC)(LPWSTR, LPWSTR, BOOL, DWORD, DWORD, DWORD, int);
BOOL WideCharToANSI(char *pDst, USHORT *pSrc)
{
USHORT *p;
char *q;
for (p = pSrc, q = pDst; *p != '\0'; p++, q++)
{
if (*p > 127)
return FALSE;
else
*q = (char)(*p);
}
*q = '\0';
return TRUE;
}
void ULToString(TCHAR *pDst, ULONG *pUL)
{
UCHAR *pSrc = (UCHAR *)pUL;
_stprintf(pDst, _T("%d.%d.%d.%d"), pSrc[0], pSrc[1], pSrc[2], pSrc[3]);
}
// 将网卡名称转换成描述,若成功,返回TRUE,否则返回FALSE;
BOOL NameToDesc(TCHAR *pDsc, WCHAR *pName)
{
TCHAR szTemp[256] = _T("\\Device\\");
WCHAR *p = pName;
TCHAR AdapName[256];
TCHAR szBuffer[256];
LONG Status;
DWORD dim;
HKEY AdapKey, OneAdapKey, LinkageKey;
int i = 0;
while (*p != '{')
p++;
#ifdef _UNICODE
lstrcat(szTemp, p);
#else
TCHAR szANSITemp[256];
WideCharToANSI(szANSITemp, p);
lstrcat(szTemp, szANSITemp);
#endif
Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"),
0, KEY_READ, &AdapKey);
if (Status != ERROR_SUCCESS)
return FALSE;
// 枚举Adapkey下面的所有键
while (RegEnumKey(AdapKey, i, AdapName, sizeof(AdapName) / 2) == ERROR_SUCCESS)
{
Status = RegOpenKeyEx(AdapKey, AdapName, 0, KEY_READ, &OneAdapKey);
if (Status != ERROR_SUCCESS)
{
RegCloseKey(AdapKey);
return FALSE;
}
Status = RegOpenKeyEx(OneAdapKey, _T("Linkage"), 0, KEY_READ, &LinkageKey);
if (Status != ERROR_SUCCESS)
{
RegCloseKey(OneAdapKey);
RegCloseKey(AdapKey);
return FALSE;
}
dim = sizeof(szBuffer);
Status = RegQueryValueEx(LinkageKey, _T("Export"), NULL, NULL, (UCHAR *)szBuffer, &dim);
if (Status != ERROR_SUCCESS || lstrcmp(szTemp, szBuffer) != 0)
{
RegCloseKey(LinkageKey);
RegCloseKey(OneAdapKey);
i++;
continue;
}
else
{
dim = sizeof(szBuffer);
Status = RegQueryValueEx(OneAdapKey, _T("DriverDesc"), NULL, NULL, (UCHAR *)szBuffer, &dim);
if (Status != ERROR_SUCCESS)
{
RegCloseKey(LinkageKey);
RegCloseKey(OneAdapKey);
RegCloseKey(AdapKey);
return FALSE;
}
else
{
RegCloseKey(LinkageKey);
RegCloseKey(OneAdapKey);
RegCloseKey(AdapKey);
lstrcpy(pDsc, szBuffer);
return TRUE;
}
}
}
RegCloseKey(AdapKey);
return FALSE;
}
// 设置本地主机的IP地址
BOOL SetLocalIP(WCHAR *pAdapterName, ULONG ulIP, ULONG ulMask)
{
TCHAR szKeyName[256] = _T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
WCHAR *p = pAdapterName;
TCHAR szIP[17];
HKEY hKey;
// 将IP地址转化为字符串
memset(szIP, 0, sizeof(szIP));
ULToString(szIP, &ulIP);
// 找到注册表位置
while (*p != '{')
p++;
#ifndef _UNICODE
TCHAR szTemp[256];
WideCharToANSI(szTemp, p);
lstrcat(szKeyName, szTemp);
#else
lstrcat(szKeyName, p);
#endif
// 在注册表中设置IP地址
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
return FALSE;
if (RegSetValueEx(hKey, _T("IPAddress"), 0, REG_MULTI_SZ, (PUCHAR)szIP, lstrlen(szIP) * 2 + 4) != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
// 调用DhcpNotifyConfigChange函数设置IP地址
BOOL bResult = FALSE;
HINSTANCE hDhcpDll;
DHCPNOTIFYPROC pDhcpNotifyProc;
if ((hDhcpDll = LoadLibrary(_T("dhcpcsvc"))) == NULL)
return FALSE;
if ((pDhcpNotifyProc = (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll, "DhcpNotifyConfigChange")) != NULL)
if ((pDhcpNotifyProc)(NULL, p, TRUE, 0, ulIP, ulMask, 0) == ERROR_SUCCESS)
bResult = TRUE;
FreeLibrary(hDhcpDll);
return bResult;
}
void GetMacFromString(UCHAR *pDst, TCHAR* pSrc)
{
UCHAR *q = pDst;
TCHAR *p = pSrc;
while (*p != '\0')
{
if (*p == '-')
{
p++;
continue;
}
switch(*p)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
*q = (*p - '0') << 4;
break;
case 'a':
*q = 10 * 16;
break;
case 'b':
*q = 11 * 16;
break;
case 'c':
*q = 12 * 16;
break;
case 'd':
*q = 13 * 16;
break;
case 'e':
*q = 14 * 16;
break;
case 'f':
*q = 15 * 16;
break;
}
p++;
switch(*p)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
*q += (*p - '0');
break;
case 'a':
*q += 10;
break;
case 'b':
*q += 11;
break;
case 'c':
*q += 12;
break;
case 'd':
*q += 13;
break;
case 'e':
*q += 14;
break;
case 'f':
*q += 15;
break;
}
p++;
q++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -