| { m_cScanResults.dwObjCount++; CFileObject cScanObj; cScanObj.m_eObjType = BO_PHY_FILE; cScanObj.m_strObjName = lpszPathName; if( !cScanObj.Open() ) { // TODO: show error here. return; } DWORD dwVID = m_pcVDB->Search(&cScanObj); if( dwVID ) { PSCAN_RECORD pScanRecord = new SCAN_RECORD; if(pScanRecord) { CFileObject* pScanObj = new CFileObject(cScanObj); pScanRecord->dwVirusID = dwVID; pScanRecord->eResult = BR_WITH_VIRUS; pScanRecord->pScanObject= pScanObj; pScanRecord->pNext = m_cScanResults.pScanRecords; m_cScanResults.pScanRecords = pScanRecord; m_cScanResults.dwRecCount++; } } cScanObj.Close(); } |
| DWORD CVirusDB::Search(CScanObject* pScanObj) { list<PVRECORD>::iterator iter = m_listVRecords.begin(); while(iter!=m_listVRecords.end()) { PVRECORD pVRec = *iter; ASSERT(pVRec); if(pVRec) { bool bVirus = true; for(unsigned int i=0; i<pVRec->dwSignCount; i++) { bVirus &= pScanObj->Compare (pVRec->pVSing[i]->dwOffset, pVRec->pVSing[i]->dwSize, pVRec->pVSing[i]->Signature); if(!bVirus) break; } // match all signatures if(bVirus) { return pVRec->dwVirusID; } } else { // error return 0xFFFFFFFF; } iter++; } // no match record in VirusDB return 0; } |