Advertisement
Guest User

Untitled

a guest
Jan 30th, 2014
1,198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 27.08 KB | None | 0 0
  1. // MiniA.cpp : Defines the entry point for the application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "resource.h"
  6. #include "HShield.h"
  7. #include "HSUpChk.h"
  8. #include <assert.h>
  9. #include <stdio.h>
  10. #include <winsock2.h>
  11. #include <process.h>
  12. #include "NetSvMngr.h"
  13.  
  14. #define MAX_LOADSTRING 100
  15.  
  16. // Global Variables:
  17. HINSTANCE hInst;                                            // current instance
  18. TCHAR szTitle[MAX_LOADSTRING];                              // The title bar text
  19. TCHAR szWindowClass[MAX_LOADSTRING];                        // The title bar text
  20. DWORD g_dwMainThreadID;
  21. TCHAR   g_szHShieldPath[MAX_PATH] = {0,};
  22. TCHAR   g_szIniPath[MAX_PATH] = {0,};
  23. int     g_nServerPort = 0;
  24. char    g_szServerIP[20] = {0,};
  25.  
  26. // Foward declarations of functions included in this code module:
  27. ATOM                MyRegisterClass(HINSTANCE hInstance);
  28. BOOL                InitInstance(HINSTANCE, int);
  29. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  30. LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
  31. int __stdcall AhnHS_Callback(long lCode, long lParamSize, void* pParam);
  32.  
  33. UINT
  34. WINAPI
  35. NetworkThreadProcClient ( LPVOID lParam );
  36. void GetEnvInfoFromIni(void);
  37.  
  38. //
  39. __inline void TRACE(LPCTSTR szFormat, ... )
  40. {
  41.     TCHAR szMsg[1024];
  42.     ZeroMemory(szMsg, 1024);
  43.  
  44.     va_list vargs;
  45.     va_start( vargs, szFormat );
  46.     _vsntprintf( szMsg + _tcslen(szMsg), sizeof(szMsg), szFormat, vargs );
  47.     va_end( vargs );
  48.     OutputDebugString(szMsg);
  49. }
  50.  
  51.  
  52. int APIENTRY WinMain(HINSTANCE hInstance,
  53.                      HINSTANCE hPrevInstance,
  54.                      LPSTR     lpCmdLine,
  55.                      int       nCmdShow)
  56. {
  57.     TCHAR   *pEnd = NULL;
  58.     TCHAR   szFullFileName[MAX_PATH] = { 0, };
  59.     TCHAR   szMsg[255];
  60.     int     nRet;
  61.  
  62.     g_dwMainThreadID = GetCurrentThreadId();
  63.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  64.  
  65.     // ÇöÀç ÇÁ·Î¼¼½º ½ÇÇà ±âÁØÀ¸·Î FULL-PATH¸¦ ¾òÀ½
  66.     GetModuleFileName(NULL, szFullFileName, MAX_PATH);
  67.     pEnd = _tcsrchr( szFullFileName, _T('\\')) + 1;
  68.     if (!pEnd)
  69.     {
  70.         return FALSE;  
  71.     }
  72.     *pEnd = _T('\0');
  73.  
  74.     _stprintf(g_szIniPath, _T("%s"), szFullFileName);              
  75.     _stprintf(g_szHShieldPath, _T("%s\\HShield"), szFullFileName);  // HShield-Path ¼¼ÆÃ
  76.     _tcscat(szFullFileName, _T("HShield\\EhSvc.dll"));              // EHSVC.DLL =Path ¼¼ÆÃ.
  77.     _tcscat(g_szIniPath, _T("MiniAEnv.INI"));                       // MiniAEnv.ini Path ¼¼ÆÃ
  78.  
  79.     // INIÆÄÀϷκÎÅÍ È¯°æÁ¤º¸¸¦ ÀÐÀ½(È®Àå¼­¹ö¿¬µ¿ »ç¿ë À¯¹«, ¼­¹ö IP, ¼­¹ö PORT)
  80.     GetEnvInfoFromIni();
  81.  
  82.     // HS-Monitoring ¼­ºñ½º »ç¿ëÀ» À§ÇÑ ±¸Á¶Ã¼ ¼±¾ð
  83.     AHNHS_EXT_ERRORINFO HsExtError;
  84.     // ¾ÆÀ̵𳪠¸ð´ÏÅ͸µ ÁÖ¼Ò, °ÔÀÓ¹öÀüµîÀº ¾Ïȣȭ³ª ÀÎÄÚµù ÇÏ¿© º¸°üÇÏ¿´´Ù°¡ ½ÇÁ¦ ¾Æ·¡ ÇÔ¼ö¿¡ ÀԷ½Ã
  85.     // º¹È£È­³ª µðÄÚµù ÇÏ¿© ÀÔ·ÂÇÏ´Â °ÍÀÌ ÁÁ´Ù.
  86.     sprintf( HsExtError.szServer, "%s", "210.121.169.209" );        // ¸ð´ÏÅ͸µ ¼­¹öÁÖ¼Ò
  87.     sprintf( HsExtError.szUserId, "%s", "GameUser" );               // À¯Àú ¾ÆÀ̵ð
  88.     // _AhnHS_Initialize½ÃÁ¡¿¡ ¾ÆÀ̵𸦠¾òÀ» ¼ö ¾ø´Â °æ¿ì¿¡´Â ³Î ½ºÆ®¸µÀ» ÀÔ·ÂÇÑ´Ù.
  89.     // ¾ÆÀ̵𸦠¾ò´Â ½ÃÁ¡¿¡ _AhnHS_SetUserId¸¦ È£ÃâÇÏ¿© ¾ÆÀ̵𸦠Àü¼ÛÇÑ´Ù.
  90.     // sprintf( HsExtError.szUserId, "%s", "" );
  91.     sprintf( HsExtError.szGameVersion, "%s", "1.0.0.1" );           // °ÔÀÓ ¹öÀü
  92.  
  93.     // -------------------------------------------------------------------------
  94.     // [_AhnHS_StartMonitor]
  95.     // -------------------------------------------------------------------------
  96.     // - DESCRIPTION:
  97.     //    ÇÙ½¯µå ¸ð´ÏÅ͸µ ¼­ºñ½º¸¦ ½ÃÀÛÇÕ´Ï´Ù.
  98.     // - SYNTAX:
  99.     //     EHSVC_API int __stdcall _AhnHS_StartMonitor(AHNHS_EXT_ERRORINFO HsExtError, LPCSTR szFullFileName)
  100.     //
  101.     //    .  AHNHS_EXT_ERRORINFO HsExtErrorInfo     : AHNHS_EXT_ERRORINFO HsExtErrorInfo :  ¸ð´ÏÅ͸µ °ü·Ã ÀÔ·Â Á¤º¸µé
  102.     //                                                - ¼­¹ö URLÁÖ¼Ò. ( "123.456.789.123" or "www.monitor.com" )
  103.     //                                                - User ID       ( "User1" )
  104.     //                                                - Game Version  ( "5.0.2.1" )
  105.     //    .  szFullFileName                         : EHSVC.DLL Àüü °æ·Î
  106.     //
  107.     // - RETURN VALUE:
  108.     //     . HS_ERR_OK          : ¼º°ø
  109.     //     . ±âŸ               : ±âŸ ¸®ÅÏ°ª¿¡ ´ëÇؼ­´Â ÇÙ½¯µå ÇÁ·Î±×·¡¹Ö °¡À̵å Âü°í¹Ù¶÷.
  110.  
  111.  
  112.     //
  113.     nRet = _AhnHS_StartMonitor( HsExtError, szFullFileName );
  114.  
  115.     if (nRet != HS_ERR_OK)
  116.     {
  117.         _stprintf(szMsg, _T("¸ð´ÏÅ͸µ ±â´É¿¡ ¹®Á¦°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù.(Error Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), nRet);
  118.         MessageBox(NULL, szMsg, szTitle, MB_OK);
  119.         return FALSE;
  120.     }
  121.  
  122.     // -------------------------------------------------------------------------
  123.     // [_AhnHS_Initialize]
  124.     // -------------------------------------------------------------------------
  125.     // - DESCRIPTION:
  126.     //    ÃʱâÈ­ ÇÔ¼ö È£Ãâ
  127.     //    HackShield¸¦ ÃʱâÈ­ÇÏ°í, ¿É¼ÇÀ» ¼³Á¤ÇÕ´Ï´Ù.
  128.     //    ÇÁ·Î±×·¥ÀÌ ÃʱâÈ­µÉ ¶§ ÇÑ ¹ø¸¸ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
  129.     //    ´Ù¸¥ °ÔÀÓ ÇÁ·Î±×·¥¿¡¼­ HackShield¸¦ »ç¿ëÇÏ°í Àְųª ¼­ºñ½º°¡ ºñÁ¤»óÀûÀ¸·Î
  130.     //    Á¾·áµÇ¾úÀ» °æ¿ì ¿À·ù°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.
  131.     //
  132.     // - SYNTAX:
  133.     //     EHSVC_API int __stdcall _AhnHS_Initialize(const char* szFileName,    PFN_AhnHS_Callback pfn_Callback,
  134.     //                                              int nGameCode, const char* szLicenseKey, DWORD dwOption,
  135.     //                                              UINT unAdditionalRatio)
  136.     //    . szFileName          : EHSvc.dllÀÇ Àüü °æ·Î
  137.     //    . Pfn_Callback        : Callback ÇÔ¼öÀÇ Æ÷ÀÎÅÍ
  138.     //    . nGameCode           : 4ÀÚ¸® ¼ýÀÚ    °¢ °ÔÀÓ¿¡ ÇØ´çÇÏ´Â °íÀ¯ ID ÄÚµå
  139.     //    . szLicenseKe         : 24ÀÚ¸® ¹®ÀÚ¿­   °¢ °ÔÀÓ¿¡ ÇØ´çÇÏ´Â ¶óÀ̼±½º Å°
  140.     //    . dwOption            : ÃʱâÈ­ ¿É¼Ç ¼³Á¤
  141.     //    . unAdditionalRatio : Ãß°¡ÀûÀÎ ºñÀ² ¿É¼Ç ¼³Á¤ (½ºÇǵå ÇÙ °¨ÁöÀ² ·¹º§ , Self-Destruction ½Ã°£ ·¹º§)
  142.     //
  143.     // - OPTIONS:
  144.     //   ÇÙ½¯µå ÇÁ·Î±×·¡¹Ö °¡À̵å Âü°í¹Ù¶÷.
  145.     //
  146.     // - RETURN VALUE:
  147.     //     . HS_ERR_OK          : ¼º°ø
  148.     //     . ±âŸ               : ±âŸ ¸®ÅÏ°ª¿¡ ´ëÇؼ­´Â ÇÙ½¯µå ÇÁ·Î±×·¡¹Ö °¡À̵å Âü°í¹Ù¶÷.
  149.  
  150.    
  151.     nRet = _AhnHS_Initialize(szFullFileName, AhnHS_Callback,
  152.         1000, "B228F2916A48AC24",
  153.         AHNHS_CHKOPT_ALL,
  154.         AHNHS_SPEEDHACK_SENSING_RATIO_NORMAL|AHNHS_SELFDESTRUCTION_RATIO_NORMAL);
  155.  
  156.     //¾Æ·¡ ¿¡·¯´Â °³¹ß°úÁ¤¿¡¼­¸¸ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¸é
  157.     //ÀÌÈÄ °áÄÚ ¹ß»ýÇؼ­´Â ¾ÈµÇ´Â ¿¡·¯À̹ǷΠassert󸮸¦ Çß½À´Ï´Ù.
  158.     assert(nRet != HS_ERR_INVALID_PARAM);
  159.     assert(nRet != HS_ERR_INVALID_LICENSE);
  160.     assert(nRet != HS_ERR_ALREADY_INITIALIZED);
  161.  
  162.     if (nRet != HS_ERR_OK)
  163.     {
  164.         //Error ó¸®
  165.         switch(nRet)
  166.         {
  167.             case HS_ERR_ANOTHER_SERVICE_RUNNING:
  168.             {
  169.                 MessageBox(NULL, _T("´Ù¸¥ °ÔÀÓÀÌ ½ÇÇàÁßÀÔ´Ï´Ù.\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), szTitle, MB_OK);
  170.                 break;
  171.             }
  172.             case HS_ERR_INVALID_FILES:
  173.             {
  174.                 MessageBox(NULL, _T("À߸øµÈ ÆÄÀÏ ¼³Ä¡µÇ¾ú½À´Ï´Ù.\nÇÁ·Î±×·¥À» À缳ġÇϽñ⠹ٶø´Ï´Ù."), szTitle, MB_OK);
  175.                 break;
  176.             }
  177.             case HS_ERR_DEBUGGER_DETECT:
  178.             {
  179.                 MessageBox(NULL, _T("ÄÄÇ»ÅÍ¿¡¼­ µð¹ö°Å ½ÇÇàÀÌ °¨ÁöµÇ¾ú½À´Ï´Ù.\nµð¹ö°ÅÀÇ ½ÇÇàÀ» ÁßÁö½ÃŲ µÚ¿¡ ´Ù½Ã ½ÇÇà½ÃÄÑÁֽñâ¹Ù¶ø´Ï´Ù."), szTitle, MB_OK);
  180.                 break;
  181.             }
  182.             case HS_ERR_NEED_ADMIN_RIGHTS:
  183.             {
  184.                 MessageBox(NULL, _T("Admin ±ÇÇÑÀ¸·Î ½ÇÇàµÇ¾î¾ß ÇÕ´Ï´Ù.\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), szTitle, MB_OK);
  185.                 break;
  186.             }
  187.             case HS_ERR_COMPATIBILITY_MODE_RUNNING:
  188.             {
  189.                 MessageBox(NULL, _T("ȣȯ¼º ¸ðµå·Î ÇÁ·Î±×·¥ÀÌ ½ÇÇàÁßÀÔ´Ï´Ù.\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), szTitle, MB_OK);
  190.                 break;             
  191.             }
  192.             default:
  193.             {
  194.                 _stprintf(szMsg, _T("ÇØÅ·¹æÁö ±â´É¿¡ ¹®Á¦°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù.(Error Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), nRet);
  195.                 MessageBox(NULL, szMsg, szTitle, MB_OK);
  196.                 break;
  197.             }
  198.         }
  199.         return FALSE;
  200.     }
  201.  
  202.     // -------------------------------------------------------------------------
  203.     // [_AhnHS_StartService]
  204.     // -------------------------------------------------------------------------
  205.     // - DESCRIPTION:
  206.     //     ÇØÅ· Åø ŽÁö ±â´É°ú ÇØÅ· Â÷´Ü ±â´ÉÀ» µ¿ÀÛ½Ãŵ´Ï´Ù.
  207.     //     _AhnHS_Initialize ÇÔ¼ö¸¦ È£ÃâÇÑ ´ÙÀ½¿¡ È£ÃâÇØ¾ß Çϸç, Áߺ¹ È£ÃâÇÒ ¼ö ¾ø½À´Ï´Ù.
  208.     //     _AhnHS_StopService ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¼­ºñ½º¸¦ ÁßÁöÇÑ °æ¿ì¿¡´Â, ÀÌ ÇÔ¼ö¸¦ ´Ù½Ã
  209.     //     È£ÃâÇÏ¿© ¼­ºñ½º¸¦ ´Ù½Ã ½ÃÀÛ½Ãų ¼ö ÀÖ½À´Ï´Ù.
  210.     //
  211.     // - SYNTAX:
  212.     //    EHSVC_API int __stdcall _AhnHS_StartService( );
  213.     //
  214.     // - RETURN VALUE:
  215.     //    . HS_ERR_OK          : ¼º°ø
  216.     //    . ±âŸ                : ±âŸ ¸®ÅÏ°ª¿¡ ´ëÇؼ­´Â ÇÙ½¯µå ÇÁ·Î±×·¡¹Ö °¡À̵å Âü°í¹Ù¶÷.
  217.  
  218.     nRet = _AhnHS_StartService();
  219.     assert(nRet != HS_ERR_NOT_INITIALIZED);
  220.     assert(nRet != HS_ERR_ALREADY_SERVICE_RUNNING);
  221.  
  222.     if (nRet != HS_ERR_OK)
  223.     {
  224.         _stprintf(szMsg, _T("ÇØÅ·¹æÁö ±â´É¿¡ ¹®Á¦°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù.(Error Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), nRet);
  225.         MessageBox(NULL, szMsg, szTitle, MB_OK);
  226.         return FALSE;
  227.     }
  228.    
  229.  
  230.     // ¼­¹ö¿¬µ¿À» À§ÇÑ Network Åë½Å Thread¸¦ »ý¼ºÇÔ.
  231.     DWORD   nThreadID = 0;
  232.     HANDLE m_hThread = ( HANDLE ) _beginthreadex ( NULL, 0, NetworkThreadProcClient, ( void * ) NULL, 0, (unsigned *) &nThreadID );
  233.    
  234.     MSG msg;
  235.     HACCEL hAccelTable;
  236.  
  237.     LoadString(hInstance, IDC_MINIA, szWindowClass, MAX_LOADSTRING);
  238.     MyRegisterClass(hInstance);
  239.  
  240.     // Perform application initialization:
  241.     if (!InitInstance (hInstance, nCmdShow))
  242.     {
  243.         return FALSE;
  244.     }
  245.  
  246.     hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MINIA);
  247.  
  248.     // Main message loop:
  249.     while (GetMessage(&msg, NULL, 0, 0))
  250.     {
  251.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  252.         {
  253.             TranslateMessage(&msg);
  254.             DispatchMessage(&msg);
  255.         }
  256.     }
  257.  
  258.     // -------------------------------------------------------------------------
  259.     // [_AhnHS_StopService]
  260.     // -------------------------------------------------------------------------
  261.     // - DESCRIPTION:
  262.     //    ÇØÅ· Â÷´Ü ±â´É°ú ÇØÅ· Åø ŽÁö ±â´ÉÀ» Á¤Áö½Ãŵ´Ï´Ù.
  263.     //
  264.     // - SYNTAX:
  265.     //    EHSVC_API int __stdcall _AhnHS_StopService( );
  266.     //
  267.     // - RETURN VALUE:
  268.     //     . HS_ERR_OK                   : ¼º°ø
  269.     //     . HS_ERR_NOT_INITIALIZED      : _AhnHS_Initialize ÇÔ¼ö¸¦ È£ÃâÇÏ¿© HackShield¸¦ ÃʱâÈ­ÇÏÁö ¾ÊÀº »óÅ¿¡¼­
  270.     //                                      È£ÃâÇÑ °æ¿ì ¹ß»ýÇÏ´Â ¿À·ùÀÔ´Ï´Ù.
  271.     //                                      ÀÌ ¿À·ù´Â °³¹ß °úÁ¤¿¡¼­¸¸ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¿À·ù·Î º°µµÀÇ Ã³¸®´Â ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù. (Value = 0x003)
  272.     //     . HS_ERR_SERVICE_NOT_RUNNING  : _AhnHS_StartService ÇÔ¼ö¸¦ È£ÃâÇÏ¿© HackShield¸¦ ½ÃÀÛÇÏÁö ¾ÊÀº »óÅ¿¡¼­
  273.     //                                     È£ÃâÇÑ °æ¿ì ¹ß»ýÇÑ ¿À·ùÀÔ´Ï´Ù. °³¹ß °úÁ¤¿¡¼­¸¸ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¿À·ù·Î º°µµÀÇ
  274.     //                                      Ã³¸®´Â ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù. (Value = 0x301)
  275.  
  276.     nRet = _AhnHS_StopService();
  277.    
  278.     if (nRet != HS_ERR_OK)
  279.     {
  280.         _stprintf(szMsg, _T("_AhnHS_StopService ¿À·ù ¹ß»ý (Error Code = %x)"), nRet);
  281.         MessageBox(NULL, szMsg, szTitle, MB_OK);
  282.         return FALSE;
  283.     }
  284.  
  285.    
  286.     // -------------------------------------------------------------------------
  287.     // [_AhnHS_Uninitialize]
  288.     // -------------------------------------------------------------------------
  289.     // - DESCRIPTION:
  290.     //   ½Ã½ºÅÛ ³»ºÎÀûÀ¸·Î »ç¿ëµÇ¾ú´ø ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ°í º¯¼ö¸¦ ÃʱâÈ­ÇÕ´Ï´Ù.
  291.     //
  292.     // - SYNTAX:
  293.     //   EHSVC_API int __stdcall _AhnHS_Uninitialize( );
  294.     //
  295.     // - RETURN VALUE:
  296.     //   . HS_ERR_OK                    : ¼º°ø
  297.     //   . HS_ERR_SERVICE_STILL_RUNNING : _AhnHS_StopSerivice ÇÔ¼ö¸¦ È£ÃâÇÏ¿© HackShield¸¦ Á¾·áÇÏÁö ¾ÊÀº »óÅ¿¡¼­
  298.     //                                   È£ÃâÇÏ¸é ¹ß»ýÇÏ´Â ¿À·ùÀÔ´Ï´Ù. ÀÌ ¿À·ù´Â °³¹ß °úÁ¤¿¡¼­¸¸ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î
  299.     //                                   º°µµÀÇ Ã³¸®´Â ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù. (Value = 0x302)
  300.     //   . HS_ERR_NOT_INITIALIZED        : _AhnHS_Initialize ÇÔ¼ö È£ÃâÀ» ÅëÇÏ¿© ½Ã½ºÅÛÀ» ÃʱâÈ­ÇÏÁö ¾ÊÀº »óÅ¿¡¼­
  301.     //                                     È£ÃâÇÏ¸é ¹ß»ýÇÏ´Â ¿À·ùÀÔ´Ï´Ù. ÀÌ ¿À·ù´Â °³¹ß °úÁ¤¿¡¼­¸¸ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î
  302.     //                                     º°µµÀÇ Ã³¸®´Â ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù. (Value = 0x003)
  303.  
  304.  
  305.     nRet = _AhnHS_Uninitialize();
  306.  
  307.     if (nRet != HS_ERR_OK)
  308.     {
  309.         _stprintf(szMsg, _T("_AhnHS_Uninitialize ¿À·ù ¹ß»ý (Error Code = %x)"), nRet);
  310.         MessageBox(NULL, szMsg, szTitle, MB_OK);
  311.         return FALSE;
  312.     }
  313.  
  314.     return msg.wParam;
  315. }
  316.  
  317. //
  318. void GetEnvInfoFromIni(void)
  319. {
  320.     // ¼­¹ö Æ÷Æ®
  321.     g_nServerPort = ::GetPrivateProfileInt(_T("ServerInfo"), _T("nPort"), 0, g_szIniPath);
  322.     // ¼­¹ö IP
  323.     ::GetPrivateProfileString(_T("ServerInfo"), _T("IP"), _T(""), g_szServerIP, sizeof(g_szServerIP), g_szIniPath);
  324. }
  325.  
  326. //
  327. //  FUNCTION: MyRegisterClass()
  328. //
  329. //  PURPOSE: Registers the window class.
  330. //
  331. //  COMMENTS:
  332. //
  333. //    This function and its usage is only necessary if you want this code
  334. //    to be compatible with Win32 systems prior to the 'RegisterClassEx'
  335. //    function that was added to Windows 95. It is important to call this function
  336. //    so that the application will get 'well formed' small icons associated
  337. //    with it.
  338. //
  339. ATOM MyRegisterClass(HINSTANCE hInstance)
  340. {
  341.     WNDCLASSEX wcex;
  342.  
  343.     wcex.cbSize = sizeof(WNDCLASSEX);
  344.  
  345.     wcex.style          = CS_HREDRAW | CS_VREDRAW;
  346.     wcex.lpfnWndProc    = (WNDPROC)WndProc;
  347.     wcex.cbClsExtra     = 0;
  348.     wcex.cbWndExtra     = 0;
  349.     wcex.hInstance      = hInstance;
  350.     wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_MINIA);
  351.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
  352.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
  353.     wcex.lpszMenuName   = (LPCSTR)IDC_MINIA;
  354.     wcex.lpszClassName  = szWindowClass;
  355.     wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
  356.  
  357.     return RegisterClassEx(&wcex);
  358. }
  359.  
  360. //
  361. //   FUNCTION: InitInstance(HANDLE, int)
  362. //
  363. //   PURPOSE: Saves instance handle and creates main window
  364. //
  365. //   COMMENTS:
  366. //
  367. //        In this function, we save the instance handle in a global variable and
  368. //        create and display the main program window.
  369. //
  370. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  371. {
  372.    HWND hWnd;
  373.  
  374.    hInst = hInstance; // Store instance handle in our global variable
  375.  
  376.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  377.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  378.  
  379.    if (!hWnd)
  380.    {
  381.       return FALSE;
  382.    }
  383.  
  384.    ShowWindow(hWnd, nCmdShow);
  385.    UpdateWindow(hWnd);
  386.  
  387.    return TRUE;
  388. }
  389.  
  390. //
  391. //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
  392. //
  393. //  PURPOSE:  Processes messages for the main window.
  394. //
  395. //  WM_COMMAND  - process the application menu
  396. //  WM_PAINT    - Paint the main window
  397. //  WM_DESTROY  - post a quit message and return
  398. //
  399. //
  400. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  401. {
  402.     int wmId, wmEvent;
  403.     PAINTSTRUCT ps;
  404.     HDC hdc;
  405.     TCHAR szHello[MAX_LOADSTRING];
  406.     LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
  407.  
  408.     switch (message)
  409.     {
  410.         case WM_COMMAND:
  411.             wmId    = LOWORD(wParam);
  412.             wmEvent = HIWORD(wParam);
  413.             // Parse the menu selections:
  414.             switch (wmId)
  415.             {
  416.                 case IDM_ABOUT:
  417.                    DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  418.                    break;
  419.                 case IDM_EXIT:
  420.                    DestroyWindow(hWnd);
  421.                    break;
  422.                 default:
  423.                    return DefWindowProc(hWnd, message, wParam, lParam);
  424.             }
  425.             break;
  426.         case WM_PAINT:
  427.             hdc = BeginPaint(hWnd, &ps);
  428.             // TODO: Add any drawing code here...
  429.             RECT rt;
  430.             GetClientRect(hWnd, &rt);
  431.             DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
  432.             EndPaint(hWnd, &ps);
  433.             break;
  434.         case WM_DESTROY:
  435.             PostQuitMessage(0);
  436.             break;
  437.         default:
  438.             return DefWindowProc(hWnd, message, wParam, lParam);
  439.    }
  440.    return 0;
  441. }
  442.  
  443. // Mesage handler for about box.
  444. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  445. {
  446.     switch (message)
  447.     {
  448.         case WM_INITDIALOG:
  449.                 return TRUE;
  450.  
  451.         case WM_COMMAND:
  452.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  453.             {
  454.                 EndDialog(hDlg, LOWORD(wParam));
  455.                 return TRUE;
  456.             }
  457.             break;
  458.     }
  459.     return FALSE;
  460. }
  461.  
  462. UINT
  463. WINAPI
  464. ShowMsgAndExitWithTimer_ThreadFunc( LPVOID lParam )
  465. {
  466.    
  467.     Sleep(10000);  // 10Ãʵ¿¾È ´ë±â..
  468.  
  469.     HANDLE hCurrentHandle = ::GetCurrentProcess();
  470.  
  471.     // °ÔÀÓ¿¡¼­ »ç¿ëÁßÀÎ °¢Á¾ ¸Þ¸ð¸® ¹öÆÛ ÇØÁ¦ ¹× Handle Á¾·á
  472.     // ..
  473.     // ..
  474.     ::TerminateProcess( hCurrentHandle, 0 );
  475.     return 0;
  476. }
  477.  
  478. //
  479. void ShowMsgAndExitWithTimer(TCHAR *szMsg)
  480. {
  481.     UINT nThreadID = 0;
  482.    
  483.     HANDLE hThread = ( HANDLE ) _beginthreadex ( NULL, 0, ShowMsgAndExitWithTimer_ThreadFunc, NULL, 0, &nThreadID );
  484.  
  485.     ::MessageBox(NULL, szMsg, szTitle, MB_OK);
  486.     HANDLE hCurrentHandle = ::GetCurrentProcess();
  487.  
  488.     // °ÔÀÓ¿¡¼­ »ç¿ëÁßÀÎ °¢Á¾ ¸Þ¸ð¸® ¹öÆÛ ÇØÁ¦ ¹× Handle Á¾·á
  489.     // ..
  490.     // ..
  491.  
  492.     ::TerminateProcess( hCurrentHandle, 0 );
  493. }
  494.  
  495.  
  496. int __stdcall AhnHS_Callback(long lCode, long lParamSize, void* pParam)
  497. {
  498.     switch(lCode)
  499.     {
  500.         //Engine Callback
  501.         case AHNHS_ENGINE_DETECT_GAME_HACK:
  502.         {
  503.             TCHAR szMsg[255];
  504.             _stprintf(szMsg, _T("´ÙÀ½ À§Ä¡¿¡¼­ ÇØÅ·ÅøÀÌ ¹ß°ßµÇ¾î ÇÁ·Î±×·¥À» Á¾·á½ÃÄ×½À´Ï´Ù.\n%s"), (char*)pParam);
  505.             ShowMsgAndExitWithTimer(szMsg);
  506.  
  507.             break;
  508.         }
  509.         //â¸ðµå ÇØÅ·Åø °¨Áö
  510.         case AHNHS_ENGINE_DETECT_WINDOWED_HACK:
  511.         {
  512.             ShowMsgAndExitWithTimer(_T("ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© â¸ðµå ÇØÅ·ÅøÀÌ °¨ÁöµÇ¾ú½À´Ï´Ù."));
  513.  
  514.             break;
  515.         }
  516.         //Speed °ü·Ã
  517.         case AHNHS_ACTAPC_DETECT_SPEEDHACK:
  518.         {
  519.             ShowMsgAndExitWithTimer(_T("ÇöÀç ÀÌ PC¿¡¼­ SpeedHackÀ¸·Î ÀǽɵǴ µ¿ÀÛÀÌ °¨ÁöµÇ¾ú½À´Ï´Ù."));
  520.             break;
  521.         }
  522.  
  523.         //µð¹ö±ë ¹æÁö
  524.         case AHNHS_ACTAPC_DETECT_KDTRACE:  
  525.         case AHNHS_ACTAPC_DETECT_KDTRACE_CHANGED:
  526.         {
  527.             TCHAR szMsg[255];
  528.             _stprintf(szMsg, _T("ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿© µð¹ö±ë ½Ãµµ°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù. (Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), lCode);
  529.             ShowMsgAndExitWithTimer(szMsg);
  530.             break;
  531.         }
  532.        
  533.         case AHNHS_ACTAPC_DETECT_AUTOMACRO:
  534.         {
  535.             TCHAR szMsg[255];
  536.             _stprintf(szMsg, _T("¸ÅÅ©·Î ±â´ÉÀ¸·Î ÀǽɵǴ µ¿ÀÛÀÌ °¨ÁöµÇ¾ú½À´Ï´Ù.. (Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), lCode);
  537.             ShowMsgAndExitWithTimer(szMsg);
  538.  
  539.             break;
  540.         }
  541.  
  542.         // ÄÚµå ÆÐÄ¡ °¨Áö
  543.         case AHNHS_ACTAPC_DETECT_ABNORMAL_MEMORY_ACCESS:
  544.         {
  545.             TCHAR szMsg[255];
  546.             _stprintf(szMsg, _T("´ÙÀ½ À§Ä¡¿¡¼­ ¸Þ¸ð¸® Á¢±ÙÀÌ °¨ÁöµÇ¾î ÇÁ·Î±×·¥À» Á¾·á½ÃÄ×½À´Ï´Ù.\n%s"), (char*)pParam);
  547.             ShowMsgAndExitWithTimer(szMsg);
  548.             break;
  549.         }
  550.  
  551.         //±×¿Ü ÇØÅ· ¹æÁö ±â´É ÀÌ»ó
  552.         case AHNHS_ACTAPC_DETECT_AUTOMOUSE:
  553.         case AHNHS_ACTAPC_DETECT_DRIVERFAILED:
  554.         case AHNHS_ACTAPC_DETECT_HOOKFUNCTION:
  555.         case AHNHS_ACTAPC_DETECT_MESSAGEHOOK:
  556.         case AHNHS_ACTAPC_DETECT_MODULE_CHANGE:
  557.         case AHNHS_ACTAPC_DETECT_ENGINEFAILED:
  558.         case AHNHS_ACTAPC_DETECT_CODEMISMATCH:
  559.         case AHNHS_ACTAPC_DETECT_PROTECTSCREENFAILED:
  560.         {
  561.             TCHAR szMsg[255];
  562.             _stprintf(szMsg, _T("ÇØÅ· ¹æ¾î ±â´É¿¡ ÀÌ»óÀÌ ¹ß»ýÇÏ¿´½À´Ï´Ù. (Code = %x)\nÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù."), lCode);
  563.             ShowMsgAndExitWithTimer(szMsg);
  564.             break;
  565.         }
  566.     }
  567.     return 1;
  568. }
  569.  
  570.  
  571. #define     OP_LOGON                0x1     // Logon¿¡ ´ëÇÑ Notify
  572. #define     OP_LOGOFF               0x2     // Logoff¿¡ ´ëÇÑ Notify
  573. #define     OP_REQGUID              0x3     // GUID Request Message
  574. #define     OP_ACKGUID              0x4     // GUID Ack Message
  575. #define     OP_REQCRC               0x5     // CRC Request Message
  576. #define     OP_ACKCRC               0x6     // CRC Ack Message
  577. #define     OP_ERROR                0x7     // Error Message
  578.  
  579. // ¼­¹ö¿ÍÀÇ Åë½Å(¼­¹ö¿¬µ¿)À» À§ÇÑ Thread ÇÁ·Î½ÃÁ®.
  580. UINT WINAPI NetworkThreadProcClient ( LPVOID lParam )
  581. {
  582.     int nErrCode = 0;  
  583.     SOCKET socket = 0;
  584.     MSGHEADER header = { 0, };
  585.     DWORD dwRet = ERROR_SUCCESS;
  586.  
  587.     // À©¼Ó DLLÀ» ·ÎµåÇÑ´Ù.
  588.     dwRet = BOANET_LoadWinsock2 ();
  589.     if ( dwRet != ERROR_SUCCESS )
  590.         goto _end;
  591.  
  592.     // Network°ü·Ã ÃʱâÈ­ ÀÛ¾÷À» ÁøÇàÇÑ´Ù.
  593.     dwRet = BOANET_InitializeCli ( &socket, &nErrCode );
  594.     if ( dwRet != ERROR_SUCCESS )
  595.     {
  596.         BOANET_UnloadWinsock2 ();
  597.         goto _end;
  598.     }
  599.  
  600.     // ¼­¹ö¿¡ ¿¬°áÇÑ´Ù.
  601.     dwRet = BOANET_ConnectCli ( socket, g_nServerPort, ( LPTSTR ) ( LPCTSTR ) g_szServerIP, &nErrCode );
  602.     if ( dwRet != ERROR_SUCCESS )
  603.     {
  604.         BOANET_UnloadWinsock2 ();
  605.         goto _end;
  606.     }
  607.  
  608.     // Logon Msg¸¦ º¸³½´Ù.
  609.     header.opCode = OP_LOGON;
  610.     header.length = htonl ( 0 );
  611.  
  612.     dwRet = BOANET_SendCli ( socket,  ( PSTR ) &header, sizeof ( MSGHEADER ), &nErrCode );
  613.     if ( dwRet != ERROR_SUCCESS )
  614.     {
  615.         BOANET_CloseCli ( &socket );
  616.         BOANET_UnloadWinsock2 ();
  617.         goto _end;
  618.     }
  619.  
  620.     while ( TRUE )
  621.     {
  622.         BYTE byReqMsg[SIZEOF_REQMSG] = { 0, };
  623.         BYTE byAckMsg[SIZEOF_GUIDACKMSG] = { 0, };
  624.         PBYTE pbyResponse;
  625.         AHNHS_TRANS_BUFFER TransBuffer;
  626.  
  627.         // 1. Header¸¦ ÀоîµéÀδÙ.
  628.         dwRet = BOANET_ReceiveCli ( socket, ( PSTR ) &header, sizeof ( MSGHEADER ), &nErrCode );
  629.         if ( dwRet != ERROR_SUCCESS )
  630.         {
  631.             BOANET_CloseCli ( &socket );
  632.             BOANET_UnloadWinsock2 ();
  633.             goto _end;
  634.         }
  635.  
  636.         // ¿À·ù ÆÐŶÀÏ °æ¿ì Á¾·á
  637.         if ( header.opCode == OP_ERROR )
  638.         {
  639.             dwRet = ntohl ( header.length );
  640.             break;
  641.         }
  642.  
  643.         // 2. Body¸¦ ¹Þ´Â´Ù.       
  644.         dwRet = BOANET_ReceiveCli ( socket, ( PSTR ) byReqMsg, ntohl ( header.length ), &nErrCode );
  645.         if ( dwRet != ERROR_SUCCESS )
  646.         {
  647.             BOANET_CloseCli ( &socket );
  648.             BOANET_UnloadWinsock2 ();
  649.             goto _end;
  650.         }
  651.  
  652.         // 3. Msgº° 󸮸¦ ÇÑ´Ù.
  653.  
  654.         // -------------------------------------------------------------------------
  655.         // [_AhnHS_MakeResponse]
  656.         // -------------------------------------------------------------------------
  657.         // - DESCRIPTION:
  658.         //    Ŭ¶óÀ̾ðÆ®¿¡¼­ »ç¿ëÇÕ´Ï´Ù. ¼­¹ö¿¡¼­ Àü´ÞÇÑ ¾ÏȣȭµÈ ¹öÀü ¿ä±¸ ¸Þ½ÃÁö¸¦
  659.         //    º¹È£È­ÇÏ°í ÇöÀç Ŭ¶óÀ̾ðÆ® ÆÄÀÏÀÇ ¹öÀüÀ» ¾ÏȣȭÇÏ¿© ÀÀ´ä ¸Þ½ÃÁö¸¦ ¸¸µì´Ï´Ù.
  660.         //
  661.         // - SYNTAX:
  662.         //      int __stdcall _AhnHS_MakeResponse (unsigned char *pbyRequest, unsigned long ulRequestLength,
  663.         //                                  PAHNHS_TRANS_BUFFER pResponseBuffer);
  664.         // - PARAMETERS:
  665.         //      .pbyRequest unsigned char *             :[IN]   ¿äû ¸Þ½ÃÁö ¹öÆÛ
  666.         //      .ulRequestLength    unsigned long       :[IN]   ¿äû ¸Þ½ÃÁö ±æÀÌ
  667.         //      .pResponseBuffer    PAHNHS_TRANS_BUFFER :[OUT]  ÀÀ´ä ¸Þ½ÃÁö ¹öÆÛ
  668.         //
  669.         // - RETURN VALUE:
  670.         //     . ERROR_SUCCESS      : ¼º°ø
  671.         //     . ±âŸ               : ±âŸ ¸®ÅÏ°ª¿¡ ´ëÇؼ­´Â ÇÙ½¯µå ÇÁ·Î±×·¡¹Ö °¡À̵å Âü°í¹Ù¶÷.
  672.         dwRet = _AhnHS_MakeResponse( byReqMsg, ntohl ( header.length ), &TransBuffer );
  673.         if ( dwRet != ERROR_SUCCESS )
  674.         {
  675.             BOANET_CloseCli ( &socket );
  676.             BOANET_UnloadWinsock2 ();
  677.             goto _end;
  678.         }
  679.  
  680.         TRACE("[%x] = _AhnHS_MakeResponse()", dwRet);
  681.  
  682.         // Header¸¦ ÀÛ¼ºÇÑ´Ù.
  683.         header.opCode = OP_ACKCRC;
  684.         header.length = htonl ( TransBuffer.nLength );
  685.  
  686.  
  687.  
  688.         // 4. Header¸¦ º¸³½´Ù.
  689.         dwRet = BOANET_SendCli ( socket,  ( PSTR ) &header, sizeof ( MSGHEADER ), &nErrCode );
  690.         if ( dwRet != ERROR_SUCCESS )
  691.         {
  692.             BOANET_CloseCli ( &socket );
  693.             BOANET_UnloadWinsock2 ();
  694.             goto _end;
  695.         }
  696.  
  697.         // 5. Body¸¦ º¸³½´Ù.
  698.         // [È®Àå ¼­¹ö¿¬µ¿] TransBuffer ÀÇ ¹ÙÀÌÆ® ¹è¿­À» »ç¿ëÇÑ´Ù.
  699.         pbyResponse = TransBuffer.byBuffer;
  700.         dwRet = BOANET_SendCli ( socket,  ( PSTR ) pbyResponse, ntohl ( header.length ), &nErrCode );
  701.         if ( dwRet != ERROR_SUCCESS )
  702.         {
  703.             BOANET_CloseCli ( &socket );
  704.             BOANET_UnloadWinsock2 ();
  705.             goto _end;
  706.         }
  707.     }
  708.  
  709.     // Logoff Msg¸¦ º¸³½´Ù.
  710.     header.opCode = OP_LOGOFF;
  711.     header.length = htonl ( 0 );
  712.  
  713.     BOANET_SendCli ( socket,  ( PSTR ) &header, sizeof ( MSGHEADER ), &nErrCode );
  714.  
  715.     // ¼­¹ö¿Í ¿¬°áÀ» ²÷´Â´Ù.
  716.     BOANET_CloseCli ( &socket );
  717.  
  718.     // À©¼Ó DLLÀ» ¾ð·ÎµùÇÑ´Ù.  
  719.     BOANET_UnloadWinsock2 ();
  720.  
  721. _end:
  722.  
  723.     if ( dwRet != ERROR_SUCCESS )
  724.     {
  725.         TRACE("[%x] = Network Thread Failed", dwRet);
  726.     }
  727.     else
  728.     {
  729.         TRACE("Network Thread Successfully Terminated");
  730.     }
  731.  
  732.     _endthreadex ( 0 );
  733.  
  734.     return 0;
  735. }
  736.  
  737. // Çϱâ¿Í °°Àº ÇüÅ·ΠÇÔ¼ö¸¦ ±¸¼ºÇÏ¿© ÇÙ½¯µå ¾÷µ¥ÀÌÆ® ½ÃÁ¡¿¡ È£ÃâÇÕ´Ï´Ù.
  738. void OnAhnHS_HSUpdate()
  739. {
  740.     // -------------------------------------------------------------------------
  741.     // [_AhnHS_HSUpdate]
  742.     // -------------------------------------------------------------------------
  743.     // - DESCRIPTION:
  744.     //   HackShield ¿£Áø ÆÄÀϵéÀ» ¾÷µ¥ÀÌÆ®ÇÕ´Ï´Ù.
  745.     //
  746.     // - SYNTAX:
  747.     //   DWORD __stdcall _AhnHS_HSUpdate( LPCTSTR szUpdateDir, DWORD dwTimeOut );
  748.     // 
  749.     // - PARAMETERS:
  750.     //   .szUpdateDir               ¾÷µ¥ÀÌÆ® ÆÄÀÏÀÌ ¼³Ä¡µÇ¾î ÀÖ´Â Æú´õ
  751.     //   .dwTimeOut milliseconds    ¾÷µ¥ÀÌÆ® ½Ã ŸÀÓ ¾Æ¿ô ½Ã°£. 0À¸·Î ¼³Á¤ ½Ã INFINITEÀ¸·Î ¼³Á¤
  752.  
  753.     // - RETURN VALUE:
  754.     //          . HACKSHIELD_ERROR_SUCESS   : ¾÷µ¥ÀÌÆ® ¼º°ø (Value = 0x00000000)
  755.     //          . ±âŸ                      : ±âŸ ¸®ÅÏ°ª¿¡ ´ëÇؼ­´Â ÇÙ½¯µå ÇÁ·Î±×·¡¹Ö °¡À̵å Âü°í¹Ù¶÷.
  756.  
  757.     DWORD dwResult = _AhnHS_HSUpdate(g_szHShieldPath, 1000 * 600);
  758.  
  759.     LPTSTR szErrorStr = _T("");
  760.     switch(dwResult)
  761.     {
  762.         case 0x00000000:
  763.             szErrorStr = _T("HS_ERR_OK");
  764.             break;
  765.         case 0x30000010:
  766.             szErrorStr = _T("HS_ERR_ENVFILE_NOTREAD");
  767.             break;
  768.         case 0x30000020:
  769.             szErrorStr = _T("HS_ERR_ENVFILE_NOTWRITE");
  770.             break;
  771.         case 0x30000030:
  772.             szErrorStr = _T("HS_ERR_NETWORK_CONNECT_FAIL");
  773.             break;
  774.         case 0x30000050:
  775.             szErrorStr = _T("HS_ERR_LIB_NOTEDIT_REG");
  776.             break;
  777.         case 0x30000060:
  778.             szErrorStr = _T("HS_ERR_NOTFINDFILE");
  779.             break;
  780.         case 0x30000070:
  781.             szErrorStr = _T("HS_ERR_PROTECT_LISTLOAD_FAIL");
  782.             break;
  783.         case 0x30000080:
  784.             szErrorStr = _T("HS_ERR_PROTECT_VERITY_FAIL");
  785.             break;
  786.         case 0x30000090:
  787.             szErrorStr = _T("HS_ERR_HSUPDATE_TIMEOUT");
  788.             break;
  789.         default :
  790.             szErrorStr = _T("HS_ERR_UNKNOWN");
  791.             break;
  792.     }
  793.    
  794.     TRACE("%s[%x] = AhnHS_HSUpdate(%s, %d)", szErrorStr, dwResult, g_szHShieldPath, 0);
  795. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement