ProcessIndex.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:34k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FileName    :   ProcessIndex.cpp
  4. //  Version     :   1.0
  5. //  Creater     :   Cheng Bitao
  6. //  Date        :   2002-6-25 10:06:47
  7. //  Comment     :   
  8. //
  9. //////////////////////////////////////////////////////////////////////////////////////
  10. // ProcessIndex.cpp: implementation of the CProcessIndex class.
  11. //
  12. //////////////////////////////////////////////////////////////////////
  13. #include "stdafx.h"
  14. #include "ProcessIndex.h"
  15. #include "DataDefine.h"
  16. #include "PublicFun.h"
  17. #include "GetVersion.h"
  18. #include "GetFilesVersion.h"
  19. #include "Global.h"
  20. #include "KAVStrTranslate.h"
  21. #include "AtlBase.h"
  22. #include "Resource.h"
  23. #include "UpdateData.h"
  24. #include "SourceDef.h"
  25. extern KPATH_TABLE g_PathTable;
  26. extern KUPDATE_DATA g_UpdateData;
  27. //-------------------------------------------------------------------
  28. // comment function
  29. //-------------------------------------------------------------------
  30. int CheckSectionIsUpdateItem(const char cszFileName[], const char cszItemName[])
  31. {
  32.     DWORD dwRetCode     = 0;
  33.     int nRetCode        = 0;
  34.     char szUpdateFileFlag[10];
  35.     dwRetCode = ::GetPrivateProfileString(cszItemName, "UpdateFileFlag", "", szUpdateFileFlag, 10, cszFileName);
  36.     if (!dwRetCode)
  37.         return 0;
  38.     nRetCode = stricmp(szUpdateFileFlag, "FALSE");
  39.     if (!nRetCode)
  40.         return 0;
  41.     nRetCode = stricmp(szUpdateFileFlag, "0");
  42.     if (!nRetCode)
  43.         return 0;
  44.     nRetCode = stricmp(szUpdateFileFlag, "TRUE");
  45.     if (!nRetCode)
  46.         return 1;
  47.     nRetCode = stricmp(szUpdateFileFlag, "1");
  48.     if (!nRetCode)
  49.         return 1;
  50.     return 0;
  51. }
  52. int GetActuallyPath(char szPath[], const char cszBasePath[])
  53. {
  54.     int nRetCode = 0;
  55.     char *pszPos    = NULL;
  56.     char szTemp[MAX_PATH] = {0};
  57.     if (!(*szPath))
  58.     {
  59.         strcpy(szPath, cszBasePath);
  60.         goto Exit0;
  61.     }
  62.     
  63.     nRetCode = stricmp(szPath,"%PROGRAMDIR%");
  64.     if (!nRetCode)
  65.     {
  66.         strcpy(szPath, g_PathTable.szUpdateDestPath);
  67.         goto Exit0;
  68.     }
  69.     
  70.     nRetCode = stricmp(szPath, "%TEMPDIR%");
  71.     if (!nRetCode)
  72.     {
  73.         strcpy(szPath, g_PathTable.szTempPath);
  74.         goto Exit0;
  75.     }
  76.     
  77.     nRetCode = stricmp(szPath, "%SYSTEMDIR%"); 
  78.     if (!nRetCode) 
  79.     {
  80.         strcpy(szPath, g_PathTable.szSystemPath);
  81.         goto Exit0;
  82.     }
  83.     
  84.     nRetCode = stricmp(szPath, "%WINDIR%");
  85.     if (!nRetCode)
  86.     {
  87.         strcpy(szPath, g_PathTable.szWindowsPath);
  88.         goto Exit0;
  89.     }
  90.     
  91.     pszPos = strstr(szPath, "%PROGRAMDIR\");
  92.     if (pszPos)
  93.     {
  94.         strcpy(szTemp, szPath);
  95.         strcpy(szPath, g_PathTable.szUpdateDestPath);
  96.         pszPos = strchr(szTemp, '\');
  97.         pszPos++;
  98.         strcat(szPath, pszPos);
  99.         nRetCode = strlen(szPath);
  100.         szPath[nRetCode - 1] = '';
  101.         goto Exit0;
  102.     }  
  103.     
  104.     if (!(
  105.         ((*szPath = '\') || (*szPath = '/')) ||           //Maybe '/' in Unix
  106.         (
  107. (strlen(szPath) > 2) && (*(szPath + 1) == ':') && 
  108. ((*(szPath + 2) == '\')  || (*(szPath + 2) == '/'))
  109.         )
  110. ))              // if is sub-dir
  111.     {
  112.         char szTemp[MAX_PATH] = {0};
  113.         strcpy(szTemp, szPath);
  114.         strcpy(szPath, cszBasePath);
  115.         strcat(szPath, szTemp);
  116.     } 
  117. Exit0:
  118.     AddPathChar(szPath);
  119.     return true;
  120. }
  121. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  122. int CProcessIndex::GetItemInfo(
  123.    PKUPDATE_ITEM pUpdateItem, 
  124.    int nUpdateMethod, char szLocalPath[]
  125.    )
  126. {
  127.     int     nResult             = false;
  128.     DWORD   dwRetCode           = 0;
  129.     int     nRetCode            = 0;
  130.     char    szValue[50]         = {0};
  131.     char    szBuffer[1024]      = {0};
  132.     int     nBufferLen          = 1024;
  133.     char    szCommentName[20]   = {0};
  134.     int     nComment            = 0;
  135. int     nLen     = 0;
  136.     char    szDownloadDir[MAX_PATH] = {0};   
  137.     
  138.     KAV_PROCESS_ERROR(pUpdateItem);
  139.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "FileName", "", pUpdateItem->szFileName, MAX_PATH, m_szTxtFileName); 
  140.     KAV_PROCESS_ERROR(dwRetCode);
  141.     
  142.     pUpdateItem->nFileSize = (int)::GetPrivateProfileInt(pUpdateItem->szItemName, "FileSize", 0, m_szTxtFileName);
  143.     KAV_PROCESS_ERROR(pUpdateItem->nFileSize);
  144.     pUpdateItem->KCheckVersionMethod = (KCHECKVERSIONMETHOD)::GetPrivateProfileInt(pUpdateItem->szItemName, "CheckVersionMethod", 0, m_szTxtFileName);
  145.     
  146.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "SNMask", "", pUpdateItem->szSNMask, defSNMaskSize, m_szTxtFileName);
  147.     // --------------- Process Version As File Date------------------
  148.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "Version", "", szValue, 50, m_szTxtFileName);
  149.     KAV_PROCESS_ERROR(dwRetCode);
  150. strcpy(pUpdateItem->szFileDate, szValue);
  151.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "CRC", "", pUpdateItem->szCRC, 20, m_szTxtFileName);
  152.     KAV_PROCESS_ERROR(dwRetCode);
  153.     if ((pUpdateItem->KCheckVersionMethod == enumCVM_TIME) ||
  154. (pUpdateItem->KCheckVersionMethod == enumCVM_DIRECT) ||
  155.         (pUpdateItem->KCheckVersionMethod == enumCVM_CRC)
  156. )
  157.     {
  158.         pUpdateItem->uMajorVersion = 0;
  159.         pUpdateItem->uMinorVersion = 0;        
  160.     }
  161.     else
  162.     {
  163.         nRetCode = GetVersionFromString(szValue, &(pUpdateItem->uMajorVersion), &(pUpdateItem->uMinorVersion));
  164.         KAV_PROCESS_ERROR(nRetCode);
  165.     }
  166.     // --------------- End of Process Version -----------------------
  167.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "Reboot", "", szValue, 50, m_szTxtFileName);
  168.     KAV_PROCESS_ERROR(dwRetCode);
  169.     if (!stricmp(szValue,  "FALSE") || !stricmp(szValue, "0"))
  170.         pUpdateItem->nReboot = 0;
  171.     else 
  172.         pUpdateItem->nReboot = 1;
  173.     // Update Relative flag
  174.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "UpdateRelative", "", szValue, 50, m_szTxtFileName);
  175.     if (!stricmp(szValue,  "TRUE") || !stricmp(szValue, "1"))
  176.         pUpdateItem->nUpdateRelative = 1;
  177.     else 
  178.         pUpdateItem->nUpdateRelative = 0;
  179.     pUpdateItem->nBelong = ::GetPrivateProfileInt(pUpdateItem->szItemName, "Belong", -1, m_szTxtFileName);
  180.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "SharedNeedReboot", "0", szValue, 50, m_szTxtFileName);
  181.     if (!stricmp(szValue,  "TRUE") || !stricmp(szValue, "1"))
  182.         pUpdateItem->nSharedNeedReboot = 1;
  183.     else 
  184.         pUpdateItem->nSharedNeedReboot = 0;
  185.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "RemotePath", "", pUpdateItem->szRemotePath, MAX_PATH, m_szTxtFileName); 
  186.     KAV_PROCESS_ERROR(dwRetCode);
  187.  //   if (strcmp(pUpdateItem->szRemotePath, ".") == 0)
  188.     if (pUpdateItem->szRemotePath[0] == '.' && (pUpdateItem->szRemotePath[1] == 0 || pUpdateItem->szRemotePath[1] == '/'))
  189.       *(pUpdateItem->szRemotePath) = '';
  190.     
  191.     // --------------- Process LocalPath -----------------------
  192.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "LocalPath", "%PROGRAMDIR%", pUpdateItem->szLocalPath, MAX_PATH, m_szTxtFileName);
  193.     KAV_PROCESS_ERROR(dwRetCode);
  194.     nRetCode = GetActuallyPath(pUpdateItem->szLocalPath, g_PathTable.szUpdateDestPath);
  195.     // --------------- End of Process LocalPath -----------------------
  196.     if (nUpdateMethod == defUPDATE_METHOD_INTERNET)
  197.     {
  198.         strcpy(pUpdateItem->szDownloadTmpFileName, g_PathTable.szDownloadDestPath);
  199.         strcat(pUpdateItem->szDownloadTmpFileName, pUpdateItem->szRemotePath);
  200. nLen = strlen(pUpdateItem->szDownloadTmpFileName) - 1;
  201. for (int i = 0; i <= nLen; i++)
  202.         {
  203.             if (pUpdateItem->szDownloadTmpFileName[i] == '/')
  204.                 pUpdateItem->szDownloadTmpFileName[i] = '\';
  205.         }     
  206.         AddPathChar(pUpdateItem->szDownloadTmpFileName);        
  207.     }
  208.     else
  209.     {
  210.         AddPathChar(szLocalPath);
  211.         strcpy(pUpdateItem->szDownloadTmpFileName, szLocalPath); 
  212. strcat(pUpdateItem->szDownloadTmpFileName, pUpdateItem->szRemotePath);
  213. nLen = strlen(pUpdateItem->szDownloadTmpFileName) - 1;
  214.         for (int i = 0; i <= nLen; i++)
  215.         {
  216.             if (pUpdateItem->szDownloadTmpFileName[i] == '/')
  217.                 pUpdateItem->szDownloadTmpFileName[i] = '\';
  218.         }
  219.         AddPathChar(pUpdateItem->szDownloadTmpFileName);
  220.     }
  221.     //MkDirEx(pUpdateItem->szDownloadTmpFileName);
  222.     strcat(pUpdateItem->szDownloadTmpFileName, pUpdateItem->szFileName);
  223.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "Description", "", pUpdateItem->szDescription, 200, m_szTxtFileName);
  224.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "ApplyVersion", "", pUpdateItem->szApplyVersion, defApplyVersionSize, m_szTxtFileName);
  225.     
  226.     if (nUpdateMethod == defUPDATE_METHOD_INTERNET)
  227.     {
  228.         nRetCode = CheckFileCRC(atoi(pUpdateItem->szCRC), pUpdateItem->szDownloadTmpFileName);
  229.         if (nRetCode)
  230.             pUpdateItem->DownloadStatus = enumDOWNLOADSTATUS_DOWNLOADED;
  231.         else
  232.             pUpdateItem->DownloadStatus = enumDOWNLOADSTATUS_QUEUE;
  233.     }
  234.     pUpdateItem->strReadme = "";
  235.     for (nComment = 1; ; nComment++)
  236.     {
  237.         sprintf(szCommentName, "Comment%d", nComment);
  238.         dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, szCommentName, "", szBuffer, nBufferLen + 1, m_szTxtFileName); 
  239.         if (*szBuffer == '')
  240.             break;
  241.         pUpdateItem->strReadme += (CString)szBuffer + "rn";
  242.     }
  243.     if (!pUpdateItem->strReadme.IsEmpty())
  244.     {
  245.         if (
  246.             (IsSignFileName(pUpdateItem->szFileName)) || 
  247.             (IsUpdFileName(pUpdateItem->szFileName))  || 
  248.             (stricmp(pUpdateItem->szFileName, "KAExtend.DAT") == 0)
  249. )
  250.             m_sVirusNames += pUpdateItem->strReadme + "rn";
  251.         else
  252.             m_sReadme += pUpdateItem->strReadme;
  253.     }
  254.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "CallBy", "", pUpdateItem->szCallBy, MAX_PATH, m_szTxtFileName);
  255.     *szValue = '';
  256.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "FileType", "Program", szValue, 50, m_szTxtFileName);
  257.     pUpdateItem->nItemType = -1;
  258.     dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "NeedDownload", "1", szValue, 50, m_szTxtFileName);
  259.     if (!stricmp(szValue,  "TRUE") || !stricmp(szValue, "1"))
  260.         pUpdateItem->bNeedDownload = 1;
  261.     else 
  262.         pUpdateItem->bNeedDownload = 0; 
  263. dwRetCode = ::GetPrivateProfileString(pUpdateItem->szItemName, "UpdateFileMethod", "Copy", pUpdateItem->szUpdateFileMethod, MAX_PATH, m_szTxtFileName);
  264.     pUpdateItem->bNeedUpdate = false;
  265.     nResult = true;
  266. Exit0:
  267.     return nResult;
  268. }
  269. // Return -1 if Version < szDate, 
  270. // Return 0  if Version == szDate,
  271. // Return 1  if Version > szDate
  272. int _CheckVersionByRes(const char cszFileName[], char szDate[])
  273. {
  274.     IMAGE_DOS_HEADER DOSHeader;
  275.     IMAGE_VXD_HEADER VXDHeader;
  276.     CFile File;
  277.     int nResult = 0;
  278.     
  279.     if (File.Open(cszFileName, CFile::modeRead | CFile::shareDenyNone, NULL))
  280.     {
  281.         UINT uReadLen = 0;
  282.         uReadLen = File.Read(&DOSHeader, sizeof(DOSHeader));
  283.         if ((uReadLen == sizeof(DOSHeader)) && (IMAGE_DOS_SIGNATURE == DOSHeader.e_magic))
  284.         {
  285.             File.Seek(DOSHeader.e_lfanew, CFile::begin);
  286.             uReadLen = File.Read(&VXDHeader, sizeof(VXDHeader));
  287.             if ((uReadLen == sizeof(VXDHeader)) && (IMAGE_OS2_SIGNATURE_LE == VXDHeader.e32_magic))
  288.             {
  289.                 char szBuf[1024];
  290.                 File.Seek(VXDHeader.e32_winresoff, CFile::begin);
  291.                 uReadLen = File.Read(szBuf, VXDHeader.e32_winreslen);
  292.                 if (uReadLen == VXDHeader.e32_winreslen)
  293.                 {
  294.                     unsigned i = 0;
  295.                     for (; i < uReadLen; i++)
  296.                     {
  297.                         if (stricmp(szBuf + i, "FILEVERSION"))
  298.                             continue;
  299.                         char *pszVersion = szBuf + i + 11;   // 2001, 2, 23, 27
  300.                         while (*pszVersion == 0)
  301.                             pszVersion++;
  302.                         
  303.                         i = 0;
  304.                         int j = 0;
  305.                         
  306.                         while (*pszVersion)        // cszDate = "2001.2.23,27"
  307.                         {
  308.                             if (szDate[j] == '')
  309.                                 break;
  310.                             
  311.                             i = _StrToInt(pszVersion);
  312.                             
  313.                             while (*pszVersion != ',')
  314.                             {
  315.                                 if (*pszVersion == 0)
  316.                                     break;
  317.                                 pszVersion++;
  318.                             }
  319.                             
  320.                             while ((*pszVersion == 0x20) || (*pszVersion == ','))
  321.                                 pszVersion++;
  322.                             
  323.                             if (i < (unsigned)_StrToInt(szDate + j))
  324.                             {
  325.                                 nResult = -1;
  326.                                 break;
  327.                             }
  328.                             else if (i > (unsigned)_StrToInt(szDate + j))
  329.                             {
  330.                                 nResult = 1;
  331.                                 break;
  332.                             }
  333.                             
  334.                             
  335.                             while ((szDate[j] != '.') && (szDate[j] != ''))
  336.                                 j++;
  337.                             if (szDate[j] == '.')
  338.                                 j++;
  339.                             else
  340.                                 break;
  341.                         }
  342.                         
  343.                         if ((*pszVersion == '') && (szDate[j] == ''))
  344.                             nResult = 0;
  345.                         
  346.                         break;
  347.                     }
  348.                 }
  349.             }
  350.         }
  351.         
  352.         File.Close();
  353.     }
  354.     
  355.     return nResult;
  356. }   
  357. //////////////////////////////////////////////////////////////////////
  358. // Construction/Destruction
  359. //////////////////////////////////////////////////////////////////////
  360. CProcessIndex::CProcessIndex()
  361. {
  362.     m_szFileName[0]           = '';
  363.     m_szTxtFileName[0]        = '';
  364.     m_bInitFlag               = false; 
  365.     
  366. m_bVersionError           = true;
  367.     m_nVersion_ValueCount     = 0;  
  368. m_nMajorVersionValueCount = 0;
  369. m_sWebDownAddress         = "";
  370.     
  371. m_nMaxDATFileNum          = 0;
  372.     m_nMaxUPDFileNum          = 0;
  373.     m_sVirusNames             = "";
  374.     m_sReadme                 = "";
  375.     m_sAnnounce               = "";
  376.     m_bNeedUpdateSelfFirst    = false;
  377.     m_pUpdateItemList         = NULL;
  378.     m_pModuleExitInfoList     = NULL;    
  379.     
  380.     m_bFileError              = false;
  381. m_szCallBy[0]   = '';
  382. }
  383. CProcessIndex::~CProcessIndex()
  384. {
  385.     Uninit();
  386.     
  387.     m_szFileName[0]         = '';
  388.     m_szTxtFileName[0]      = '';
  389.     m_bInitFlag             = false; 
  390.     m_bVersionError         = true;
  391.     m_nVersion_ValueCount   = 0;     
  392.     m_nMaxDATFileNum        = 0;
  393.     m_nMaxUPDFileNum        = 0;
  394.     m_sVirusNames           = "";
  395.     m_sReadme               = "";
  396.     m_sAnnounce             = "";
  397.     m_bNeedUpdateSelfFirst  = false;
  398.     
  399.     m_pUpdateItemList       = NULL;    
  400. }
  401. int CProcessIndex::Init(const char cszFileName[], const char cszTxtFileName[])
  402. {
  403.     int nRetCode    = 0;
  404.     int nResult     = false;
  405.     
  406.     strcpy(m_szFileName, cszFileName);
  407.     strcpy(m_szTxtFileName, cszTxtFileName);
  408.     
  409.     FreeUpdateItemList();
  410.     FreeModuleExitInfoList();
  411.     
  412.     nRetCode = FileExists(m_szFileName);
  413.     KAV_PROCESS_ERROR(nRetCode);
  414.     
  415.     // UnCompress index.dat to index.txt
  416.     nRetCode = UnCompressFile(m_szFileName, m_szTxtFileName);
  417.     KAV_PROCESS_ERROR(nRetCode);
  418.     
  419.     m_bInitFlag = true;
  420.     nResult = true;
  421. Exit0:
  422.     return nResult;    
  423. }
  424. int CProcessIndex::Uninit()
  425. {
  426.     ::DeleteFile(m_szTxtFileName);
  427.     FreeUpdateItemList();
  428.     FreeModuleExitInfoList();
  429.     return true;
  430. }
  431. int CProcessIndex::FreeUpdateItemList()
  432. {
  433.     PKUPDATE_ITEM pUpdateItem = NULL;
  434.     while (m_pUpdateItemList)
  435.     {
  436.         pUpdateItem = m_pUpdateItemList->pNext;      
  437.         KAV_DELETE(m_pUpdateItemList);         
  438.         m_pUpdateItemList = pUpdateItem;
  439.     }
  440.     return true;
  441. }
  442. int CProcessIndex::FreeModuleExitInfoList()
  443. {
  444.     PKModuleExitInfoList pModuleExitInfoList = NULL;
  445.     while (m_pModuleExitInfoList)
  446.     {
  447.         pModuleExitInfoList = m_pModuleExitInfoList->pNext;      
  448.         KAV_DELETE(m_pModuleExitInfoList);         
  449.         m_pModuleExitInfoList = pModuleExitInfoList;
  450.     }
  451.     return true;
  452. }
  453. int CProcessIndex::InitModuleExitInfo()
  454. {
  455.     int nResult = false;
  456.     int i;
  457.     char szKeyName[MAX_PATH] = {0};
  458.     char szFileName[MAX_PATH] = {0};
  459. char szReleaseFileName[MAX_PATH] = {0};
  460.     PKModuleExitInfoList pModuleExitInfoList = NULL;
  461.     KAV_PROCESS_ERROR(m_bInitFlag);
  462.     for (i = 0; ; i++)
  463.     {
  464.         sprintf(szKeyName, "FileName%d", i);
  465.         ::GetPrivateProfileString("ExitType", szKeyName, "", szFileName, MAX_PATH, m_szTxtFileName);
  466.         if (szFileName[0] == '')
  467.             break;
  468.         pModuleExitInfoList = new KModuleExitInfoList;
  469.         if (!pModuleExitInfoList)
  470.             goto Exit0;
  471.         pModuleExitInfoList->pNext = NULL;
  472.         strcpy(pModuleExitInfoList->MouleExitInfo.szFileName, szFileName);
  473. sprintf(szKeyName, "ReleaseFileName%d", i);
  474.         ::GetPrivateProfileString("ExitType", szKeyName, "", szReleaseFileName, MAX_PATH, m_szTxtFileName);
  475.         if (szReleaseFileName[0] == '')
  476.             strcpy(szReleaseFileName, szFileName);
  477. strcpy(pModuleExitInfoList->MouleExitInfo.szReleaseFileName, szReleaseFileName);
  478.         sprintf(szKeyName, "ExitType%d", i);
  479.         pModuleExitInfoList->MouleExitInfo.nExitType = ::GetPrivateProfileInt("ExitType", szKeyName, 0, m_szTxtFileName);
  480. pModuleExitInfoList->MouleExitInfo.uID = 0;
  481. pModuleExitInfoList->MouleExitInfo.szStartParam[0] = '';
  482. pModuleExitInfoList->MouleExitInfo.szStopParam[0] = '';
  483.         
  484.         switch (pModuleExitInfoList->MouleExitInfo.nExitType)
  485.         {
  486.         case defEXIT_TYPE_DIRECTORY:
  487.         case defEXIT_TYPE_IPC:
  488. case defEXIT_TYPE_RPC:
  489.             sprintf(szKeyName, "StopParam%d", i);
  490.             ::GetPrivateProfileString("ExitType", szKeyName, "", pModuleExitInfoList->MouleExitInfo.szStopParam, MAX_PATH, m_szTxtFileName);    
  491.             sprintf(szKeyName, "StartParam%d", i);
  492.             ::GetPrivateProfileString("ExitType", szKeyName, "", pModuleExitInfoList->MouleExitInfo.szStartParam, MAX_PATH, m_szTxtFileName);    
  493.             if ((pModuleExitInfoList->MouleExitInfo.nExitType == defEXIT_TYPE_IPC) ||
  494. (pModuleExitInfoList->MouleExitInfo.nExitType == defEXIT_TYPE_RPC)
  495. )
  496.             {
  497.                 sprintf(szKeyName, "UID%d", i);
  498.                 pModuleExitInfoList->MouleExitInfo.uID = ::GetPrivateProfileInt("ExitType", szKeyName, 0, m_szTxtFileName);    
  499.             }
  500.             break;
  501.         case defEXIT_TYPE_SERVICE:
  502.             break;
  503.         default:
  504.             break;
  505.         }
  506.         if (!m_pModuleExitInfoList)
  507.         {
  508.             m_pModuleExitInfoList = pModuleExitInfoList;
  509.         }
  510.         else
  511.         {
  512.             pModuleExitInfoList->pNext = m_pModuleExitInfoList;
  513.             m_pModuleExitInfoList = pModuleExitInfoList;
  514.         }
  515.         pModuleExitInfoList = NULL;
  516.     }
  517.     // For old index 
  518.     if (0 == i)
  519.     {
  520.         pModuleExitInfoList = new KModuleExitInfoList;
  521.         if (!pModuleExitInfoList)
  522.             goto Exit0;
  523.         strcpy(pModuleExitInfoList->MouleExitInfo.szFileName, "KAV9X.EXE");
  524.         pModuleExitInfoList->MouleExitInfo.nExitType = 1;
  525.         pModuleExitInfoList->MouleExitInfo.uID = 1;
  526.         strcpy(pModuleExitInfoList->MouleExitInfo.szStopParam, "/quit");
  527. pModuleExitInfoList->MouleExitInfo.szStartParam[0] = '';
  528.         pModuleExitInfoList->pNext = NULL;
  529.         m_pModuleExitInfoList = pModuleExitInfoList;
  530.         pModuleExitInfoList = new KModuleExitInfoList;
  531.         if (!pModuleExitInfoList)
  532.             goto Exit0;
  533.         strcpy(pModuleExitInfoList->MouleExitInfo.szFileName, "Watcher.EXE");
  534.         pModuleExitInfoList->MouleExitInfo.nExitType = 1;
  535.         pModuleExitInfoList->MouleExitInfo.uID = 2;
  536.         strcpy(pModuleExitInfoList->MouleExitInfo.szStopParam, "/quit");
  537. pModuleExitInfoList->MouleExitInfo.szStartParam[0] = '';
  538. pModuleExitInfoList->pNext = NULL;  
  539.         
  540.         m_pModuleExitInfoList->pNext = pModuleExitInfoList;
  541.     }
  542.     nResult = true;
  543. Exit0:
  544.     return nResult;
  545. }
  546. int CProcessIndex::AddItemInfoToList(
  547.  const char cszSectionName[], int nUpdateMethod,
  548.  char szLocalPath[],
  549.  int nMainVersion
  550.  )
  551. {
  552.     int nResult                 = false;
  553.     int nRetCode                = 0;
  554.     PKUPDATE_ITEM pUpdateItem   = NULL;
  555.     char szTemp[MAX_PATH]       = {0};
  556.     char *pszFileNamePos        = NULL;
  557.     CString sMsg;
  558.     CString sFormat;
  559.     
  560.     nRetCode = CheckSectionIsUpdateItem(m_szTxtFileName, cszSectionName);
  561.     if (nRetCode)
  562.     {
  563.         pUpdateItem = new KUPDATE_ITEM;
  564.         KAV_PROCESS_ERROR(pUpdateItem);
  565.         
  566.         pUpdateItem->pNext = NULL;
  567.         pUpdateItem->nDownTryTimes = 0;
  568.         
  569.         strcpy(pUpdateItem->szItemName, cszSectionName);
  570.         
  571.         nRetCode = GetItemInfo(pUpdateItem, nUpdateMethod, szLocalPath);
  572.         KAV_PROCESS_ERROR(nRetCode);
  573.         nRetCode = CheckIsNeedUpdate(pUpdateItem, nMainVersion);
  574.         if (nRetCode)
  575.         {
  576.             if (nUpdateMethod == defUPDATE_METHOD_INTERNET)
  577.             {
  578.                 strcpy(szTemp, pUpdateItem->szDownloadTmpFileName);
  579.                 pszFileNamePos = strrchr(szTemp, '\');
  580.                 if (pszFileNamePos)
  581.                     *pszFileNamePos = '';
  582.                 MkDirEx(szTemp);
  583.             }
  584.             else
  585.             {
  586.                 nRetCode = CheckFileCRC(atoi(pUpdateItem->szCRC), pUpdateItem->szDownloadTmpFileName);
  587.                 if (nRetCode)
  588.                     pUpdateItem->DownloadStatus = enumDOWNLOADSTATUS_DOWNLOADED;
  589.                 else 
  590.                 {
  591.                     pUpdateItem->DownloadStatus = enumDOWNLOADSTATUS_ERROR;
  592.                     if (!m_bFileError)
  593.                         m_bFileError = pUpdateItem->bNeedDownload;
  594.                     sFormat = defIDS_FILE_ERROR_FORMAT;
  595.                     sMsg.Format(sFormat, pUpdateItem->szDownloadTmpFileName);
  596.                     g_UpdateData.SaveLog.WriteLogString(sMsg, true);  
  597.                 }
  598.             }
  599.             if (!m_pUpdateItemList)
  600.             {
  601.                 m_pUpdateItemList = pUpdateItem;
  602.             }
  603.             else
  604.             {
  605.                 pUpdateItem->pNext = m_pUpdateItemList;
  606.                 m_pUpdateItemList = pUpdateItem;                
  607.             }
  608. StrAddStr(m_szCallBy, pUpdateItem->szCallBy);
  609.             // Set bNeedUpdateSelfFirst flag
  610.             if ((pUpdateItem->nUpdateRelative) && pUpdateItem->bNeedUpdate)
  611.                 m_bNeedUpdateSelfFirst = true;
  612.             // Get max KAVXXXXX.Dat file Number
  613.             nRetCode = GetSignFileNumber(pUpdateItem->szFileName);
  614.             if (IsSignFileName(pUpdateItem->szFileName))
  615.             {
  616.                 if (nRetCode > m_nMaxDATFileNum)
  617.                     m_nMaxDATFileNum = nRetCode;
  618.             }
  619.             else 
  620.             {
  621.                 if (nRetCode > m_nMaxUPDFileNum)
  622.                     m_nMaxUPDFileNum = nRetCode;
  623.             }
  624.         }
  625.         else
  626.         {
  627.             KAV_DELETE(pUpdateItem);
  628.         }        
  629. }
  630.     nResult = true;
  631. Exit0:
  632.     if (!nResult)
  633. {
  634.         KAV_DELETE(pUpdateItem);
  635. }
  636.     return nResult;
  637.  
  638. }
  639.  
  640. int CProcessIndex::AnalysisUpdateFiles
  641. (int nMethod, 
  642.   char szLocalPath[],
  643.   int nMainVersion
  644.  )
  645.  
  646.  
  647. {
  648. int nResult                     = false;
  649. int nRetCode                    = 0;
  650. char szSectionNames[10 * 1024]  = {0};
  651. int  nSectionNamesSize          = 1024 * 10;
  652. char *pszSectionName            = NULL;
  653. int nSectionNameLen             = 0;
  654. DWORD dwRetCode                 = 0;
  655. char szTemp[20]                 = {0};
  656. PKUPDATE_ITEM pUpdateItem       = NULL;
  657. PKUPDATE_ITEM pPreUpdateItem    = NULL;
  658. int nBufferLen             = 1024;
  659. char szBuffer[1024]             = {0};
  660. int nFlag                       = 0;
  661. int nItemNumber                 = 0;
  662. int i                           = 0;
  663. KAV_PROCESS_ERROR(m_bInitFlag);
  664. // Free item list at first
  665. FreeUpdateItemList();
  666. FreeModuleExitInfoList();
  667. m_nMaxDATFileNum = 0;
  668. m_nMaxUPDFileNum = 0;
  669. // Get Comment information from index.txt
  670. m_sAnnounce = "";
  671. // Get message for user
  672. ::GetPrivateProfileString(
  673. "COMMENT", 
  674. "Readme", 
  675. "", 
  676. szBuffer, 
  677. nBufferLen, 
  678. m_szTxtFileName
  679. );
  680. if (*szBuffer != '')
  681. {
  682. m_sAnnounce = szBuffer;
  683. m_sAnnounce.Replace("#", "rn");
  684. }
  685. // Initialize Module exit info
  686. nRetCode = InitModuleExitInfo();
  687. KAV_PROCESS_ERROR(nRetCode);
  688. // Initialize Version string and version value
  689. nRetCode = InitVersionInfo();
  690. KAV_PROCESS_ERROR(nRetCode);
  691. if(nRetCode == defVersionNotenough)
  692. {
  693. nResult = defVersionNotenough;
  694. ::GetPrivateProfileString(
  695. "Version", 
  696. "WebDown", 
  697. "http://www.jxonline.net", 
  698. url, 
  699. MAX_PATH, 
  700. m_szTxtFileName
  701. );
  702. goto Exit0;
  703. }
  704. else if(nRetCode == defVersionMore) {
  705. nResult = defVersionMore;
  706. goto Exit0;
  707. }
  708. // Get Update file information from index.txt
  709. dwRetCode = ::GetPrivateProfileSectionNames(szSectionNames, nSectionNamesSize, m_szTxtFileName);
  710. KAV_PROCESS_ERROR(dwRetCode);
  711. pszSectionName = szSectionNames;
  712. while (*pszSectionName)
  713. {
  714. // Process one update file item, add to update file list
  715. nRetCode = AddItemInfoToList(pszSectionName, nMethod, szLocalPath, nMainVersion);
  716. // Get next Item name
  717. nSectionNameLen = strlen(pszSectionName);
  718. pszSectionName += nSectionNameLen + 1;
  719. }
  720. // Update Update.EXE first
  721. // Delete the not relative file with update.exe
  722. if (m_bNeedUpdateSelfFirst)
  723. {                             
  724. pUpdateItem     = m_pUpdateItemList;                    
  725. pPreUpdateItem  = pUpdateItem;
  726. while (pUpdateItem)
  727. {
  728. if (!pUpdateItem->nUpdateRelative)
  729. {
  730. if (pUpdateItem == pPreUpdateItem)
  731. {
  732. m_pUpdateItemList = m_pUpdateItemList->pNext;
  733. pPreUpdateItem = m_pUpdateItemList;
  734. pUpdateItem->pNext = NULL;
  735. delete pUpdateItem;
  736. pUpdateItem = m_pUpdateItemList;
  737. }
  738. else 
  739. {
  740. pPreUpdateItem->pNext = pUpdateItem->pNext;                    
  741. pUpdateItem->pNext = NULL;
  742. delete pUpdateItem;
  743. pUpdateItem = pPreUpdateItem->pNext;
  744. }
  745. continue;
  746. }        
  747. if (pUpdateItem != m_pUpdateItemList)
  748. pPreUpdateItem = pPreUpdateItem->pNext;
  749. pUpdateItem = pUpdateItem->pNext;            
  750. }
  751. nResult = true;
  752. goto Exit0;
  753. }
  754. nResult = true;
  755. Exit0:
  756. if (!nResult)
  757. {
  758. FreeUpdateItemList();    
  759. FreeModuleExitInfoList();
  760. }
  761. return nResult;
  762. }
  763. int CProcessIndex::GetExitType(PKModuleExitInfo pModuleExitInfo)
  764. {
  765.     int nResult = false;
  766.     PKModuleExitInfoList pModuleExitInfoList = NULL;
  767.     KAV_PROCESS_ERROR(m_bInitFlag);
  768.     KAV_PROCESS_ERROR(pModuleExitInfo);
  769. pModuleExitInfo->nExitType = -1;
  770. pModuleExitInfo->szReleaseFileName[0] = '';
  771. pModuleExitInfo->szStartParam[0] = '';
  772. pModuleExitInfo->szStopParam[0] = '';
  773. pModuleExitInfo->uID = 0;
  774.     pModuleExitInfoList = m_pModuleExitInfoList;
  775.     while(pModuleExitInfoList)
  776.     {
  777.         if (stricmp(pModuleExitInfo->szFileName, pModuleExitInfoList->MouleExitInfo.szFileName) == 0)
  778.         {
  779.             sprintf(pModuleExitInfo->szReleaseFileName, "%s%s", g_PathTable.szUpdateDestPath, pModuleExitInfoList->MouleExitInfo.szReleaseFileName);
  780.             pModuleExitInfo->nExitType = pModuleExitInfoList->MouleExitInfo.nExitType;
  781.             pModuleExitInfo->uID = pModuleExitInfoList->MouleExitInfo.uID;
  782.             strcpy(pModuleExitInfo->szStartParam, pModuleExitInfoList->MouleExitInfo.szStartParam);
  783.             strcpy(pModuleExitInfo->szStopParam, pModuleExitInfoList->MouleExitInfo.szStopParam);
  784.             break;
  785.         }
  786.         pModuleExitInfoList = pModuleExitInfoList->pNext;
  787.     }
  788.     if (!pModuleExitInfoList)
  789.         goto Exit0;
  790.     nResult = true;
  791. Exit0:
  792.     return nResult;
  793. }
  794. bool CProcessIndex::IsVersionError()
  795. {
  796.     return m_bVersionError;
  797. }
  798. bool CProcessIndex::IsNeedUpdateSelf()
  799. {
  800.     return m_bNeedUpdateSelfFirst;
  801. }
  802. bool CProcessIndex::IsNotUpdateItem()
  803. {
  804.     return (m_pUpdateItemList == NULL);
  805. }
  806. int CProcessIndex::InitVersionInfo()
  807. {
  808.     if (!m_bInitFlag)
  809. {
  810.         return false;
  811. }
  812. m_nVersion_ValueCount = ::GetPrivateProfileInt
  813. (
  814. "Version", 
  815. "Version", 
  816. 0,  
  817. m_szTxtFileName
  818.         );
  819.     m_nMajorVersionValueCount = ::GetPrivateProfileInt
  820. (
  821. "Version", 
  822. "MajorVersion", 
  823. 0,  
  824. m_szTxtFileName
  825.         );
  826. CString strVersion = g_PathTable.szModulePath;
  827.     int nVersionNumber = ::GetPrivateProfileInt
  828. (
  829. "Version",
  830. "MajorVersion",
  831. 0,
  832. strVersion + "Version.cfg"
  833. );
  834.     
  835. char szWebAddressBuffer[MAX_PATH];
  836. ::GetPrivateProfileString("Version", "WebDown", "http://www.jxonline.net", szWebAddressBuffer, MAX_PATH, m_szTxtFileName);
  837.     m_sWebDownAddress = szWebAddressBuffer;
  838. if(nVersionNumber < m_nMajorVersionValueCount)
  839. {
  840. return defVersionNotenough;
  841. }
  842. if(nVersionNumber > m_nMajorVersionValueCount)
  843. {
  844. return defVersionMore;
  845. }
  846.     return true;
  847. }
  848. int CProcessIndex::CheckIsNeedUpdate(
  849.  PKUPDATE_ITEM pUpdateItem,
  850.  int nMainVersion
  851.  )
  852. {
  853.     int nSignMaxNum     = 0;  
  854.     int nRetCode            = 0;
  855.     int nCurrentVersion     = 0;
  856.     char *pszPos            = NULL;
  857.     int nCurrentNumber      = 0;
  858.     char szLocalFullFileName[MAX_PATH] = {0};
  859.     DWORD dwMajorVersion    = 0;
  860.     DWORD dwMinorVersion    = 0;
  861.     int nSignFileFlag       = 0;
  862.     
  863.     KAV_PROCESS_ERROR(pUpdateItem);
  864.     pUpdateItem->bNeedUpdate = false;
  865. // Belone Version error
  866.     if (pUpdateItem->nBelong >= 0 && pUpdateItem->nBelong != nMainVersion)
  867. goto Exit0;
  868.     m_bVersionError = FALSE;
  869.     // Data file, such as readme.txt or KAVDX.txt
  870.     if (pUpdateItem->KCheckVersionMethod == enumCVM_DIRECT)
  871.     {
  872.         pUpdateItem->bNeedUpdate = true;
  873.         goto Exit0;
  874.     }
  875.     strcpy(szLocalFullFileName, pUpdateItem->szLocalPath);
  876.     strcat(szLocalFullFileName, pUpdateItem->szFileName);
  877. nRetCode = FileExists(szLocalFullFileName);
  878.     if (!nRetCode)
  879.     {
  880.         pUpdateItem->bNeedUpdate = true;
  881.         goto Exit0;
  882.     }
  883.     if (pUpdateItem->KCheckVersionMethod == enumCVM_CRC)
  884.     {
  885.         pUpdateItem->bNeedUpdate = !CheckFileCRC(atoi(pUpdateItem->szCRC), szLocalFullFileName);   // CRC        
  886.         goto Exit0;
  887.     }
  888.     if (pUpdateItem->KCheckVersionMethod == enumCVM_TIME)
  889.     {
  890.         nRetCode = CheckFileDate(szLocalFullFileName, pUpdateItem->szFileDate);
  891.         if (nRetCode)
  892.         {
  893.             pUpdateItem->bNeedUpdate = true;
  894.             goto Exit0;
  895.         }
  896.         
  897.         goto Exit1;
  898.     }
  899.     
  900.     if ((pUpdateItem->KCheckVersionMethod == enumCVM_SIGN) &&
  901.         (IsSignFileName(pUpdateItem->szFileName) || IsUpdFileName(pUpdateItem->szFileName)) 
  902. )
  903.     {
  904.         nRetCode = GetLocalSignVersion(&dwMajorVersion, &dwMinorVersion); 
  905.         nSignFileFlag = 1;
  906.     }
  907.     else
  908.     {
  909.         // Such as KAEngine.dat, KAEPlats KAEngine.dat, KAEPlat.dll, KAV9X.EXE......
  910.         
  911.         nRetCode = GetKAVFileVersion(szLocalFullFileName, pUpdateItem->KCheckVersionMethod, &dwMajorVersion, &dwMinorVersion);
  912.         if (!nRetCode)
  913. {
  914. nRetCode = _CheckVersionByRes(szLocalFullFileName, pUpdateItem->szFileDate);
  915.             if (nRetCode < 0)
  916.                 pUpdateItem->bNeedUpdate = true;
  917.             else if (nRetCode == 0)
  918.                 goto Exit1;
  919.             goto Exit0;
  920. }
  921.     }
  922.     pUpdateItem->bNeedUpdate = (
  923.         (pUpdateItem->uMajorVersion > dwMajorVersion) ||
  924.         (
  925. (pUpdateItem->uMajorVersion == dwMajorVersion) && 
  926. (pUpdateItem->uMinorVersion > dwMinorVersion)
  927.         ) 
  928. );
  929.     if (pUpdateItem->bNeedUpdate || 
  930.         !((pUpdateItem->uMajorVersion == dwMajorVersion) && 
  931. (pUpdateItem->uMinorVersion == dwMinorVersion))
  932. )
  933.         goto Exit0;
  934. Exit1:
  935.     // if is the same version but the file was destroy then update this file
  936.     if (nSignFileFlag) 
  937.     {
  938. nRetCode = CheckExistSameVersionFile(pUpdateItem->szFileName);
  939. if (nRetCode == 0)
  940. pUpdateItem->bNeedUpdate = true;
  941. else if (nRetCode == 1)
  942. pUpdateItem->bNeedUpdate = false;
  943. else
  944. pUpdateItem->bNeedUpdate = !CheckFileCRC(atoi(pUpdateItem->szCRC), szLocalFullFileName);
  945.     }
  946.     else
  947.         pUpdateItem->bNeedUpdate = !CheckFileCRC(atoi(pUpdateItem->szCRC), szLocalFullFileName);
  948. Exit0:
  949.     return pUpdateItem->bNeedUpdate;
  950. }
  951. CString CProcessIndex::GetVirusNames()
  952. {
  953.     return m_sVirusNames;
  954. }
  955. CString CProcessIndex::GetReadme()
  956. {
  957.     return m_sReadme;
  958. }
  959. CString CProcessIndex::GetAnnounce()
  960. {
  961.     return m_sAnnounce;
  962. }
  963. int CProcessIndex::GetHost(char szHostName[], int *pnNameSize, char szHostURL[], int *pnURLSize)
  964. {
  965.     int nResult = false;    
  966.     
  967.     if (!pnNameSize || !pnURLSize)
  968.         goto Exit0;
  969.     nResult = true;
  970. Exit0:
  971.     return nResult;
  972. }
  973. int CProcessIndex::GetDubaVersion()
  974. {
  975.     int nResult = -1;
  976.     if (!m_bInitFlag)  
  977. return nResult;
  978. nResult = ::GetPrivateProfileInt("COMMENT", "Version", 0, m_szTxtFileName);
  979. return nResult;
  980. }
  981. int CProcessIndex::GetPath(char szPath[], int nSize)
  982. {
  983. if (!m_bInitFlag)  
  984. return false;
  985. ::GetPrivateProfileString("COMMENT", "PathName", "", szPath, nSize, m_szTxtFileName);
  986. return true;    
  987. }