|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
-
-
-
-
-
- #include <windows.h>
- #include <stdexcept>
- #include <cmath>
- #include "../SNFMulti/snfmulti.hpp"
-
- using namespace std;
-
- const char* SNF_DLL_VERSION = "SNFMulti DLL Version 3.0 Build: " __DATE__ " " __TIME__;
-
- const int snf_ERROR_NO_HANDLE = -1;
- const int snf_ERROR_SCAN_FAILED = -2;
- const int snf_ERROR_EXCEPTION = -3;
-
- const double snf_ReputationMehResult = 0.0;
- const double snf_ReputationBadResult = 1.0;
- const double snf_ReputationGoodResult = -1.0;
-
-
-
-
- #define EXP __declspec(dllexport)
- extern "C" {
-
- BOOL WINAPI DllMain ( HINSTANCE hInst, DWORD wDataSeg, LPVOID lpvReserved );
-
- EXP int setThrottle(int Threads);
- EXP int startupSNF(char* Path);
- EXP int startupSNFAuthenticated(char* Path, char* Lic, char* Auth);
- EXP int shutdownSNF();
- EXP int testIP(unsigned long int IPToCheck);
- EXP double getIPReputation(unsigned long int IPToCheck);
- EXP int scanBuffer(unsigned char* Bfr, int Length, char* Name, int Setup);
- EXP int scanFile(char* FilePath, int Setup);
- EXP int getScanXHeaders(int ScanHandle, char** Bfr, int* Length);
- EXP int getScanXMLLog(int ScanHandle, char** Bfr, int* Length);
- EXP int getScanClassicLog(int ScanHandle, char** Bfr, int* Length);
- EXP int getScanResult(int ScanHandle);
- EXP int closeScan(int ScanHandle);
-
- }
-
-
-
-
-
-
-
-
- class ScannerInstance : public snf_EngineHandler {
- private:
- int Ordinal;
- int ScanResult;
-
- string ScanXHeaders;
- char* ScanXHeadersPtr;
- int ScanXHeadersLength;
-
- string ScanXMLLog;
- char* ScanXMLLogPtr;
- int ScanXMLLogLength;
-
- string ScanClassicLog;
- char* ScanClassicLogPtr;
- int ScanClassicLogLength;
-
- void clearBuffers();
-
- public:
- ScannerInstance(snf_RulebaseHandler* RBH, int N);
- ~ScannerInstance();
- int scanBuffer(unsigned char* Bfr, int Length, char* Name, int Setup);
- int scanFile(char* FilePath, int Setup);
- int getScanXHeaders(char** Bfr, int* Length);
- int getScanXMLLog(char** Bfr, int* Length);
- int getScanClassicLog(char** Bfr, int* Length);
- int getScanResult();
- };
-
- const int XHeaderReserve = 4096;
- const int XMLLogReserve = 4096;
- const int ClassicReserve = 4096;
-
- ScannerInstance::ScannerInstance(snf_RulebaseHandler* RBH, int N) :
- Ordinal(N),
- ScanResult(snf_ERROR_UNKNOWN),
- ScanXHeaders(0,XHeaderReserve),
- ScanXMLLog(0, XMLLogReserve),
- ScanClassicLog(0, ClassicReserve) {
- clearBuffers();
- open(RBH);
- }
-
- ScannerInstance::~ScannerInstance() {
- close();
- clearBuffers();
- Ordinal = -1;
- }
-
-
-
-
-
-
- int ScannerInstance::
- scanBuffer(unsigned char* Bfr, int Length, char* Name, int Setup) {
- try {
- clearBuffers();
- ScanResult = scanMessage(Bfr, Length, Name, Setup);
- }
- catch(snf_EngineHandler::FileError& e) {
- ScanResult = snf_ERROR_MSG_FILE;
- }
- catch(snf_EngineHandler::XHDRError& e) {
- ScanResult = snf_ERROR_MSG_FILE;
- }
- catch(snf_EngineHandler::BadMatrix& e) {
- ScanResult = snf_ERROR_BAD_MATRIX;
- }
- catch(snf_EngineHandler::MaxEvals& e) {
- ScanResult = snf_ERROR_MAX_EVALS;
- }
- catch(snf_EngineHandler::AllocationError& e) {
- ScanResult = snf_ERROR_ALLOCATION;
- }
- catch(...) {
- ScanResult = snf_ERROR_UNKNOWN;
- }
- return (Ordinal + 1);
- }
-
- int ScannerInstance::
- scanFile(char* FilePath, int Setup) {
- try {
- clearBuffers();
- ScanResult = scanMessageFile(FilePath, Setup);
- }
- catch(snf_EngineHandler::FileError& e) {
- ScanResult = snf_ERROR_MSG_FILE;
- }
- catch(snf_EngineHandler::XHDRError& e) {
- ScanResult = snf_ERROR_MSG_FILE;
- }
- catch(snf_EngineHandler::BadMatrix& e) {
- ScanResult = snf_ERROR_BAD_MATRIX;
- }
- catch(snf_EngineHandler::MaxEvals& e) {
- ScanResult = snf_ERROR_MAX_EVALS;
- }
- catch(snf_EngineHandler::AllocationError& e) {
- ScanResult = snf_ERROR_ALLOCATION;
- }
- catch(...) {
- ScanResult = snf_ERROR_UNKNOWN;
- }
- return (Ordinal + 1);
- }
-
- void ScannerInstance::clearBuffers() {
- ScanXHeaders.clear();
- ScanXHeadersPtr = 0;
- ScanXHeadersLength = 0;
-
- ScanXMLLog.clear();
- ScanXMLLogPtr = 0;
- ScanXMLLogLength = 0;
-
- ScanClassicLog.clear();
- ScanClassicLogPtr = 0;
- ScanClassicLogLength = 0;
-
- ScanResult = snf_ERROR_UNKNOWN;
- }
-
- int ScannerInstance::getScanXHeaders(char** Bfr, int* Length) {
- if(0 == ScanXHeadersPtr) {
- ScanXHeaders = getXHDRs();
- ScanXHeadersLength = ScanXHeaders.length();
- ScanXHeadersPtr = const_cast<char*>(ScanXHeaders.c_str());
- }
- *Bfr = ScanXHeadersPtr;
- *Length = ScanXHeadersLength;
- return ScanResult;
- }
-
- int ScannerInstance::getScanXMLLog(char** Bfr, int* Length) {
- if(0 == ScanXMLLogPtr) {
- ScanXMLLog = getXMLLog();
- ScanXMLLogPtr = const_cast<char*>(ScanXMLLog.c_str());
- ScanXMLLogLength = ScanXMLLog.length();
- }
- *Bfr = ScanXMLLogPtr;
- *Length = ScanXMLLogLength;
- return ScanResult;
- }
-
- int ScannerInstance::getScanClassicLog(char** Bfr, int* Length) {
- if(0 == ScanClassicLogPtr) {
- ScanClassicLog = getClassicLog();
- ScanClassicLogPtr = const_cast<char*>(ScanClassicLog.c_str());
- ScanClassicLogLength = ScanClassicLog.length();
- }
- *Bfr = ScanClassicLogPtr;
- *Length = ScanClassicLogLength;
- return ScanResult;
- }
-
- int ScannerInstance::getScanResult() {
- return ScanResult;
- }
-
-
-
-
- class snfScannerPool {
- private:
- Mutex myMutex;
- snf_RulebaseHandler* myRulebaseHandler;
- vector<ScannerInstance*> ScannerPool;
- ProductionQueue<ScannerInstance*> AvailableScanners;
- unsigned int ScanThreadLimit;
-
- public:
- snfScannerPool();
- ~snfScannerPool();
- void Throttle(int ThreadLimit);
- void startup(char* ConfigurationPath);
- void startupAuthenticated(char* Path, char* Lic, char* Auth);
- void shutdown();
- int testIP(unsigned long int IPToCheck);
- double getIPReputation(unsigned long int IPToCheck);
- ScannerInstance* grabScanner();
- ScannerInstance* getScanner(int ScanHandle);
- void dropScanner(ScannerInstance* S);
- };
-
- snfScannerPool Scanners;
-
- snfScannerPool::snfScannerPool() :
- myRulebaseHandler(0),
- ScanThreadLimit(0) {}
-
- snfScannerPool::~snfScannerPool() {
- shutdown();
- }
-
- void snfScannerPool::Throttle(int ThreadLimit) {
- ThreadLimit = (0 > ThreadLimit) ? 0 : ThreadLimit;
- ScanThreadLimit = ThreadLimit;
- }
-
- void snfScannerPool::startup(char* ConfigurationPath) {
- ScopeMutex StateIsInFlux(myMutex);
- if(myRulebaseHandler) return;
- myRulebaseHandler = new snf_RulebaseHandler();
- myRulebaseHandler->PlatformVersion(SNF_DLL_VERSION);
- myRulebaseHandler->open(ConfigurationPath, "", "");
- }
-
- void snfScannerPool::startupAuthenticated(char* Path, char* Lic, char* Auth) {
- ScopeMutex StateIsInFlux(myMutex);
- if(myRulebaseHandler) return;
- myRulebaseHandler = new snf_RulebaseHandler();
- myRulebaseHandler->PlatformVersion(SNF_DLL_VERSION);
- myRulebaseHandler->open(Path, Lic, Auth);
- }
-
- void snfScannerPool::shutdown() {
- ScopeMutex StateIsInFlux(myMutex);
- if(
- 0 == ScannerPool.size() &&
- 0 == AvailableScanners.size() &&
- 0 == myRulebaseHandler
- ) return;
-
- if(ScannerPool.size() != AvailableScanners.size()) throw false;
-
- for(
- vector<ScannerInstance*>::iterator iS = ScannerPool.begin();
- iS != ScannerPool.end();
- iS++) delete (*iS);
-
- ScannerPool.clear();
-
- while(0 < AvailableScanners.size()) AvailableScanners.take();
- if(myRulebaseHandler) {
- myRulebaseHandler->close();
- delete myRulebaseHandler;
- myRulebaseHandler = 0;
- }
- }
-
- int snfScannerPool::testIP(unsigned long int IPToCheck) {
- ScopeMutex StayAsYouAre(myMutex);
- if(0 == myRulebaseHandler) return snf_ERROR_NO_HANDLE;
- IPTestRecord Tester(IPToCheck);
- myRulebaseHandler->performIPTest(Tester);
- return Tester.R;
- }
-
- double snfScannerPool::getIPReputation(unsigned long int IPToCheck) {
- ScopeMutex StayAsYouAre(myMutex);
- if(0 == myRulebaseHandler) return snf_ERROR_NO_HANDLE;
- IPTestRecord Tester(IPToCheck);
- myRulebaseHandler->performIPTest(Tester);
-
-
-
- double Reputation = snf_ReputationMehResult;
- switch(Tester.G.Flag()) {
- case Good: Reputation = snf_ReputationGoodResult; break;
- case Bad: Reputation = snf_ReputationBadResult; break;
- case Ignore: Reputation = snf_ReputationMehResult; break;
- default: {
- Reputation =
- sqrt(fabs(Tester.G.Probability() * Tester.G.Confidence()));
- if(0 > Tester.G.Probability()) Reputation *= -1.0;
- }
- }
- return Reputation;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ScannerInstance* snfScannerPool::grabScanner() {
- ScopeMutex FreezeOurState(myMutex);
- if(0 == myRulebaseHandler) return 0;
- if(1 > AvailableScanners.size()) {
- if(
- 0 == ScanThreadLimit ||
- ScanThreadLimit > ScannerPool.size()
- ) {
- ScannerInstance* NewScanner =
- new ScannerInstance(myRulebaseHandler, ScannerPool.size());
- ScannerPool.push_back(NewScanner);
- AvailableScanners.give(NewScanner);
- }
- }
-
- return AvailableScanners.take();
- }
-
-
-
-
-
-
- ScannerInstance* snfScannerPool::getScanner(int ScanHandle) {
- ScannerInstance* S = 0;
- try { S = ScannerPool.at(ScanHandle - 1); }
- catch(...) { return 0; }
- return S;
- }
-
- void snfScannerPool::dropScanner(ScannerInstance* S) {
- if(
- 0 != S &&
- 0 != myRulebaseHandler
- ) AvailableScanners.give(S);
- }
-
-
-
-
-
- BOOL WINAPI DLLMain ( HINSTANCE hInst, DWORD wDataSeg, LPVOID lpvReserved ) {
- try {
- switch(wDataSeg) {
-
- case DLL_PROCESS_ATTACH:
- return true;
- break;
-
- case DLL_PROCESS_DETACH:
- Scanners.shutdown();
- break;
-
- default:
- return true;
- break;
-
- }
- }
- catch(...) {};
-
- return false;
- }
-
- EXP int setThrottle(int Threads) {
- try {
- Scanners.Throttle(Threads);
- }
- catch(...) { return snf_ERROR_EXCEPTION; }
- return Threads;
- }
-
- EXP int startupSNF(char* Path) {
- try {
- Scanners.startup(Path);
- }
- catch(snf_RulebaseHandler::AuthenticationError &e) {
- return snf_ERROR_RULE_AUTH;
- }
- catch(snf_RulebaseHandler::AllocationError& e) {
- return snf_ERROR_ALLOCATION;
- }
- catch(snf_RulebaseHandler::FileError& e) {
- return snf_ERROR_RULE_FILE;
- }
- catch(...) {
- return snf_ERROR_EXCEPTION;
- }
- return snf_SUCCESS;
- }
-
- EXP int startupSNFAuthenticated(char* Path, char* Lic, char* Auth) {
- try {
- Scanners.startupAuthenticated(Path, Lic, Auth);
- }
- catch(snf_RulebaseHandler::AuthenticationError &e) {
- return snf_ERROR_RULE_AUTH;
- }
- catch(snf_RulebaseHandler::AllocationError& e) {
- return snf_ERROR_ALLOCATION;
- }
- catch(snf_RulebaseHandler::FileError& e) {
- return snf_ERROR_RULE_FILE;
- }
- catch(...) {
- return snf_ERROR_EXCEPTION;
- }
- return snf_SUCCESS;
- }
-
- EXP int shutdownSNF() {
- try {
- Scanners.shutdown();
- }
- catch(snf_RulebaseHandler::AuthenticationError &e) {
- return snf_ERROR_RULE_AUTH;
- }
- catch(snf_RulebaseHandler::AllocationError& e) {
- return snf_ERROR_ALLOCATION;
- }
- catch(snf_RulebaseHandler::FileError& e) {
- return snf_ERROR_RULE_FILE;
- }
- catch(...) {
- return snf_ERROR_EXCEPTION;
- }
- return snf_SUCCESS;
- }
-
- EXP int testIP(unsigned long int IPToCheck) {
- int Result = snf_ERROR_EXCEPTION;
- try {
- Result = Scanners.testIP(IPToCheck);
- }
- catch(...) {}
- return Result;
- }
-
- EXP double getIPReputation(unsigned long int IPToCheck) {
- double Result = snf_ReputationMehResult;
- try {
- Result = Scanners.getIPReputation(IPToCheck);
- }
- catch(...) {}
- return Result;
- }
-
- EXP int scanBuffer(unsigned char* Bfr, int Length, char* Name, int Setup) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.grabScanner(); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
-
- int ScannerHandle = snf_ERROR_NO_HANDLE;
- try { ScannerHandle = myScanner->scanBuffer(Bfr, Length, Name, Setup); }
- catch(...) {
- Scanners.dropScanner(myScanner);
- return snf_ERROR_SCAN_FAILED;
- }
- return ScannerHandle;
- }
-
- EXP int scanFile(char* FilePath, int Setup) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.grabScanner(); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
-
- int ScannerHandle = snf_ERROR_NO_HANDLE;
- try { ScannerHandle = myScanner->scanFile(FilePath, Setup); }
- catch(...) {
- Scanners.dropScanner(myScanner);
- return snf_ERROR_SCAN_FAILED;
- }
- return ScannerHandle;
- }
-
- EXP int getScanXHeaders(int ScanHandle, char** Bfr, int* Length) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.getScanner(ScanHandle); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
- if(0 == myScanner) return snf_ERROR_NO_HANDLE;
- int Result = snf_ERROR_EXCEPTION;
- try {
- Result = myScanner->getScanXHeaders(Bfr, Length);
- }
- catch(...) {}
- return Result;
- }
-
- EXP int getScanXMLLog(int ScanHandle, char** Bfr, int* Length) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.getScanner(ScanHandle); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
- if(0 == myScanner) return snf_ERROR_NO_HANDLE;
- int Result = snf_ERROR_EXCEPTION;
- try {
- Result = myScanner->getScanXMLLog(Bfr, Length);
- }
- catch(...) {}
- return Result;
- }
-
- EXP int getScanClassicLog(int ScanHandle, char** Bfr, int* Length) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.getScanner(ScanHandle); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
- if(0 == myScanner) return snf_ERROR_NO_HANDLE;
- int Result = snf_ERROR_EXCEPTION;
- try {
- Result = myScanner->getScanClassicLog(Bfr, Length);
- }
- catch(...) {}
- return Result;
- }
-
- EXP int getScanResult(int ScanHandle) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.getScanner(ScanHandle); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
- if(0 == myScanner) return snf_ERROR_NO_HANDLE;
- return myScanner->getScanResult();
- }
-
- EXP int closeScan(int ScanHandle) {
- ScannerInstance* myScanner = 0;
- try { myScanner = Scanners.getScanner(ScanHandle); }
- catch(...) { return snf_ERROR_NO_HANDLE; }
- if(0 == myScanner) return snf_ERROR_NO_HANDLE;
- try { Scanners.dropScanner(myScanner); }
- catch(...) { return snf_ERROR_EXCEPTION; }
- return snf_SUCCESS;
- }
|