| Autor |
Beitrag |
Regan
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Di 02.09.08 13:27
Also bei mir geht es: Win XP Home SP3.
|
|
SAiBOT 
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Di 02.09.08 14: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
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
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Di 02.09.08 16: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
_________________ Salus populi suprema lex esto
|
|
wirbeldelphi
      
Beiträge: 29
|
Verfasst: Di 02.09.08 18: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...
_________________ Ich bin keine Signatur - ich putz hier nur.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 02.09.08 20: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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 03.09.08 11: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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 03.09.08 12:12
Ich habs gefunden.
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 
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Do 04.09.08 16: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 www.rootkit.com )
Ich werde dieses Projekt erstmal auf Eis legen, bis ich die elegantere Methode über den Treiber gehen kann.
MfG 
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
Zuletzt bearbeitet von SAiBOT am Sa 13.09.08 13:36, insgesamt 1-mal bearbeitet
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 04.09.08 16: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 
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Do 04.09.08 16: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 
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
|
|
|