AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
Thema durchsuchen
Ansicht
Themen-Optionen

MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

Ein Thema von DGL-luke · begonnen am 8. Apr 2007 · letzter Beitrag vom 16. Apr 2007
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 8. Apr 2007, 21:46
Hallo,

wenn MoveFile mit dem Flag MOVEFILE_DELAY_UNTIL_REBOOT aufgerufen wird, werden die Dateien vorgemerkt und beim nächsten Systemstart verschoben/gelöscht.

Kann man sich in das Löschen irgendwie einklinken? Z.B. den Fortschritt anzeigen?
Lukas Erlacher
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 03:43
Moin!

Ich glaub mal net das das geht
Aber Du kannst Dein Programm in den RunOnce Schlüssel eintragen und das gewünschte selber löschen.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 05:25
Zitat von Sunlight7:
Ich glaub mal net das das geht
Korrekt, zumindest wenn man die Funktion des Session-Managers (SM) benutzt (MOVEFILE_DELAY_UNTIL_REBOOT tut das).

Siehe auch Schlüsselname: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\FileRenameOperations

Zitat von Sunlight7:
Aber Du kannst Dein Programm in den RunOnce Schlüssel eintragen und das gewünschte selber löschen.
Das würde ja am Ziel meilenweit vorbeigehen. Das Problem ist ja gerade, daß solche Löschungen stattfinden bevor Winlogon überhaupt startet. Damit hat man einen deutlichen Vorteil wenn es darum geht "benutzte" Dateien zu löschen. Ein gutes Beispiel sind bestimmte Spyware-DLLs welche gleichzeitig als Winlogon-Benachrichtigungspakete und BHOs laufen und sich gegenseitig beschützen. Wenn sowas clever implementiert ist, hat man keine Chance es zu löschen. Allerdings geht umbenennen üblicherweise (hilft aber auch nicht gegen clevere Implementationen).

Die Lösung wäre ein Programm zu schreiben welches bereits vom SM augerufen werden kann, sprich eines ohne Subsystem. Man nennt sowas auch native Programme. Kann nur davon abraten es in Delphi zu machen, aber prinzipiell ist auch das nicht vollkommen unmöglich. Mein DDKWizard ermöglicht es solche nativen Programme zu erstellen, dazu benötigt man ein DDK oder eben das WDK.

Achtung, wenn man außerhalb des Win32-Subsystems arbeitet, sind DLLs wie Kernel32, User32 usw. tabu. Außerdem gibt es nur einen einzigen Rootschlüssel in der Registry von dem aus alle anderen verzweigen, überhaupt ist die Registrystruktur ein wenig anders.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#4

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 06:06
Hallo Olli,

genau dass hab ich ja vor. DGL-Luke hat aber die Frage fuer mich gestellt gehabt.

Ich moechte eben wie das Spybot auch tut sofort nach dem Login von Windows bestimmte Dateien loeschen. Naemlich welche die von Spyware und Viren gesperrt sind in Windows.

Aber generell ist es doch mit MoveFileEx moeglich das ganze zu realisieren, nur eben kann ich mein Fenster nicht anzeigen lassen waehrend er Loescht sehe ich das richtig?

Aber wie macht es Spybot dann denn das ist auch in Delphi geschrieben!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 06:30
Zitat von Mackhack:
Ich moechte eben wie das Spybot auch tut sofort nach dem Login von Windows bestimmte Dateien loeschen. Naemlich welche die von Spyware und Viren gesperrt sind in Windows.
Das ist vermutlich über Userinit gelöst, siehe:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

Wenn du das nach dem Einloggen machst, hat es allerdings nichts mehr mit dem besagten Flag (MOVEFILE_DELAY_UNTIL_REBOOT) zu tun! Das umbenennen (MoveFileEx) ist allerdings auch etwas was bei "benutzten Dateien" funktioniert. Daher handelt es sich unter Umständen auch um eine wirksame Waffe. Kannst du auch testen. Starte ein Programm und lasse es laufen, dann benenne die Programmdatei um.

Zitat von Mackhack:
Aber generell ist es doch mit MoveFileEx moeglich das ganze zu realisieren, nur eben kann ich mein Fenster nicht anzeigen lassen waehrend er Loescht sehe ich das richtig?
Jupp. Gibt nur ein kleines Problemchen ... moderne Malware überwacht oft genau diesen Schlüssel und entfernt Änderungen welche du dort machst. Daher empfehle ich eher ein eigenes natives Programm zu schreiben welches eine ähnliche Funktionalität enthält wie sie MoveFileEx() anbietet.

Du kannst durchaus was anzeigen lassen von einem nativen Programm, nur eben beschränkt auf Text. Siehe bspw. bei geplanten Dateisystemchecks.

Zitat von Mackhack:
Aber wie macht es Spybot dann denn das ist auch in Delphi geschrieben!
Dazu weiß ich offiziell nichts, kann aber gern Patrick fragen, ob er hier mal antwortet. Bei der GUI ist es vermutlich nur die Anzeige des Fortschritts der "Planung" (für das Löschen), eben mit jedem Aufruf von MoveFileEx(), hat aber mit der eigentlichen Löschung nichts zu tun. Die findet beim nächsten Neustart statt bevor du den Willkommensbildschirm siehst (oder den Login-Dialog, je nachdem).
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#6

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 07:06
Hallo Olli,

das waere klasse wenn er sich mal hier darueber auslassen koennte.

Was den Bildschirm des eigentlichen Loeschvorgangs angeht in Spybot, so ist das ein Fenster das NACH dem logon erscheint und den Fortschritt des Scannens/Loeschens anzeigt.

Nicht das eigentliche Vorbereiten.
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 07:14
Zitat von Mackhack:
das waere klasse wenn er sich mal hier darueber auslassen koennte.
Werde ihm eine Mail schreiben.

Zitat von Mackhack:
Was den Bildschirm des eigentlichen Loeschvorgangs angeht in Spybot, so ist das ein Fenster das NACH dem logon erscheint und den Fortschritt des Scannens/Loeschens anzeigt.
Wie gesagt. Probier mal Userinit zu modifizieren (nach dem Komma den Pfad deines Programms rein). Wenn ich mich recht entsinne, startet damit dein Programm vor der eigentlichen Shell und ist damit exklusiver Besitzer aller Ressourcen bis es beendet wird.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#8

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 9. Apr 2007, 07:19
[quote="Olli"Wie gesagt. Probier mal Userinit zu modifizieren (nach dem Komma den Pfad deines Programms rein). Wenn ich mich recht entsinne, startet damit dein Programm vor der eigentlichen Shell und ist damit exklusiver Besitzer aller Ressourcen bis es beendet wird.[/quote]

Kannst du mal hier posten mit einer Dummy.exe wie das ganze aussehen soll? Ich weis noch nicht so recht wie du das meinst!

Und was meinst du mit Native Programme?
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 11. Apr 2007, 03:01
Habe ihm gemailt.

Native Programme sind solche die kein Subsystem haben - eben nativ laufen. Sie haben als einzige Abhängigkeit NTDLL.DLL und bestimmte Flags im PE-Header gesetzt. Wenn man Delphi benutzen will wird eine Nachbehandlung der EXE nötig und man muß auf die komplette RTL verzichten. Im Grunde ist das noch einen Zahn schärfer als nonVCL.

Du kannst beim UserInit-Wert hinter dem Komma einen Pfad zu deinem Programm angeben, soweit ich mich entsinne. Das ist eine Methode die manche Malware benutzt, aber offensichtlich auch Spybot, wenn dort ein Dialog nach dem Einloggen erscheint (hatte ich noch nicht). Einfach mal testen. Mache zB ein Programm welches nur eine MessageBox() anzeigt und füge den Pfad dorthin hinter dem Komma ein. Mit etwas Glück bekommst du eine MessageBox zu sehen bevor Explorer startet und vermutlich wird es nicht weitergehen bevor du OK oder was auch immer wählst damit die MessageBox weggeht.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#10

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken

  Alt 12. Apr 2007, 03:23
Hallo DPler,

ich komme hier einfach nicht weiter.

Der Code gibt mir immer ein Access is Denied aus. Ich habe 8 Files hier auf einer 2. Platte die aus einer alten Windows Installation her stammen die ich gerne loeschen wuerde mit dem Tool. Jedoch wird nichts in die Registry geschrieben damit Windows die Files loeschen koennte.

Delphi-Quellcode:
procedure TfoMain.BtnGoClick(Sender: TObject);
var
  Errors, I: Integer;
  FileName, S: String;
  PrevState: Boolean;
  Priv: DWORD;
begin
  MemInfo.Lines.Clear;
  MemInfo.Lines.Add('Now storing information for file deleting at next systemstart'#13#10);

  Errors := 0;

  PBarDeletion.Max := LvwFiles.Items.Count;
  for I := 0 to LvwFiles.Items.Count - 1 do
  begin
    PBarDeletion.Position := I + 1;
    FileName := LvwFiles.Items[I].Caption;
    if ( not MoveFileEx(PChar(FileName), Nil, MOVEFILE_DELAY_UNTIL_REBOOT) ) then
    begin
       MemInfo.Lines.Add(LvwFiles.Items[I].Caption + ': ' + SysErrorMessage(GetLastError));
       Inc(Errors, 1);
    end;
  end;

  S := #13#10'Finished';
  Case Errors of
     0: ;
     1: AppendStr(S, ', ' + IntTostr(Errors) + ' Error');
     else
       AppendStr(s, ', ' + IntTostr(Errors) + ' Errors');
  end;
  MemInfo.Lines.Add(S);

  Priv := EnablePrivilege('SeShutDownPrivilege', True, PrevState);
  if ( Priv <> 0 ) then
  begin
    ShowMessage('Du hast nicht die Rechte, den PC neu zu starten');
    Exit;
  end;

  if ( MessageDlg('Do you want to reboot your machine now?', mtConfirmation, [mbYes, mbNo], 0) = mrYes ) then
  begin
    if ( not ExitWindowsEx(EWX_REBOOT or EWX_FORCEIFHUNG, 0) ) then
    begin
      ShowMessage(SysErrorMessage(GetLastError));
    end
    else
    begin
      EnablePrivilege('SeShutDownPrivilege', PrevState, PrevState);
    end;
  end;
end;
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz