📄 scanner with clamwin.exe.c
字号:
/******************************************************************//* *//* Winpooch : Windows Watchdog *//* Copyright (C) 2004-2006 Benoit Blanchon *//* *//* This program is free software; you can redistribute it *//* and/or modify it under the terms of the GNU General Public *//* License as published by the Free Software Foundation; either *//* version 2 of the License, or (at your option) any later *//* version. *//* *//* This program is distributed in the hope that it will be *//* useful, but WITHOUT ANY WARRANTY; without even the implied *//* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR *//* PURPOSE. See the GNU General Public License for more *//* details. *//* *//* You should have received a copy of the GNU General Public *//* License along with this program; if not, write to the Free *//* Software Foundation, Inc., *//* 675 Mass Ave, Cambridge, MA 02139, USA. *//* *//******************************************************************//******************************************************************//* Build configuration *//******************************************************************///#define TRACE_LEVEL 2#define AUTO_DETECT_SCANNER 1/******************************************************************//* Includes *//******************************************************************/// module's interface#include "Scanner.h"// standard headers#include <shlwapi.h>#include <ctype.h>#include <stdio.h>#include <tchar.h>// library's headers#include <clamav.h>// project's headers#include "Config.h"#include "FreshClam.h"#include "Strlcpy.h"#include "SpyServer.h"#include "Trace.h"/******************************************************************//* Internal constants *//******************************************************************/// how many bytes in a megabyte ?#define MEGA (1<<20)// antivirus names (used for configuration)static LPCTSTR szNoneName = TEXT("None") ;static LPCTSTR szClamWinName = TEXT("ClamWin") ;static LPCTSTR szKavWsName = TEXT("KavWs") ;static LPCTSTR szBitDefName = TEXT("BitDefender") ;static LPCTSTR szLibClamavName = TEXT("Libclamav") ;// constants for ClamWinstatic LPCTSTR szClamWinKey = TEXT("Software\\ClamWin") ;static LPCTSTR szClamWinPathValue = TEXT("Path") ;// constants for Kav Wsstatic LPCTSTR szKavWsKey = TEXT("Software\\KasperskyLab\\InstalledProducts\\Kaspersky Anti-Virus for Workstation") ;static LPCTSTR szKavWsFolderValue = TEXT("Folder") ;static LPCTSTR szKavWsExe = TEXT("KAVShell.exe") ;// constants for BitDefenderstatic LPCTSTR szBitDefKey = TEXT("SOFTWARE\\Softwin") ;static LPCTSTR szBitDefFolderValue = TEXT("BitDefender Scan Server") ;static LPCTSTR szBitDefExe = TEXT("bdc.exe") ;/******************************************************************//* Internal data types *//******************************************************************/typedef struct { TCHAR szClamScanExe[MAX_PATH] ; TCHAR szClamWinExe[MAX_PATH] ;} CLAMWINCONF ;typedef struct { TCHAR szScanner[MAX_PATH] ;} KAVWSCONF ;typedef struct { TCHAR szScanner[MAX_PATH] ; TCHAR szFolder[MAX_PATH] ;} BITDEFCONF ;typedef struct { unsigned int options ; struct cl_limits limits ; struct cl_engine *engine ; TCHAR szScanner[MAX_PATH] ;} LIBCLAMAVCONF ;typedef struct { UINT nScanner ; CLAMWINCONF clamwinconf ; KAVWSCONF kavwsconf ; BITDEFCONF bitdefconf ; LIBCLAMAVCONF libclamavconf;} INTERNALDATA ;/******************************************************************//* Internal data *//******************************************************************/static INTERNALDATA g_data ;/******************************************************************//* Internal functions *//******************************************************************/BOOL _Scanner_ClamWin_Configure (CLAMWINCONF*) ;UINT _Scanner_ClamWin_ScanFile (CLAMWINCONF*, LPCTSTR, LPTSTR szOutput, UINT nOutputMax, DWORD nPriorityClass) ;BOOL _Scanner_KavWs_Configure (KAVWSCONF*) ;UINT _Scanner_KavWs_ScanFile (KAVWSCONF*, LPCTSTR, LPTSTR szOutput, UINT nOutputMax, DWORD nPriorityClass) ;BOOL _Scanner_BitDef_Configure (BITDEFCONF*) ;UINT _Scanner_BitDef_ScanFile (BITDEFCONF*, LPCTSTR, LPTSTR szOutput, UINT nOutputMax, DWORD nPriorityClass) ;BOOL _Scanner_LibClamav_Configure (LIBCLAMAVCONF*) ;UINT _Scanner_LibClamav_ScanFile (LIBCLAMAVCONF*, LPCTSTR, LPTSTR szOutput, UINT nOutputMax) ;BOOL _Scanner_LibClamav_LoadDatabase (LIBCLAMAVCONF*) ;VOID _Scanner_LibClamav_DatabaseUpdated () ;/******************************************************************//* Exported function : Init *//******************************************************************/BOOL Scanner_Init (){ LPCTSTR szConfigScanner ; BOOL bResult ; TRACE ; // // Which antivirus ? // // read configuration szConfigScanner = Config_GetString(CFGSTR_ANTIVIRUS) ; // -> NULL, autodetect if( ! szConfigScanner ) {#if AUTO_DETECT_SCANNER if( _Scanner_KavWs_Configure (&g_data.kavwsconf) ) g_data.nScanner = SCANNER_BITDEFENDER ; else if( _Scanner_ClamWin_Configure (&g_data.clamwinconf) ) g_data.nScanner = SCANNER_CLAMWIN ; else if( _Scanner_KavWs_Configure (&g_data.kavwsconf) ) g_data.nScanner = SCANNER_KASPERSKY_WS ; else if( _Scanner_LibClamav_Configure (&g_data.libclamavconf) ) g_data.nScanner = SCANNER_LIBCLAMAV ; else g_data.nScanner = SCANNER_NONE ; bResult = TRUE ;#else bResult = FALSE ;#endif } // -> ClamWin else if( !_tcsicmp(szClamWinName,szConfigScanner) ) { bResult = _Scanner_ClamWin_Configure (&g_data.clamwinconf) ; g_data.nScanner = SCANNER_CLAMWIN ; } // -> Kaspersky WS ? else if( !_tcsicmp(szKavWsName,szConfigScanner) ) { bResult = _Scanner_KavWs_Configure (&g_data.kavwsconf) ; g_data.nScanner = SCANNER_KASPERSKY_WS ; } // -> BitDefender ? else if( !_tcsicmp(szBitDefName,szConfigScanner) ) { bResult = _Scanner_BitDef_Configure (&g_data.bitdefconf) ; g_data.nScanner = SCANNER_BITDEFENDER ; } // -> Libclamav ? else if( !_tcsicmp(szLibClamavName,szConfigScanner) ) { bResult = _Scanner_LibClamav_Configure (&g_data.libclamavconf) ; g_data.nScanner = SCANNER_LIBCLAMAV ; } // -> None else if( !_tcsicmp(szNoneName,szConfigScanner) ) { g_data.nScanner = SCANNER_NONE ; bResult = TRUE ; } // -> Other else bResult = FALSE ; // if failed, then set to "none" if( ! bResult ) g_data.nScanner = SCANNER_NONE ; return bResult ;}/******************************************************************//* Exported function : Uninit *//******************************************************************/VOID Scanner_Uninit (){ TRACE ; // update config switch( g_data.nScanner ) { case SCANNER_CLAMWIN: Config_SetString (CFGSTR_ANTIVIRUS, szClamWinName) ; break ; case SCANNER_KASPERSKY_WS: Config_SetString (CFGSTR_ANTIVIRUS, szKavWsName) ; break ; case SCANNER_BITDEFENDER: Config_SetString (CFGSTR_ANTIVIRUS, szBitDefName) ; break ; case SCANNER_LIBCLAMAV: FreshClam_Stop () ; if( g_data.libclamavconf.engine ) cl_free (g_data.libclamavconf.engine); Config_SetString (CFGSTR_ANTIVIRUS, szLibClamavName) ; break ; default: Config_SetString (CFGSTR_ANTIVIRUS, szNoneName) ; }}/******************************************************************//* Exported function *//******************************************************************/BOOL Scanner_SetScanner (UINT nScanner){ BOOL bResult = FALSE ; TRACE ; switch( nScanner ) { case SCANNER_CLAMWIN: bResult = _Scanner_ClamWin_Configure (&g_data.clamwinconf) ; break ; case SCANNER_KASPERSKY_WS: bResult = _Scanner_KavWs_Configure (&g_data.kavwsconf) ; break ; case SCANNER_BITDEFENDER: bResult = _Scanner_BitDef_Configure (&g_data.bitdefconf) ; break ; case SCANNER_LIBCLAMAV: bResult = _Scanner_LibClamav_Configure (&g_data.libclamavconf) ; break ; case SCANNER_NONE: bResult = TRUE ; break ; } g_data.nScanner = bResult ? nScanner : SCANNER_NONE ; // tell the spy server that he should not scan this file SpySrv_SetScannerExePath (Scanner_GetScannerExe()) ; return bResult ;}/******************************************************************//* Exported function : IsConfigured *//******************************************************************/BOOL Scanner_IsConfigured (){ TRACE ; return g_data.nScanner!=SCANNER_NONE ;}/******************************************************************//* Exported function *//******************************************************************/UINT Scanner_GetScanner (){ TRACE ; return g_data.nScanner ;}/******************************************************************//* Exported function : IsScanner *//******************************************************************/BOOL Scanner_IsScanner (LPCTSTR szPath){ LPCTSTR szScanner = Scanner_GetScannerExe () ; return 0==_tcsicmp(szScanner,szPath) ;}/******************************************************************//* Exported function *//******************************************************************/LPCTSTR Scanner_GetScannerExe (){ LPCTSTR szScanner ; switch( g_data.nScanner ) { case SCANNER_CLAMWIN: szScanner = g_data.clamwinconf.szClamScanExe ; break ; case SCANNER_KASPERSKY_WS: szScanner = g_data.kavwsconf.szScanner ; break ; case SCANNER_BITDEFENDER: szScanner = g_data.bitdefconf.szScanner ; break ; case SCANNER_LIBCLAMAV: szScanner = g_data.libclamavconf.szScanner ; break ; default: return NULL ; } TRACE_INFO (TEXT("Scanner = %s\n"), szScanner) ; return szScanner ;}/******************************************************************//* Exported function : ScanFile *//******************************************************************/UINT Scanner_ScanFile (LPCTSTR szPath, LPTSTR szOutput, UINT nOutputMax){ TRACE_INFO ("File = %s\n", szPath) ; // avoid scanning the scanner if( Scanner_IsScanner(szPath) ) return FALSE ; switch( g_data.nScanner ) { case SCANNER_CLAMWIN: return _Scanner_ClamWin_ScanFile (&g_data.clamwinconf, szPath, szOutput, nOutputMax, HIGH_PRIORITY_CLASS) ; case SCANNER_KASPERSKY_WS: return _Scanner_KavWs_ScanFile (&g_data.kavwsconf, szPath, szOutput, nOutputMax, HIGH_PRIORITY_CLASS) ; case SCANNER_BITDEFENDER: return _Scanner_BitDef_ScanFile (&g_data.bitdefconf, szPath, szOutput, nOutputMax, HIGH_PRIORITY_CLASS) ; case SCANNER_LIBCLAMAV: return _Scanner_LibClamav_ScanFile (&g_data.libclamavconf, szPath, szOutput, nOutputMax) ; } return SCANNER_NONE ;}/******************************************************************//* Exported function *//******************************************************************/UINT Scanner_ScanFileBg (LPCTSTR szPath) { TRACE_INFO (TEXT("Path = %s\n"), szPath) ; // avoid scanning the scanner if( Scanner_IsScanner(szPath) ) return SCAN_NO_VIRUS ; switch( g_data.nScanner ) { case SCANNER_CLAMWIN: return _Scanner_ClamWin_ScanFile (&g_data.clamwinconf, szPath, NULL, 0, IDLE_PRIORITY_CLASS) ; case SCANNER_KASPERSKY_WS: return _Scanner_KavWs_ScanFile (&g_data.kavwsconf, szPath, NULL, 0, IDLE_PRIORITY_CLASS) ; case SCANNER_BITDEFENDER: return _Scanner_BitDef_ScanFile (&g_data.bitdefconf, szPath, NULL, 0, IDLE_PRIORITY_CLASS) ; case SCANNER_LIBCLAMAV: return _Scanner_LibClamav_ScanFile (&g_data.libclamavconf, szPath, NULL, 0) ; } return SCAN_FAILED ;}/******************************************************************//* Internal function *//******************************************************************/BOOL _Scanner_ClamWin_GetAppDir (LPTSTR szPath){ HKEY hkey ; LONG nResult ; DWORD dwType, dwSize ; UINT nLen ; TCHAR szValue[MAX_PATH] ; // open key on HKCU nResult = RegOpenKeyEx (HKEY_CURRENT_USER, szClamWinKey, 0, KEY_READ, &hkey) ; if( ERROR_SUCCESS!=nResult ) { TRACE_INFO (TEXT("Failed to open key HKCU\\%s (error=%d)\n"), szClamWinKey, nResult) ; // else try on HKLM nResult = RegOpenKeyEx (HKEY_LOCAL_MACHINE, szClamWinKey, 0, KEY_READ, &hkey) ; if( ERROR_SUCCESS!=nResult ) { TRACE_INFO (TEXT("Failed to open key HKLM\\%s (error=%d)\n"), szClamWinKey, nResult) ; return FALSE ; } } // read install path dwSize = sizeof(szValue) ; nResult = RegQueryValueEx (hkey, szClamWinPathValue, NULL, &dwType, (BYTE*)szValue, &dwSize); // ok ? if( ERROR_SUCCESS!=nResult || dwSize==0 ) { TRACE_ERROR (TEXT("Failed to read ClamWin path (error=%d)\n"),nResult) ; CloseHandle(hkey) ; return FALSE ; } // expand env strings nLen = ExpandEnvironmentStrings (szValue, szPath, MAX_PATH) ; if( ! nLen ) { TRACE_ERROR (TEXT("ExpandEnvironmentStrings failed (error=%d)\n"), GetLastError()) ; CloseHandle(hkey) ; return FALSE ; } CloseHandle(hkey) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -