Entwickler-Ecke
Freeware Projekte - FileUnlocker 0.0.4
SAiBOT - Sa 30.08.08 22:29
Titel: FileUnlocker 0.0.4
Was ist FileUnlocker
Mit diesem Programm kann man FileHandles aller Prozesse auflisten und schliessen.
Dies löst zB. das Problem "Datei kann nicht gelöscht werden, da sie von einer anderen Person oder einem anderen Programm benutzt wird", einfach Dateiname in den Filter eintragen und alle offenen Handles schliessen.
Informationen
-Keine Administrationsrechte nötig
-Arbeitet im Usermode (Ring3)
-Pur Delphi ;)
System Voraussetzungen
-2000/XP, Vista
Geplante Funktionen
-Übersicht aller Prozesse und deren geladenen DLL's und offenen Handles.
Screenshot
Yogu - Sa 30.08.08 23:12
Hört sich viel versprechend an, aber leider funktioniert es bei mir nicht richtig. Die Prozesse werden richtig erkannt, doch leider wird kein einziges Handle erfasst - obwohl ich ein paar Programme probiert habe, die die Datei garantiert nicht sofort wieder schließen.
Ich benutze Windows 2000 SP4, vielleicht ist da irgendetwas anders wie unter Vista.
Vielleicht findest du ja den Fehler, viel Glück. :)
SAiBOT - Sa 30.08.08 23:41
Yogu hat folgendes geschrieben: |
Hört sich viel versprechend an, aber leider funktioniert es bei mir nicht richtig. Die Prozesse werden richtig erkannt, doch leider wird kein einziges Handle erfasst - obwohl ich ein paar Programme probiert habe, die die Datei garantiert nicht sofort wieder schließen.
Ich benutze Windows 2000 SP4, vielleicht ist da irgendetwas anders wie unter Vista.
Vielleicht findest du ja den Fehler, viel Glück. :) |
Die Konstante OB_TYPE_FILE ist auf jeder OS-Version anders.
Auf XP hat sie den Wert 28, wobei sie auf Vista 25 hat.
Ich nehme an daran wird es liegen, werde mal sehen ob ich den Wert für Win2k finde.
Edit: Habe den Wert gefunden, sollte jetzt auch unter Win2000 laufen.
Update wurde hochgeladen :!:
MfG
Yogu - So 31.08.08 00:37
Hm...
wenn ich die neue Version starte, blinken einige Explorerfenster auf (z.B. Schnellstartleiste in der Taskleiste oder der Explorer selber), der Mauszeiger verwandelt sich für einige Sekunden in "Anwendung wird gestartet" (Maus mit Sanduhr), und danach ist Schluss. Der Prozess ist noch da, mit 4.292KB verbrauchtem Arbeitsspeicher, aber 0% CPU-Auslastung.
Es wird weder ein Fenster angezeigt, noch ist das Programm im Task-Manager unter "Anwendungen" zu finden. Auch nach einer Minute tut sich noch nichts.
Irgendetwas stimmt wohl noch nicht. :?
SAiBOT - So 31.08.08 01:03
Yogu hat folgendes geschrieben: |
Hm...
wenn ich die neue Version starte, blinken einige Explorerfenster auf (z.B. Schnellstartleiste in der Taskleiste oder der Explorer selber), der Mauszeiger verwandelt sich für einige Sekunden in "Anwendung wird gestartet" (Maus mit Sanduhr), und danach ist Schluss. Der Prozess ist noch da, mit 4.292KB verbrauchtem Arbeitsspeicher, aber 0% CPU-Auslastung.
Es wird weder ein Fenster angezeigt, noch ist das Programm im Task-Manager unter "Anwendungen" zu finden. Auch nach einer Minute tut sich noch nichts.
Irgendetwas stimmt wohl noch nicht. :? |
Denn habe ich spontan keine Ahnung :nixweiss: , ich habe zwei Systeme (XPSP2,Vista) und da gehts ohne Probleme :gruebel:, werde mal sehen was sich da machen lässt.
Delete - So 31.08.08 01:24
Sehr schön. Aus reiner Neugier würede mich der Sourcecode interessiren. Nicht, dass ich dein program nachbauen wollte. Ich will es einfach nur wissen, weil ich mir da schon selber mal den Kopf drüber zerbrochen habe. Mich würden konkret die Funktionen interessieren, mi der du die offenen Dateihandle ausliest und wie du sie schließt. Falls du es nicht Opensource machen willst, würde ich mich auch über eine PN mit den Funktionen freuen. Wie gesagt, reine Neugier, wie es geht.
delphi10 - So 31.08.08 01:42
Habe deinen FileUnlocker eben auf meiner W2KSP4-Maschine getestet. Soweit ich das bis jetzt sehe, läuft es einwandfrei.
cu delphi10
Delete - So 31.08.08 03:24
Mir ist gerade was aufgefallen. Eigentlich ist die ProzessID eine absolut nebensächliche Information. Wenn ich wissen will, welcher Prozess eine bestimmte Datei geöffnet hat, hilft mir die ProzesID sehr wenig. Der Prozessname wäre da wesentlich hilfreicher. So muss ich immer erst im Taskmanger gucken, welche ProzessID zu welchem Prozess gehört. Also zeig den Prozessnamen an und nicht dessen ID.
wirbeldelphi - So 31.08.08 15:51
Ich hab das gleiche Problem wie Yogu. Allerdings mit XP.
SAiBOT - So 31.08.08 23:16
Luckie hat folgendes geschrieben: |
Sehr schön. Aus reiner Neugier würede mich der Sourcecode interessiren. Nicht, dass ich dein program nachbauen wollte. Ich will es einfach nur wissen, weil ich mir da schon selber mal den Kopf drüber zerbrochen habe. Mich würden konkret die Funktionen interessieren, mi der du die offenen Dateihandle ausliest und wie du sie schließt. Falls du es nicht Opensource machen willst, würde ich mich auch über eine PN mit den Funktionen freuen. Wie gesagt, reine Neugier, wie es geht. |
fürs' listing:
NtQuerySystemInformation
NtQueryInformationFile
NtQueryObject
und für das schliessen:
CreateRemoteThread in verbindung mit
CloseHandle
Luckie hat folgendes geschrieben: |
Mir ist gerade was aufgefallen. Eigentlich ist die ProzessID eine absolut nebensächliche Information. Wenn ich wissen will, welcher Prozess eine bestimmte Datei geöffnet hat, hilft mir die ProzesID sehr wenig. Der Prozessname wäre da wesentlich hilfreicher. So muss ich immer erst im Taskmanger gucken, welche ProzessID zu welchem Prozess gehört. Also zeig den Prozessnamen an und nicht dessen ID. |
Ja habe ich mir auch schon gedacht, wurde geändert!
Update hochgeladen :!:
delphi10 hat folgendes geschrieben: |
Habe deinen FileUnlocker eben auf meiner W2KSP4-Maschine getestet. Soweit ich das bis jetzt sehe, läuft es einwandfrei.
cu delphi10 |
Denn ist es ja kein OS spezifisches Problem :zustimm:
@
Yogu&
wirbeldelphi:
Versucht es mit der 0.0.3er Version, wenns' jetzt nicht geht habe ich leider keine Ahnung woran es noch liegen könnte :?
wirbeldelphi - Mo 01.09.08 17:26
Ja, genau das gleiche. Der Prozeß lebt zwar noch, aber keine Gui, 0% Cpu Last - Ende.
Bindest du vllt irgendwelche DLLs mit ein und lieferst die nicht mit?
Übrigens: wenn man sich die Datei mit Restorator ansieht (
http://www.bome.com/Restorator/index.html), dann werden einige Ressourcen in der exe als korrupt angezeigt.
SAiBOT - Mo 01.09.08 17:30
wirbeldelphi hat folgendes geschrieben: |
Ja, genau das gleiche. Der Prozeß lebt zwar noch, aber keine Gui, 0% Cpu Last - Ende.
Bindest du vllt irgendwelche DLLs mit ein und lieferst die nicht mit?
Übrigens: wenn man sich die Datei mit Restorator ansieht (http://www.bome.com/Restorator/index.html), dann werden einige Ressourcen in der exe als korrupt angezeigt. |
Ist nur die Exe,
Das die Resourcen korrupt angezeigt werden liegt daran das die Exe gepackt ist!
wirbeldelphi - Mo 01.09.08 17:46
Kannst du nochmal ne ungepackte Version posten bitte? Damit klar ist, dass es nicht daran liegt.
PS: beim zwölften oder dreizehnten Start klappt es. Scheint irgendein Laufzeitproblem zu sein..?
delphi10 - Mo 01.09.08 19:15
Wie ich ja schon schrub: Unter W2kSP4 alles ok. Aber eine Bitte, könntest du im Handle-Name statt \device\Harddisk die Partition und die logische Drivebezeichnung einbauen? Zwei Funktion dazu, die dazu ganz nützlich sind (Autor unbekannt):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| Function TForm3.GetPartitionName(const ADrive: Char): String; var unused: Cardinal; buffer: array[0..19] of Char; x : Integer; begin Result:=''; if (GetDriveType(PChar(Format('%S:\',[ADrive]) ) ) >1) and (GetVolumeInformation(PChar(ADrive+':\'),@buffer[0], SizeOf(buffer),nil,unused,unused,nil,0)) then begin For x := 0 to High(buffer) do begin Buffer[x] := UpCase(buffer[x]); If Buffer[x] = 'ä' then Buffer[x] := 'Ä'; If Buffer[x] = 'ü' then Buffer[x] := 'Ü'; If Buffer[x] = 'ö' then Buffer[x] := 'Ö'; end; Result := Buffer; end else Result := 'Error'; end;
Function TForm3.GetLogicalDrivesStr(const NotAssigned: Boolean = FALSE): String; var DriveMap: DWORD; i,FirstDrive: Char; begin DriveMap := GetLogicalDrives; FirstDrive := 'A'; if (NotAssigned) then begin DriveMap := NOT DriveMap; FirstDrive := 'C'; end; Result := ''; for i := FirstDrive to 'Z' do if (DriveMap and (1 shl (Ord(i) -65))) <> 0 then Result := Result +i; end; |
cu delphi10
SAiBOT - Mo 01.09.08 20:41
wirbeldelphi hat folgendes geschrieben: |
Kannst du nochmal ne ungepackte Version posten bitte? Damit klar ist, dass es nicht daran liegt.
PS: beim zwölften oder dreizehnten Start klappt es. Scheint irgendein Laufzeitproblem zu sein..? |
0.0.4 ist ungepackt.
delphi10 hat folgendes geschrieben: |
Wie ich ja schon schrub: Unter W2kSP4 alles ok. Aber eine Bitte, könntest du im Handle-Name statt \device\Harddisk die Partition und die logische Drivebezeichnung einbauen?
cu delphi10 |
wurde geändert.
Update wurde hochgeladen :!:
wirbeldelphi - Mo 01.09.08 21:01
0.0.4 startet nun problemlos und jedes mal.
Aber listet im Gegensatz zu 0.0.3 keinerlei geöffnete Dateien auf. (geht das überhaupt bei nem Windows..?)
Processcount = 46
Handlecount = 0
Auch Refresh listet nichts.
Was das packen der Datei betrifft: UPX ist ein freier Exepacker der wirklich problemlos geht:
http://upxshell.sourceforge.net/
Dein tool wäre damit ~200kB klein.
delphi10 - Di 02.09.08 00:12
Habe ich gerade eben laufenlassen. Also, da ist noch nicht alles richtig. Er zeigt mir nur teilweise die Laufwerksbezeichner an und die sind leider falsch. Es wird z. Bspl. "F:\name..." ausgegeben, das ist aber bei mir ein zur Zeit leeres DVD-Laufwerk.
Kannst ja bei Gelegenheit noch mal eine Analyse machen. Danke.
cu delphi10
Edit 2.9.08: O.g. Fehler treten nur unter W2K auf. Unter XPSP2 werden die Laufwerksbezeichner richtig angezeigt. Gerade eben getestet.
Delete - Di 02.09.08 09:16
Ich habe das Programm jetzt zweimal gestartet und jedes mal erschien nur der Prozess im Taskmanager aber kein Programmfenster. System ist Windows XP SP2.
gehstock - Di 02.09.08 11:38
WS2003 ebenfalls keine Auflistung der Prozesse
jasocul - Di 02.09.08 11:51
Gleiches Phänomen, wie bei Luckie.
System: XP Pro SP3
Regan - Di 02.09.08 14:27
Also bei mir geht es: Win XP Home SP3.
SAiBOT - Di 02.09.08 15:27
Luckie hat folgendes geschrieben: |
Ich habe das Programm jetzt zweimal gestartet und jedes mal erschien nur der Prozess im Taskmanager aber kein Programmfenster. System ist Windows XP SP2. |
Ich habe das selbe OS, bei mir läufts..... mhhhh, könnte es sein das es vll doch Admin-Rechte benötigt?
Ansonsten habe ich keine Ahnung :nixweiss:
delphi10 hat folgendes geschrieben: |
Habe ich gerade eben laufenlassen. Also, da ist noch nicht alles richtig. Er zeigt mir nur teilweise die Laufwerksbezeichner an und die sind leider falsch. Es wird z. Bspl. "F:\name..." ausgegeben, das ist aber bei mir ein zur Zeit leeres DVD-Laufwerk.
Kannst ja bei Gelegenheit noch mal eine Analyse machen. Danke.
cu delphi10
Edit 2.9.08: O.g. Fehler treten nur unter W2K auf. Unter XPSP2 werden die Laufwerksbezeichner richtig angezeigt. Gerade eben getestet. |
Das ist mein Code, habe sonst keine Idee wie man "\Device\HarddiskVolume1\" in den passenden Laufwerksbuchstaben umwandeln könnte...
Die Funktion geht davon aus das 1=C ist und 2=D usw...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function TForm1.ConvertDrive(s:String):String; const ABC= 'CDEFGHIJKLMNOPQRSTUVWXYZ'; var s2:String; bc: Integer; o: Integer; begin Result := s; s2 := StringReplace(s, '\Device\HarddiskVolume', '', [rfReplaceAll]); bc := pos('\', s2)-1; if bc <= 0 then Exit; try o := StrToInt(Copy(s2, 1, bc)); except Exit; end; Delete(s2, 1, bc); if (o>0) and (o<=Length(ABC)) then Result := ABC[o]+':'+s2 ; end; |
MfG
delphi10 - Di 02.09.08 17:50
SAiBOT hat folgendes geschrieben: |
Die Funktion geht davon aus das 1=C ist und 2=D usw...
|
Sollte es nicht mit A beginnen?
1=A 2=B 3=C 4=D. Dieser Versatz könnte die Fehlanzeige bei mir erklären.
Probiers doch mal mit meiner Funktion .GetLogicalDrivesStr(const NotAssigned: Boolean = FALSE): String;
cu delphi10
wirbeldelphi - Di 02.09.08 19:16
Noch ne Info: wenn ich die exe als Administrator laufen lasse (Rechtsklick - Ausführen als) bekomme ich statt Null wenigstens zwei Filehandles angezeigt, allerdings nur die vom Prozeß FileUnlocker selbst...
Delete - Di 02.09.08 21:22
Zu Hause geht es wunderbar, obwohl gleiches System. Natürlich ist andere Software installiert und andre Hardware. Eventuell kommt im Büro irgendein Treiber oder sont was in die Quere. Ich werde es morgen noch mal probieren.
Und danke für die PN. An den zitierten Beitrag kann ich mich gar nicht erinnern. Allerdings ging es nicht um "Steine in den Weg legen", sondern es war meine meinung zu solchen Programmen, wenn sie rücksichtslos eingesetzt werden.
Yogu - Mi 03.09.08 12:32
Version: 0.0.3
Betriebssystem: Windows 2000 SP4
Problem: Keine GUI
Keine Ahnung, was da nicht läuft. Auf jeden Fall sehe ich kein Fenster, rein gar nichts. Der Prozess bleibt vorhanden. Vielleicht solltest du eine Logdatei hinzufügen, die Startvorgänge loggt.
Delete - Mi 03.09.08 13:12
Ich habs gefunden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| function GetFileNameByHandle(FileHandle: THandle): string; var FileNameInfo : TFileNameInformation; ObjectNameInfo : TObjectNameInformation; IoStatusBlock : TIOStatusBlock; res, dwReturn : DWORD; begin result := ''; Writeln(FileHandle); res := NtQueryInformationFile(FileHandle, @IoStatusBlock, @FileNameInfo, SizeOf(FileNameInfo.FileName), FileNameInformation); if res = STATUS_SUCCESS then begin res := NtQueryObject(FileHandle, ObjectNameInformation, @ObjectNameInfo, SizeOf(ObjectNameInfo.Name.Buffer), @dwReturn); if res = STATUS_SUCCESS then begin SetLength(result, MAX_PATH); SetLength(result, WideCharToMultiByte(CP_ACP, 0, @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength - ObjectNameInfo.Name.Length], ObjectNameInfo.Name.Length div SizeOf(WideChar), @result[1], MAX_PATH, nil, nil)); end else begin SetLength(result, MAX_PATH); SetLength(result, WideCharToMultiByte(CP_ACP, 0, @FileNameInfo.FileName[0], FileNameInfo.FileNameLength div SizeOf(WideChar), @result[1], MAX_PATH, nil, nil)); end; end; end; |
Das ist der schuldige Code. Wenn ich den Aufruf dieser Funktion auskommentieren läuft er durch, ansonsten bleibt er "hängen". Erklärung von Nico:
"im Prinzip wartet die Anfrage im Kernel bis das Objekt reagiert - was bei asynchronen Pipes unendlich lange dauern kann"
Der Code wartet sich also an dieser Stelle zu Tode.
Lösung von Nico:
"Die sauberste Lösung ist ein Treiber, der selbst ein IRP zusamelstellt und an das Objekt schickt"
SAiBOT - Do 04.09.08 17:33
Ja ich bin dabei mir das nötige Hintergrundwissen beizubringen um dies mit einem Treiber zu ermöglichen.
Für die Leute die sich für dieses Thema interessieren:
Ich habe Sourcecode gefunden, in dem mit einer Delphi-Anwendung und einem C-Treiber ALLE Handles angezeigt werden (Nicht nur Filehandles).
Diese arbeitet im Ring0 (Kernelmode) und listet sogar die Systemprozesse.
(Source im Anhang; ich glaube es stammt von
http://www.rootkit.com )
Ich werde dieses Projekt erstmal auf Eis legen, bis ich die elegantere Methode über den Treiber gehen kann.
MfG :wave:
Delete - Do 04.09.08 17:46
Jupp, ein Treiber ist die einzige saubere Möglichkeit. Allerdings wohl auch nicht so ganz einfach. Man benötigt eben das DDK mit den Headern und den Compiler.
Eventuell wäre es im ersten Schritt einfachher einen bestehenden Treiber zu nutzen. Man müsste eben nur rausfinden, wie man mit einem Treiber kommuniziert. Im nächsten Schritt könnte man dann überlegen selber einen zu programmieren.
@SAiBOT: Hast du dir meine Änderungen mal angeguckt?
SAiBOT - Do 04.09.08 17:50
Luckie hat folgendes geschrieben: |
Jupp, ein Treiber ist die einzige saubere Möglichkeit. Allerdings wohl auch nicht so ganz einfach. Man benötigt eben das DDK mit den Headern und den Compiler.
Eventuell wäre es im ersten Schritt einfachher einen bestehenden Treiber zu nutzen. Man müsste eben nur rausfinden, wie man mit einem Treiber kommuniziert. Im nächsten Schritt könnte man dann überlegen selber einen zu programmieren.
@SAiBOT: Hast du dir meine Änderungen mal angeguckt? |
Bin gerade am durchgucken, der Callback ist eine sehr gute Idee :idea:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!