00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vmsMaliciousDownloadChecker.h"
00009 #include "vmsSimpleFileDownloader.h"
00010
00011 #ifdef _DEBUG
00012 #undef THIS_FILE
00013 static char THIS_FILE[]=__FILE__;
00014 #define new DEBUG_NEW
00015 #endif
00016
00017 vmsMaliciousDownloadChecker::vmsMaliciousDownloadChecker()
00018 {
00019 m_dldr = NULL;
00020 m_bNeedStop = false;
00021 }
00022
00023 vmsMaliciousDownloadChecker::~vmsMaliciousDownloadChecker()
00024 {
00025
00026 }
00027
00028 fsInternetResult vmsMaliciousDownloadChecker::Check(LPCSTR pszUrl)
00029 {
00030 char szTmpPath [MY_MAX_PATH];
00031 char szTmpFile [MY_MAX_PATH];
00032
00033 m_bNeedStop = false;
00034
00035 GetTempPath (sizeof (szTmpPath), szTmpPath);
00036 GetTempFileName (szTmpPath, "fdm", 0, szTmpFile);
00037
00038
00039 CString strUrl;
00040 strUrl.Format ("http://fdm.freedownloadmanager.org/fromfdm/url.php?url=%s", EncodeUrl (pszUrl));
00041
00042
00043 vmsSimpleFileDownloader dldr;
00044 m_dldr = &dldr;
00045 if (m_bNeedStop) {
00046 DeleteFile (szTmpFile);
00047 return IR_S_FALSE;
00048 }
00049 dldr.Download (strUrl, szTmpFile);
00050 while (dldr.IsRunning ())
00051 Sleep (50);
00052 m_dldr = NULL;
00053 if (dldr.GetLastError () != IR_SUCCESS) {
00054 DeleteFile (szTmpFile);
00055 return dldr.GetLastError ();
00056 }
00057 if (m_bNeedStop) {
00058 DeleteFile (szTmpFile);
00059 return IR_S_FALSE;
00060 }
00061
00062 HANDLE hFile = CreateFile (szTmpFile, GENERIC_READ, 0, NULL, OPEN_EXISTING,
00063 FILE_FLAG_DELETE_ON_CLOSE, NULL);
00064 ASSERT (hFile != INVALID_HANDLE_VALUE);
00065 if (hFile == INVALID_HANDLE_VALUE) {
00066 DeleteFile (szTmpFile);
00067 return IR_ERROR;
00068 }
00069
00070 char szBuf [1000];
00071 DWORD dwSize = 0;
00072 ReadFile (hFile, szBuf, sizeof (szBuf), &dwSize, NULL);
00073 CloseHandle (hFile);
00074
00075 if (dwSize == 0)
00076 {
00077 m_cOpinions = 0;
00078 m_cMalOpinions = 0;
00079 m_fRating = 0;
00080 m_strVirusCheckResult = "";
00081 }
00082 else
00083 {
00084 szBuf [dwSize] = 0;
00085
00086 char szVCR [10000];
00087 sscanf (szBuf, "%d %f %d %s", &m_cOpinions, &m_fRating, &m_cMalOpinions, szVCR);
00088 m_strVirusCheckResult = szVCR;
00089 }
00090
00091 return IR_SUCCESS;
00092 }
00093
00094 CString vmsMaliciousDownloadChecker::EncodeUrl(LPCSTR pszUrl)
00095 {
00096 CString str;
00097
00098 while (*pszUrl)
00099 {
00100 char c = *pszUrl++;
00101 if ((c >= 'a' && c <= 'z') ||
00102 (c >= 'A' && c <='Z') ||
00103 (c >= '0' && c <= '9'))
00104 {
00105 str += c;
00106 }
00107 else
00108 {
00109 char szHex [10];
00110 sprintf (szHex, "%%%x", (int)(BYTE)c);
00111 str += szHex;
00112 }
00113 }
00114
00115 return str;
00116 }
00117
00118 int vmsMaliciousDownloadChecker::get_OpinionTotalCount()
00119 {
00120 return m_cOpinions;
00121 }
00122
00123 int vmsMaliciousDownloadChecker::get_MaliciousOpinionCount()
00124 {
00125 return m_cMalOpinions;
00126 }
00127
00128 float vmsMaliciousDownloadChecker::get_AverageRating()
00129 {
00130 return m_fRating;
00131 }
00132
00133 LPCSTR vmsMaliciousDownloadChecker::get_VirusCheckResult()
00134 {
00135 return m_strVirusCheckResult;
00136 }
00137
00138 void vmsMaliciousDownloadChecker::Stop()
00139 {
00140 m_bNeedStop = true;
00141 if (m_dldr)
00142 m_dldr->Stop ();
00143 }