nimdaDlg.cpp
上传用户:leon2013
上传日期:2007-01-10
资源大小:186k
文件大小:8k
源码类别:

杀毒

开发平台:

Visual C++

  1. // nimdaDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "nimda.h"
  5. #include "nimdaDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. CString GetText(CWnd& wnd)
  12. {
  13. CString s;
  14. wnd.GetWindowText(s);
  15. return s;
  16. }
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CAboutDlg dialog used for App About
  19. class CAboutDlg : public CDialog
  20. {
  21. public:
  22. CAboutDlg();
  23. // Dialog Data
  24. //{{AFX_DATA(CAboutDlg)
  25. enum { IDD = IDD_ABOUTBOX };
  26. //}}AFX_DATA
  27. // ClassWizard generated virtual function overrides
  28. //{{AFX_VIRTUAL(CAboutDlg)
  29. protected:
  30. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  31. //}}AFX_VIRTUAL
  32. // Implementation
  33. protected:
  34. //{{AFX_MSG(CAboutDlg)
  35. //}}AFX_MSG
  36. DECLARE_MESSAGE_MAP()
  37. };
  38. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  39. {
  40. //{{AFX_DATA_INIT(CAboutDlg)
  41. //}}AFX_DATA_INIT
  42. }
  43. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  44. {
  45. CDialog::DoDataExchange(pDX);
  46. //{{AFX_DATA_MAP(CAboutDlg)
  47. //}}AFX_DATA_MAP
  48. }
  49. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  50. //{{AFX_MSG_MAP(CAboutDlg)
  51. // No message handlers
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CNimdaDlg dialog
  56. CNimdaDlg::CNimdaDlg(CWnd* pParent /*=NULL*/, bool auto_scan /*=false*/)
  57. : CDialog(CNimdaDlg::IDD, pParent), m_autoscan(auto_scan)
  58. {
  59. //{{AFX_DATA_INIT(CNimdaDlg)
  60. //}}AFX_DATA_INIT
  61. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  62. }
  63. void CNimdaDlg::DoDataExchange(CDataExchange* pDX)
  64. {
  65. CDialog::DoDataExchange(pDX);
  66. //{{AFX_DATA_MAP(CNimdaDlg)
  67. DDX_Control(pDX, IDC_MBSCANNED, bytesscanned);
  68. DDX_Control(pDX, IDVIEWLOG, btnViewLog);
  69. DDX_Control(pDX, IDPAUSE, btnPause);
  70. DDX_Control(pDX, IDC_ROOT, root);
  71. DDX_Control(pDX, IDOK, btnOk);
  72. DDX_Control(pDX, IDC_OUTPUT, output);
  73. DDX_Control(pDX, IDC_SKIPPED, skipped);
  74. DDX_Control(pDX, IDC_SCANRATE, scanrate);
  75. DDX_Control(pDX, IDC_ERRORS, errors);
  76. DDX_Control(pDX, IDC_DELETED, deleted);
  77. DDX_Control(pDX, IDC_VELOCITY, velocity);
  78. DDX_Control(pDX, IDC_TIME, time);
  79. DDX_Control(pDX, IDC_SCANNED, scanned);
  80. DDX_Control(pDX, IDC_INFECTED, infected);
  81. DDX_Control(pDX, IDC_FILE, file);
  82. DDX_Control(pDX, IDC_DIRECTORIES, directories);
  83. DDX_Control(pDX, IDC_CLEANED, cleaned);
  84. //}}AFX_DATA_MAP
  85. }
  86. BEGIN_MESSAGE_MAP(CNimdaDlg, CDialog)
  87. //{{AFX_MSG_MAP(CNimdaDlg)
  88. ON_WM_SYSCOMMAND()
  89. ON_WM_PAINT()
  90. ON_WM_QUERYDRAGICON()
  91. ON_WM_TIMER()
  92. ON_BN_CLICKED(IDPAUSE, OnPause)
  93. ON_BN_CLICKED(IDVIEWLOG, OnViewlog)
  94. //}}AFX_MSG_MAP
  95. END_MESSAGE_MAP()
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CNimdaDlg message handlers
  98. BOOL CNimdaDlg::OnInitDialog()
  99. {
  100. CDialog::OnInitDialog();
  101. // Add "About..." menu item to system menu.
  102. // IDM_ABOUTBOX must be in the system command range.
  103. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  104. ASSERT(IDM_ABOUTBOX < 0xF000);
  105. CMenu* pSysMenu = GetSystemMenu(FALSE);
  106. if (pSysMenu != NULL)
  107. {
  108. CString strAboutMenu;
  109. strAboutMenu.LoadString(IDS_ABOUTBOX);
  110. if (!strAboutMenu.IsEmpty())
  111. {
  112. pSysMenu->AppendMenu(MF_SEPARATOR);
  113. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  114. }
  115. }
  116. SetIcon(m_hIcon, TRUE); // Set big icon
  117. SetIcon(m_hIcon, FALSE); // Set small icon
  118. /* setup columns in output list */
  119. output.InsertColumn(0,"File",LVCFMT_LEFT,150);
  120. output.InsertColumn(1,"Status",LVCFMT_LEFT,80);
  121. output.InsertColumn(2,"Path",LVCFMT_LEFT,240);
  122. /* initial defaults */
  123. root.SetWindowText("c:");
  124. /* set the statistics update timer */
  125. SetTimer(1,200,NULL);
  126. /* if set to auto-scan start the scan now */
  127. if (m_autoscan) OnOK();
  128. return TRUE;  // return TRUE  unless you set the focus to a control
  129. }
  130. void CNimdaDlg::OnInfected(LPCTSTR filename, VirusKiller::SCANRESULT result)
  131. {
  132. if ((result&~VIRUS_SCANNED)>0) {
  133. CString file(filename), path;
  134. /* find the path break */
  135. int brk;
  136. if ((brk=file.ReverseFind('\'))==-1) brk=0;
  137. /* extract path */
  138. if (brk) path=file.Left(brk);
  139. /* extract file */
  140. file=file.Mid(brk+1);
  141. /* build the action string */
  142. CString action;
  143. switch (result) {
  144. case VIRUS_SKIPPED: action="skipped"; break;
  145. case VIRUS_SCANNED: action="scanned"; break;
  146. case VIRUS_INFECTED: action="infected"; break;
  147. case VIRUS_CLEANED: action="cleaned"; break;
  148. case VIRUS_DELETED: action="deleted"; break;
  149. default:
  150. action="error"; break;
  151. }
  152. /* add item to output list control */
  153. int itemid=output.InsertItem(0,file);
  154. /* set fields */
  155. output.SetItemText(itemid,1,action);
  156. output.SetItemText(itemid,2,path);
  157. }
  158. }
  159. void CNimdaDlg::OnSysCommand(UINT nID, LPARAM lParam)
  160. {
  161. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  162. {
  163. CAboutDlg dlgAbout;
  164. dlgAbout.DoModal();
  165. }
  166. else
  167. {
  168. CDialog::OnSysCommand(nID, lParam);
  169. }
  170. }
  171. // If you add a minimize button to your dialog, you will need the code below
  172. //  to draw the icon.  For MFC applications using the document/view model,
  173. //  this is automatically done for you by the framework.
  174. void CNimdaDlg::OnPaint() 
  175. {
  176. if (IsIconic())
  177. {
  178. CPaintDC dc(this); // device context for painting
  179. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  180. // Center icon in client rectangle
  181. int cxIcon = GetSystemMetrics(SM_CXICON);
  182. int cyIcon = GetSystemMetrics(SM_CYICON);
  183. CRect rect;
  184. GetClientRect(&rect);
  185. int x = (rect.Width() - cxIcon + 1) / 2;
  186. int y = (rect.Height() - cyIcon + 1) / 2;
  187. // Draw the icon
  188. dc.DrawIcon(x, y, m_hIcon);
  189. }
  190. else
  191. {
  192. CDialog::OnPaint();
  193. }
  194. }
  195. HCURSOR CNimdaDlg::OnQueryDragIcon()
  196. {
  197. return (HCURSOR) m_hIcon;
  198. }
  199. void CNimdaDlg::OnTimer(UINT nIDEvent) 
  200. {
  201. if (nIDEvent==1)
  202. UpdateStatistics();
  203. else
  204. CDialog::OnTimer(nIDEvent);
  205. }
  206. void CNimdaDlg::UpdateStatistics() 
  207. {
  208. if (GetText(btnOk)!="Start") {
  209. CString s;
  210. /* scanned files */
  211. s.Format("%d ", Scanned());
  212. scanned.SetWindowText(s);
  213. /* directories */
  214. s.Format("%d ", Directories());
  215. directories.SetWindowText(s);
  216. /* errors */
  217. s.Format("%d ", Errors());
  218. errors.SetWindowText(s);
  219. /* skipped */
  220. s.Format("%d ", Skipped());
  221. skipped.SetWindowText(s);
  222. /* deleted */
  223. s.Format("%d ", Deleted());
  224. deleted.SetWindowText(s);
  225. /* scan rate */
  226. int seconds=Duration().GetTotalSeconds();
  227. if (seconds>3) {
  228. s.Format("%6.2f ", ((double)BytesScanned() / seconds) / 1048576 * 60 );
  229. scanrate.SetWindowText(s);
  230. }
  231. /* megabytes scanned rate */
  232. s.Format("%d MB ", BytesScanned() /1048576 );
  233. bytesscanned.SetWindowText(s);
  234. /* velocity */
  235. if (seconds>3) {
  236. s.Format("%8.1f ", Velocity());
  237. velocity.SetWindowText(s);
  238. }
  239. /* infected files */
  240. s.Format("%d ", Infected());
  241. infected.SetWindowText(s);
  242. /* cleaned files */
  243. s.Format("%d ", Cleaned());
  244. cleaned.SetWindowText(s);
  245. /* elapsed time */
  246. time.SetWindowText(Duration().Format("%H : %M : %S "));
  247. /* current file */
  248. file.SetWindowText(LastFileScanned());
  249. if (!Running())
  250. if (GetText(btnOk)=="Stop") OnOK();
  251. }
  252. }
  253. void CNimdaDlg::OnOK() 
  254. {
  255. if (GetText(btnOk)=="Close") {
  256. /* exit program */
  257. CDialog::OnOK();
  258. }
  259. else if (Scanned()>0) {
  260. /* stop the thread if it is started */
  261. if (Running()) Stop();
  262. /* hide pause button */
  263. btnPause.ShowWindow(SW_HIDE);
  264. /* show view log button */
  265. btnViewLog.ShowWindow(SW_SHOW);
  266. /* set main button to close */
  267. btnOk.SetWindowText("Close");
  268. /* if this was an autoscan we can close now */
  269. if (m_autoscan) CDialog::OnOK();
  270. }
  271. else {
  272. /* get the root directory */
  273. CString scan_root=GetText(root);
  274. /* set root directory of scan */
  275. Root(scan_root);
  276. /* start the scan */
  277. Start();
  278. /* change button text */
  279. btnOk.SetWindowText("Stop");
  280. btnPause.ShowWindow(SW_SHOW);
  281. }
  282. }
  283. void CNimdaDlg::OnPause() 
  284. {
  285. if (GetText(btnPause)=="Pause") {
  286. btnPause.SetWindowText("Resume");
  287. Pause();
  288. }
  289. else {
  290. btnPause.SetWindowText("Pause");
  291. Continue();
  292. }
  293. }
  294. void CNimdaDlg::OnViewlog() 
  295. {
  296. ShellExecute(NULL,"open","notepad","c:\anti-nimba.log",NULL,SW_SHOWNORMAL);
  297. }