Files
2026-03-03 13:56:44 +08:00

327 lines
6.9 KiB
C++

#include "StdAfx.h"
#include "WHService.h"
#include "WHEncrypt.h"
//////////////////////////////////////////////////////////////////////////////////
//压缩文件
#include "Compress\ZLib.h"
//链接文件
#ifndef _DEBUG
#pragma comment(lib,"Version")
#pragma comment(lib,"Compress\\ZLib.lib")
#else
#pragma comment(lib,"Version")
#pragma comment(lib,"Compress\\ZLibD.lib")
#endif
//////////////////////////////////////////////////////////////////////////////////
//状态信息
struct tagAstatInfo
{
ADAPTER_STATUS AdapterStatus; //网卡状态
NAME_BUFFER NameBuff[16]; //名字缓冲
};
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CWHService::CWHService()
{
}
//拷贝字符
bool CWHService::SetClipboardString(LPCTSTR pszString)
{
//变量定义
HANDLE hData=NULL;
BOOL bOpenClopboard=FALSE;
//执行逻辑
__try
{
//打开拷贝
bOpenClopboard=OpenClipboard(AfxGetMainWnd()->m_hWnd);
if (bOpenClopboard==FALSE) __leave;
//清空拷贝
if (EmptyClipboard()==FALSE) __leave;
//申请内存
HANDLE hData=GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,CountStringBuffer(pszString));
if (hData==NULL) __leave;
//复制数据
lstrcpy((LPTSTR)GlobalLock(hData),pszString);
GlobalUnlock(hData);
//设置数据
#ifndef _UNICODE
::SetClipboardData(CF_TEXT,hData);
#else
::SetClipboardData(CF_UNICODETEXT,hData);
#endif
}
//终止程序
__finally
{
//释放内存
if (hData!=NULL) GlobalUnlock(hData);
//关闭拷贝
if (bOpenClopboard==TRUE) CloseClipboard();
//错误判断
if (AbnormalTermination()==TRUE)
{
ASSERT(FALSE);
}
}
return true;
}
//机器标识
bool CWHService::GetMachineID(TCHAR szMachineID[LEN_MACHINE_ID])
{
//变量定义
TCHAR szMACAddress[LEN_NETWORK_ID]=TEXT("");
//网卡标识
GetMACAddress(szMACAddress);
//转换信息
ASSERT(LEN_MACHINE_ID>=LEN_MD5);
CWHEncrypt::MD5Encrypt(szMACAddress,szMachineID);
return true;
}
//机器标识
bool CWHService::GetMachineIDEx(TCHAR szMachineID[LEN_MACHINE_ID])
{
//变量定义
TCHAR szMACAddress[LEN_NETWORK_ID]=TEXT("");
//网卡标识
WORD wMacSize=GetMACAddress(szMACAddress);
//硬盘标识
DWORD *pbuf=(DWORD*)szMACAddress;
WORD wIndex=(wMacSize+sizeof(DWORD)-1)/sizeof(DWORD);
LPCTSTR pszHardDisk[]={TEXT("C:\\"),TEXT("D:\\"),TEXT("E:\\")};
for (WORD i=wIndex;i<CountArray(pszHardDisk);i++)
{
ASSERT(CountArray(pszHardDisk)>(i-wIndex));
GetVolumeInformation(pszHardDisk[i-wIndex],NULL,0,pbuf+i,NULL,NULL,0,NULL);
}
//转换信息
ASSERT(LEN_MACHINE_ID>=LEN_MD5);
CWHEncrypt::MD5Encrypt(szMACAddress,szMachineID);
return true;
}
//网卡地址
bool CWHService::GetMACAddress(TCHAR szMACAddress[LEN_NETWORK_ID])
{
//变量定义
HINSTANCE hInstance=NULL;
//执行逻辑
__try
{
//加载 DLL
hInstance=LoadLibrary(TEXT("NetApi32.dll"));
if (hInstance==NULL) __leave;
//获取函数
typedef BYTE __stdcall NetBiosProc(NCB * Ncb);
NetBiosProc * pNetBiosProc=(NetBiosProc *)GetProcAddress(hInstance,"Netbios");
if (pNetBiosProc==NULL) __leave;
//变量定义
NCB Ncb;
LANA_ENUM LanaEnum;
ZeroMemory(&Ncb,sizeof(Ncb));
ZeroMemory(&LanaEnum,sizeof(LanaEnum));
//枚举网卡
Ncb.ncb_command=NCBENUM;
Ncb.ncb_length=sizeof(LanaEnum);
Ncb.ncb_buffer=(BYTE *)&LanaEnum;
if ((pNetBiosProc(&Ncb)!=NRC_GOODRET)||(LanaEnum.length==0)) __leave;
//获取地址
if (LanaEnum.length>0)
{
//变量定义
tagAstatInfo Adapter;
ZeroMemory(&Adapter,sizeof(Adapter));
//重置网卡
Ncb.ncb_command=NCBRESET;
Ncb.ncb_lana_num=LanaEnum.lana[0];
if (pNetBiosProc(&Ncb)!=NRC_GOODRET) __leave;
//获取状态
Ncb.ncb_command=NCBASTAT;
Ncb.ncb_length=sizeof(Adapter);
Ncb.ncb_buffer=(BYTE *)&Adapter;
Ncb.ncb_lana_num=LanaEnum.lana[0];
strcpy((char *)Ncb.ncb_callname,"*");
if (pNetBiosProc(&Ncb)!=NRC_GOODRET) __leave;
//获取地址
for (INT i=0;i<6;i++)
{
ASSERT((i*2)<LEN_NETWORK_ID);
_stprintf(&szMACAddress[i*2],TEXT("%02X"),Adapter.AdapterStatus.adapter_address[i]);
}
}
}
//结束清理
__finally
{
//释放资源
if (hInstance!=NULL)
{
FreeLibrary(hInstance);
hInstance=NULL;
}
//错误断言
if (AbnormalTermination()==TRUE)
{
ASSERT(FALSE);
}
}
return true;
}
//注销热键
bool CWHService::UnRegisterHotKey(HWND hWnd, UINT uKeyID)
{
//注销热键
BOOL bSuccess=::UnregisterHotKey(hWnd,uKeyID);
return (bSuccess==TRUE)?true:false;
}
//注册热键
bool CWHService::RegisterHotKey(HWND hWnd, UINT uKeyID, WORD wHotKey)
{
//变量定义
BYTE cbModifiers=0;
if (HIBYTE(wHotKey)&HOTKEYF_ALT) cbModifiers|=MOD_ALT;
if (HIBYTE(wHotKey)&HOTKEYF_SHIFT) cbModifiers|=MOD_SHIFT;
if (HIBYTE(wHotKey)&HOTKEYF_CONTROL) cbModifiers|=MOD_CONTROL;
//注册热键
BOOL bSuccess=::RegisterHotKey(hWnd,uKeyID,cbModifiers,LOBYTE(wHotKey));
return (bSuccess==TRUE)?true:false;
}
//进程目录
bool CWHService::GetWorkDirectory(TCHAR szWorkDirectory[], WORD wBufferCount)
{
//模块路径
TCHAR szModulePath[MAX_PATH]=TEXT("");
GetModuleFileName(AfxGetInstanceHandle(),szModulePath,CountArray(szModulePath));
//分析文件
for (INT i=lstrlen(szModulePath);i>=0;i--)
{
if (szModulePath[i]==TEXT('\\'))
{
szModulePath[i]=0;
break;
}
}
//设置结果
ASSERT(szModulePath[0]!=0);
lstrcpyn(szWorkDirectory,szModulePath,wBufferCount);
return true;
}
//文件版本
bool CWHService::GetModuleVersion(LPCTSTR pszModuleName, DWORD & dwVersionInfo)
{
//设置结果
dwVersionInfo=0L;
//接收缓冲
BYTE cbInfoBuffer[1024];
ZeroMemory(cbInfoBuffer,sizeof(cbInfoBuffer));
//模块信息
DWORD dwFileHandle=NULL;
if (GetFileVersionInfo(pszModuleName,dwFileHandle,sizeof(cbInfoBuffer),cbInfoBuffer)==FALSE) return false;
//获取信息
UINT uQuerySize=0;
VS_FIXEDFILEINFO * pFixedFileInfo=NULL;
if (VerQueryValue(cbInfoBuffer,TEXT("\\"),(VOID * *)&pFixedFileInfo,&uQuerySize)==FALSE) return false;
//设置结果
if ((pFixedFileInfo!=NULL)&&(uQuerySize==sizeof(VS_FIXEDFILEINFO)))
{
//设置版本
WORD wVersion1=HIWORD(pFixedFileInfo->dwFileVersionMS);
WORD wVersion2=LOWORD(pFixedFileInfo->dwFileVersionMS);
WORD wVersion3=HIWORD(pFixedFileInfo->dwFileVersionLS);
WORD wVersion4=LOWORD(pFixedFileInfo->dwFileVersionLS);
dwVersionInfo=MAKELONG(MAKEWORD(wVersion4,wVersion3),MAKEWORD(wVersion2,wVersion1));
return true;
}
return false;
}
//压缩数据
ULONG CWHService::CompressData(LPBYTE pcbSourceData, ULONG lSourceSize, BYTE cbResultData[], ULONG lResultSize)
{
//压缩数据
if (compress(cbResultData,&lResultSize,pcbSourceData,lSourceSize)==0L)
{
return lResultSize;
}
return 0L;
}
//解压数据
ULONG CWHService::UnCompressData(LPBYTE pcbSourceData, ULONG lSourceSize, BYTE cbResultData[], ULONG lResultSize)
{
//解压数据
if (uncompress(cbResultData,&lResultSize,pcbSourceData,lSourceSize)==0L)
{
return lResultSize;
}
return 0L;
}
__time64_t CWHService::ConvertDateTimeToDWORD(CString strDateTime)
{
COleDateTime odt;
odt.ParseDateTime(strDateTime);
SYSTEMTIME st;
odt.GetAsSystemTime(st);
CTime tCreate(st);
return tCreate.GetTime();
}
//////////////////////////////////////////////////////////////////////////////////