Anti Virus

Status
Niet open voor verdere reacties.
Ehm O.o. bedankt voor je hulp ;), alleen heb ik nog 2 vraagjes. Ik heb nu onder de quickscan optie:
Code:
System.Threading.Thread.Sleep(15000)
        Dim pathy As String
        Dim i As Integer
        For i = 1 To 4
            Dim di As New DirectoryInfo(path(i))
            For Each File In System.IO.Directory.GetFiles(path(i), "*", SearchOption.AllDirectories)
                Dim fs As New FileInfo(File)
                Label4.Text = fs.FullName
Deze methode scan'd volgens mij alleen APPDATA en je desktop maar is er een manier om dat te wijzigen naar bijvoorbeeld de C:\ schijf helemaal?
en dan mijn 2e vraag ik wil als hij een virus vind dat hij dat verwijderd dus heb ik bij het virus-found form dit:
Code:
Try
            Kill(Form1.TextBox3.Text)
            MsgBox("Deleted")
            Me.Hide()
            Form1.Show()
        Catch ex As Exception
            MsgBox("Could not kill the program!")
            form3.show()
            Me.Hide()
        End Try
maar dat werkt niet dus heb ik bij de timer van het virus found form
Code:
If TextBox1.Text = "" Then
            TextBox1.Text = Form1.TextBox3.Text
        Else
            Timer1.Stop()
        End If
maar dan krijg je dus een textbox met dit:
------------------------------------------|
|
C:\Users\Jibbe\Desktop\eicar.exe |
------------------------------------------|
dus 1e regel niks en dan 2e pas de locatie dus probeerde ik:
Code:
 Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
        TextBox1.Text.Replace(" ", "")
    End Sub
maar dat werkte ook niet
 
Hoi,

Voor het eerste kan je een breakpoint gebruiken om te kijken wat er precies in path(i) staat. Als dat niet "C:\" is, dan zal je moeten kijken bij de plaats waar je de array path aanmaakt en dat dan aanpassen. Je krijgt dan volgens mij wel weer het probleem dat sommige mappen niet toegankelijk zijn.

Het tweede klinkt mij raar in de oren. De onderstaande regel zorgt er namelijk voor dat de inhoud van Fomr1.Textbox3 in Textbox1 komt te staan:
Code:
TextBox1.Text = Form1.TextBox3.Text
Het enige wat ik dan dus kan bedenken is dat in Form1.Textbox2 die lege lijn er ook al staat.

Om enters te verwijderen kan je het volgende gebruiken:
Code:
.Replace(vbNewLine, Nothing)

MartinJM
 
Hey dat replace werkte niet nog steeds een regel ;/
En kan je me een voorbeeld geven van C:\ bijvoorbeeld scannen? snap je niet echt namelijk :o
 
Hoi,

Voor de losse regel kan je ook de volgende proberen ipv vbNewLine:
Code:
vbLf
vbCr
vbCrLf
chr(13)
Misschien dat die werken...

In mijn voorbeeld zou je dit toevoegen:
[CPP] ''//Alle bestanden in de huidige map ophalen:
Dim CurrentFolderFiles() As String = Directory.GetFiles(CurrentFolder, "*", SearchOption.TopDirectoryOnly)
For i2 As Integer = 0 To CurrentFolderFiles.Count - 1 Step 1
''//Scannen van de bestanden
''//Zo heb je de fileinfo van het bestand
Dim fs As FileInfo = New FileInfo(CurrentFolderFiles(i2))

Next[/CPP]

Waardoor het resultaat dit is: (het bovenstaande begint op regel 79)
[CPP]Imports System.IO
Imports System.Threading

Public Class Form1

''//Delegate subs zijn voor het multithreaden
Delegate Sub DelListviewAddItem(ByVal Item As String)
Delegate Sub DelSetProgressbar(ByVal Max As Integer, ByVal Value As Integer)

''//Hier maak ik alvast de thread aan zodat die door de hele form te gebruiken is
Private Thr As Thread = Nothing
''//Hier maak ik een variable aan die bepaald of de thread zichzelf af moet sluiten
Private ThrAlive As Boolean = False

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
''//Hier check ik wat er in de button staat. Bij "start" moet de thread gestart worden, bij "stop" moet de thread gestopt worden
If Button1.Text = "Start" Then
''//De listview leeg maken, bij het opnieuw beginnen moet de listview eerst leeg, anders krijg je dubbele
ListView1.Items.Clear()
''//De thread opnieuw aanmaken
Thr = New Threading.Thread(AddressOf Thread)
''//De button tekst op "Stop" zetten
Button1.Text = "Stop"
''//ThrAlive op True zetten zodat de thread niet meteen afsluit
ThrAlive = True
''//De thread ook werkelijk starten
Thr.Start()
ElseIf Button1.Text = "Stop" Then
''//Kijken of de thread al gemaakt is
If Not Thr Is Nothing Then
''//Kijken of de thread bezig is (beide zijn tegen fouten)
If Thr.IsAlive Then
''//ThrAlive op False zetten zodat de thread afsluit
ThrAlive = False
''//De button tekst aanpassen zodat de thread opnieuw gestart kan worden
Button1.Text = "Start"
End If
End If
End If
End Sub

Private Sub Thread()
''//Alle drives in een variable zetten
Dim Drives() As DriveInfo = DriveInfo.GetDrives
''//Een list maken waar alle folders in komen te staan als de thread klaar is
Dim Folders As New List(Of String)
''//Loopen door alle drives
For i As Integer = 0 To Drives.Count - 1 Step 1
''//Kijken of de drive klaar is
If Drives(i).IsReady Then
''//Een lijst maken met mappen die nog gechecked moeten worden
Dim FoldersToCheck As New List(Of String)
''//Een lijst maken met de mappen die toegankelijk zouden moeten zijn
Dim CheckedFolders As New List(Of String)
''//Alle folders in de RootDirectory van de drive in de FoldersToCheck lijst zetten
FoldersToCheck.AddRange(Directory.GetDirectories(Drives(i).Name, "*", SearchOption.TopDirectoryOnly))
''//Een counter maken om te kijken bij welk nummer we zijn in de lijst FoldersToCheck
Dim Counter As Integer = 0
''//Een counter maken zodat de loop ophoudt als de hele lijst gechecked is
Dim Maximum As Integer = FoldersToCheck.Count

''//Loopen totdat de hele lijst gechecked is (een for loop, maar zo kan je meer aanpassen)
Do Until Counter >= Maximum
''//Een try-block om alle fouten af te vangen
Try
''//De nieuw te checken map in een variable zetten
Dim CurrentFolder As String = FoldersToCheck(Counter)
''//Alle submappen van de map in een variable zetten
Dim SubDirs() As String = Directory.GetDirectories(CurrentFolder, "*", SearchOption.TopDirectoryOnly)
''//Het maxima verhogen met het aantal mappen wat nu ook nog gechecked moet worden
Maximum += SubDirs.Count
''//Alle gevonden mappen toevoegen aan de lijst FoldersToCheck zodat die ook nog gechecked worden voor submappen
FoldersToCheck.AddRange(SubDirs)
''//De map die gecontroleerd is op submappen in de lijst zetten met gecontroleerde mappen
CheckedFolders.Add(CurrentFolder)
''//De gecontroleerde map gelijk toevoegen aan de listbox (kan niet zomaar vanwege de thread)
ListviewAddItem(CurrentFolder)

''//Alle bestanden in de huidige map ophalen:
Dim CurrentFolderFiles() As String = Directory.GetFiles(CurrentFolder, "*", SearchOption.TopDirectoryOnly)
For i2 As Integer = 0 To CurrentFolderFiles.Count - 1 Step 1
''//Scannen van de bestanden
''//Zo heb je de fileinfo van het bestand
Dim fs As FileInfo = New FileInfo(CurrentFolderFiles(i2))

Next

Catch ex As UnauthorizedAccessException
''//Alleen UnauthorizedAccessExceptions afvangen zodat andere errors apart behandeld kunnen worden
Catch ex As Exception
''//Bij het afsluiten van de thread kreeg ik een foutmelding, maar zo wordt alleen die eruit gefilterd (hij was niet belangrijk)
If Not Thr.IsAlive Then
''//De rest van de fouten weergeven
MsgBox("Error: " & vbNewLine & ex.Message)
End If
Finally
''//De counter moet altijd met 1 verhoogd worden, ook als er een fout is opgetreden, anders blijft hij in dezelfde map hangen
Counter += 1
''//De progressbar moet ook altijd bijgewerkt worden (kan niet zoals normaal vanwege de thread)
SetProgressbar(Maximum, Counter)
End Try

''//Als de variable ThrAlive False is dan moet de For-loop afgesloten worden zodat de thread verder wel netjes kan sluiten
If Not ThrAlive Then
''//Uit de for-loop springen
Exit For
End If
Loop

''//Alle gecheckte mappen in de lijst Folders zetten
Folders.AddRange(CheckedFolders)
End If
Next

''//In de variable Folders staan alle mappen.

''//De thread netjes afsluiten (de progressbar op 0 zetten en de button een andere tekst geven)
ThreadDone()
End Sub

Private Sub ListviewAddItem(ByVal Item As String)
''//Als er een invoke nodig is, dan invoken (heeft met threading te maken)
If InvokeRequired Then
''//invoken
Dim d As New DelListviewAddItem(AddressOf ListviewAddItem)
Me.Invoke(d, New Object() {Item})
Else
''//Het item aan de listview toevoegen
ListView1.Items.Add(Item)
End If
End Sub

Private Sub SetProgressbar(ByVal Max As Integer, ByVal Value As Integer)
''//Als er een invoke nodig is, dan invoken (heeft met threading te maken)
If InvokeRequired Then
''//Invoken
Dim d As New DelSetProgressbar(AddressOf SetProgressbar)
Me.Invoke(d, New Object() {Max, Value})
Else
''//Progressbar maximum zetten op het aantal gevonden mappen
ProgressBar1.Maximum = Max
''//Progressbar value zetten op het aantal gecheckte mappen
ProgressBar1.Value = Value
End If
End Sub

Private Sub ThreadDone()
''//Als er een invoke nodig is, dan invoken (heeft met threading te maken)
If InvokeRequired Then
''//Invoken (gaat hier makkelijker omdat er geen variablen zijn)
Me.Invoke(New MethodInvoker(AddressOf ThreadDone))
Else
''//Button tekst op "Stop" zetten
Button1.Text = "Start"
''//Progressbar op 0 zetten
ProgressBar1.Value = 0
End If
End Sub

Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
''//Dit sluit het programma gelijk af. Het stopt alles meteen. Het is eigenlijk netter om het anders te doen
End
End Sub
End Class
[/CPP]

MartinJM
 
Oke thanks werkt maar is er echt geen manier om met die oude code verder te gaan ;/?
 
Het probleem in de oude code zit 'm erin dat je niet 1 map kan overslaan. Je kan dus niet alleen de mappen overslaan waartoe je geen toegang hebt.

Tenzij je hier een oplossing voor vindt (ik ken er geen behalve de code die ik je heb gegeven), krijg je het niet werkend.

MartinJM

[edit]
Ik kan anders ook wel een dll proberen te maken die alle toegankelijke mappen opzoekt, maar die zal op dezelfde code gebaseerd zijn als die ik je heb gegeven. Dan kan je denk ik toch beter de code gebruiken en gelijk die mappen doorzoeken op virussen.
[/edit]
 
Laatst bewerkt:
Hallo ik heb degene gevraagd van wie ik de code heb gebruikt en hij antwoorde: This is because you can't access the $Recycle.Bin folder which is Windows folder where all the recycle bin files are kept. You can avoid this error using a Try Catch around the loop.
maarja dat snap ik dan weer niet ;s
 
Laatst bewerkt:
@JibbeDz Ik heb je nu al twee keer aangegeven (post 3 en 5) dat de aanhef "hey" niet wordt gewaardeerd op Helpmij desondanks blijf je er mee doorgaan. Laat me even weten of je van plan bent om hier wat aan te doen of niet?
 
Hoi,

Ik neem even als voorbeeld de code uit post 11.

[CPP]Private Sub full_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles full.DoWork
System.Threading.Thread.Sleep(15000)
Dim drname As String
For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
If drive.IsReady Then
drname = drive.Name
Try
For Each File1 In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)
Dim fs As New FileInfo(File1)
TextBox4.Text = mdsc(fs.FullName)
TextBox4.Text = shsc(fs.FullName)
Label4.Text = fs.FullName
Label5.Text += 1
If TextBox1.Text.Contains(TextBox4.Text) Then
Label10.Text = fs.FullName
End If
ProgressBar1.Value = Label5.Text
Next
Catch ex As Exception
Continue For
End Try
End If
Next
End Sub[/CPP]

Als er dan een map is waar je geen toegang tot hebt, komt er een error, waardoor hij in het Catch-blok terecht komt. De code die daarin staat ("Continue For"), zorgt er dan vervolgens voor dat hij doorgaat. Maar niet met het volgende bestand, maar met de volgende drive.

Het probleem zit 'm namelijk ook niet in het stuk binnen de 2e loop, maar in het begin van de 2e loop (deze lijn dus):
Code:
For Each File1 In System.IO.Directory.GetFiles(drname, "*", SearchOption.AllDirectories)

In die lijn kan je niet zomaar een map overslaan (voor zover ik weet). En dat is precies wat je nodig hebt, dat je alleen bepaalde mappen kan overslaan en de rest wel kan scannen.

Als je contact hebt met degene waarvan je de code hebt gebruikt, kan je misschien beter even naar een voorbeeld vragen om te kunnen kijken wat hij precies bedoeld.

MartinJM
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan