void PathCrawler::listDir(std::string path, FileSet *infectedFiles, bool skip_decrypted) { if (infectedFiles == NULL) { printf("File set not initialized\n"); return; } const std::string fileName = path + "\\*.*"; WIN32_FIND_DATA foundFileData; HANDLE hFind = FindFirstFile(fileName.c_str(), &foundFileData); if (hFind == INVALID_HANDLE_VALUE) { return; } do { if (foundFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { if (strcmp(foundFileData.cFileName, ".") == 0) continue; if (strcmp(foundFileData.cFileName, "..") == 0) continue; std::string full_path = path + "\\"+ foundFileData.cFileName; listDir(full_path, infectedFiles, skip_decrypted); continue; } std::string full_path = path +"\\"+ foundFileData.cFileName; if (isExtensionAttacked(foundFileData.cFileName) == false) { continue; } if (isInfected(full_path) == false) { continue; } if (skip_decrypted && isDecrypted(full_path) == true) { printf("Already decrypted, skipping: %s\n", foundFileData.cFileName); continue; } char* ext_none = "<none>"; char* ext = strrchr(foundFileData.cFileName, '.'); if (ext == NULL) { ext = ext_none; } uint32_t infection_time = static_cast<uint32_t> (FileTime_to_POSIX(foundFileData.ftLastWriteTime)); infectedFiles->addFile(full_path, ext, infection_time); } while (FindNextFile(hFind, &foundFileData)); FindClose(hFind); }
int simulate(int duration){ /* temporary variables */ int i, j, infected, immune; /* sim for specified duration */ for(i = 0; i < duration; i++){ /* reset infection counter */ infected = 0; immune = 0; /* check for continuing infection status */ for(j = 0; j < g_population; j++){ if(g_status[j].infected){ /* increment days infected */ g_status[j].days++; /* check if contagious */ g_status[j].contagious = isContagious(g_status[j].days); /* check to see if infection is over */ if(isRecovered(g_status[j].days)){ g_status[j].infected = 0; g_status[j].immune = 1; } } } /* check for home infection */ for(j = 0; j < g_population; j+=3){ if(!g_status[j].infected){ if(g_status[j+1].infected || g_status[j+2].infected){ g_status[j].infected = isInfected(g_status[j].immune); } } if(!g_status[j+1].infected){ if(g_status[j].infected || g_status[j+2].infected){ g_status[j+1].infected = isInfected(g_status[j+1].immune); } } if(!g_status[j+2].infected){ if(g_status[j].infected || g_status[j+1].infected){ g_status[j+2].infected = isInfected(g_status[j+2].immune); } } } /* check for infection */ for(j = 0; j < g_population; j++){ if(g_status[j].infected){ infected++; } if(g_status[j].immune){ immune++; } } printf("Day %d: %d infected\t%d immune\n", i, infected, immune); } return 0; }