Hi,
ich habe n Problem an dem ich gerade verzweifle. Also ich will ein Programm machen, dass im Hintergrund läuft und immer wenn sich die Anzahl der Prozesse ändert soll er den Prozessnamen und den dazugehörigen Pfad mit der in der Ini vergleichen und wenn es nicht übereinstimmt den Prozess suspendieren und auf eine Antwort vom Benutzer warten.
Soweit bin ich bisher:
Spoiler anzeigen
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstants.au3>
#include <sound.au3>
;#NoTrayIcon
$Warnung = _SoundOpen("C:\Warnung.wav")
ProcessSetPriority("Prozess_Security.exe",4)
IniDelete("C:\Prozesse.ini","Temp")
$Ini = 'C:\Prozesse.ini'
Global $OK,$l,$Prozesse,$Prozess_Pfad,$a,$l1,$l2,$checken,$IniImmer,$IniTemp,$k
If Not FileExists($Ini) Then
IniWrite($Ini,"Immer","explorer.exe","C:\WINDOWS\Explorer.exe")
IniWrite($ini,"Status","AUTOEXEC",FileGetSize("C:\AUTOEXEC.bat"))
EndIf
$Prozesse = ProcessList()
$l = $Prozesse[0][0]
_Whileschleife()
Func _Whileschleife()
While 1
Global $Prozesse = ProcessList()
If $l = $Prozesse[0][0] Then
Sleep(50)
Else
Global $Prozesse = ProcessList()
$l = $Prozesse[0][0]
For $k = 2 To $Prozesse[0][0]
$Prozess_Pfad = _Path($Prozesse[$k][1])
If $Prozess_Pfad = 2 Then $Prozess_Pfad = "Nicht ermittelbar!"
If Not IniRead($Ini,"Immer",$Prozesse[$k][0],"") = $Prozess_Pfad Then
IniReadSection($Ini,"Temp")
If Not @error Then
If Not IniRead($Ini,"Temp",$Prozesse[$k][0],"") = $Prozess_Pfad Then
_ProcessStop($Prozesse[$k][0])
_Unbekannt($Prozesse[$k][0],$Prozess_Pfad)
EndIf
Else
_ProcessStop($Prozesse[$k][0])
_Unbekannt($Prozesse[$k][0],$Prozess_Pfad)
EndIf
EndIf
ToolTip($Prozesse[$k][0],0,0,$Prozess_Pfad & " " & $k & " " & $Prozesse[0][0])
Next
If IniRead($Ini,"Status","AUTOEXEC","") = FileGetSize("C:\AUTOEXEC.bat") Then
Sleep(1)
Else
$File = FileOpen("C:\AUTOEXEC.bat",0)
$Text = FileRead($File)
MsgBox(16,"Autoexec.bat wurde geändert!!!","Aktueller Inhalt:" & @CRLF & @CRLF & $Text)
EndIf
EndIf
WEnd
EndFunc
Func _ProcessStop($process)
$processid = ProcessExists($process)
If $processid Then
$ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
$i_sucess = DllCall("ntdll.dll","int","NtSuspendProcess","int",$ai_Handle[0])
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
If IsArray($i_sucess) Then
Return 1
Else
SetError(1)
Return 0
Endif
Else
SetError(2)
Return 0
Endif
EndFunc
Func _ProcessStart($process)
$processid = ProcessExists($process)
If $processid Then
$ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
$i_sucess = DllCall("ntdll.dll","int","NtResumeProcess","int",$ai_Handle[0])
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
If IsArray($i_sucess) Then
Return 1
Else
SetError(1)
Return 0
Endif
Else
SetError(2)
Return 0
Endif
EndFunc
Func _Unbekannt($Prozessname,$Pfad)
_SoundPlay($Warnung)
$Form1 = GUICreate("Unbekannten Prozess entdeckt!!! (Prozessname: " & $Prozessname & " | Prozesspfad: " & $Pfad, 1674, 41, -1, -1)
$Button1 = GUICtrlCreateButton("Für immer erlauben", 344, 0, 193, 41)
$Button2 = GUICtrlCreateButton("bis Neustart erlauben", 608, 0, 193, 41)
$Button3 = GUICtrlCreateButton("Programm beenden", 872, 0, 195, 41)
$Button4 = GUICtrlCreateButton("Programm beenden und Datei löschen", 1136, 0, 193, 41)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
If $msg = $Button1 Then
GUISetState(@SW_HIDE)
IniWrite($Ini,"Immer",$Prozessname,$Pfad)
_ProcessStart($Prozessname)
$l = 0
_Whileschleife()
EndIf
If $msg = $Button2 Then
GUISetState(@SW_HIDE)
IniWrite($Ini,"Temp",$Prozessname,$Pfad)
_ProcessStart($Prozessname)
$l = 0
_Whileschleife()
EndIf
If $msg = $Button3 Then
GUISetState(@SW_HIDE)
ProcessClose($Prozessname)
Sleep(500)
If ProcessExists($Prozessname) Then
MsgBox(16,$Prozessname,"Prozess konnte nicht beendet werden!")
$l = 0
_Whileschleife()
Else
GUISetState(@SW_HIDE)
MsgBox(64,$Prozessname,"Prozess beendet!")
$l = 0
_Whileschleife()
EndIf
EndIf
If $msg = $Button4 Then
GUISetState(@SW_HIDE)
ProcessClose($Prozessname)
Sleep(500)
If ProcessExists($Prozessname) Then
$Proz = "Prozess konnte nicht beendet werden!"
Else
$Proz = "Prozess beendet!"
EndIf
$del = FileDelete($Pfad)
If $del = 1 Then
$del = "Datei gelöscht!"
$Flag = 64
Else
$del = "Datei konnte nicht gelöscht werden!"
$Flag = 16
EndIf
MsgBox($Flag,$Prozessname,$Proz & @CRLF & $del)
$l = 0
_Whileschleife()
EndIf
Sleep(100)
WEnd
EndFunc
Func _Path($iPID)
Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', 0x0410, 'int', 0, 'int', $iPID)
If $aProc[0] = 0 Then Return 2
Local $vStruct = DllStructCreate('int[1024]')
DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameExW', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'wstr', '', 'int', 2048)
If $aReturn[0] = 0 Then Return 2
Return $aReturn[3]
EndFunc
Wenn sich die Prozessanzahl ändert, dann kontrolliert er die Prozesse, aberüberprüft nie bis zum Ende und bleibt vorher stehen Bitte um Hilfe
PS: Hatte auch noch irgendwie vor die gesamte Registrierung nach der Datei zu durchsuchen und wenn etwas gefunden wird, dann soll es in einer MsgBox angezeigt werden. Aber da bin ich überfragt wie ich das machen soll. Über Hilfe würde ich mich freuen