Entwickler-Ecke
Windows API - Herausfinden, ob ein Programm auf die Festplatte schreibt
F34r0fTh3D4rk - So 08.11.09 16:47
Titel: Herausfinden, ob ein Programm auf die Festplatte schreibt
Hallo,
Ich suche momentan nach einer Möglichkeit herauszufinden, ob ein fremder Prozess auf eine Festplatte oder einen anderen Datenträger schreibend zugreift. Ich denke mal, dass es auf Hooks hinauslaufen wird. Die Frage wäre dann, welche Funktionen wären hinreichend, um wirklich jeden Zugriff zu erfassen? Oder gibt es vielleicht sogar eine ganz einfache Methode?
Gruß
Delete - So 08.11.09 17:54
Keine Hooks, wohl eher ein Dateisystemtreiber. Und das geht mit Delphi nicht. Wozu willst du das wissen?
Delete - So 08.11.09 20:38
1. Windows Task Manager
2. Ansicht - Spalten auswählen
3. E/A...Schreiben auswählen
jaenicke - So 08.11.09 20:57
Wenn es um eine Möglichkeit dazu geht, dann gibt es den Process Monitor bei MS. Zudem ab Vista im Taskmanager unter Leistung den Ressourcenmonitor, der dies auch anzeigt.
Ich war aber davon ausgegangen, dass es im eigenen Programm überwacht werden soll.
Delete - So 08.11.09 21:20
hathor hat folgendes geschrieben : |
3. E/A...Schreiben auswählen |
Das können aber auch zum Beispiel Mailslots sein und nicht zwingend Zugriffe auf einen Datenträger.
F34r0fTh3D4rk - So 08.11.09 23:24
Ich möchte ein Programm schreiben, welches den PC herunter fährt, wenn ein bestimmter Prozess für eine gewisse Zeit nichts mehr auf die Festplatte/USB-Stick etc. geschrieben hat.
Momentan benutze ich
EASY SHUTDOWN, aber dort gibt es unter anderem nur die Möglichkeit, einen Countdown einzustellen oder herunterzufahren, wenn eine gewisse CPU-Last unterschritten wird und für meine Zwecke ist das nicht optimal, da ich selbst eine Abschätzung vornehmen muss und man nie weiß, ob es nicht doch zu Geschwindigkeitseinbrüchen kommt und das Ganze dann nichts wird.
Wenn der PC also mal länger zu laufen hat, weil etwas heruntergeladen wird, sich ein Programm updatet oder eines meiner Programme eine Berechnung mit Schreibzugriff durchführt, soll dieses erkennen, wann der Prozess vorbei ist, sodass ich mich nicht darum kümmern brauche.
Delete - Mo 09.11.09 09:03
Man könnte mit FindFirstChangeNotification aus der WINAPI alle relevanten Directories überwachen.
Bernhard Geyer - Mo 09.11.09 10:25
hathor hat folgendes geschrieben : |
Man könnte mit FindFirstChangeNotification aus der WINAPI alle relevanten Directories überwachen. |
wollte ich auch gerade vorschlagen. Das Funktioniert aber AFAIK nur bei NTFS-Dateisystem. Also bei FAT-laufwerken (was öfter bei USB-Sticks/Festplatten verwendet wird) geht das AFAIK nicht damit.
Bernhard Geyer - Mo 09.11.09 12:20
hathor hat folgendes geschrieben : |
Das ist filesystemunabhängig. |
Wieder was gelernt :-)
Boldar - Mo 09.11.09 16:01
Je nach zu Überwachendem Programm kann man auch threads überwachen, also dass der shutdown startet, wenn ein bestimmter Thread geschlossen wird. Ist dann aber nicht universal.
Delete - Mo 09.11.09 17:50
Noch 'ne Möglichkeit:
Mit einem Timer über die ATA commands
CHECKPOWERMODE1 = 0xe5 und/oder CHECKPOWERMODE2 = 0x98 den Status der HDD überwachen...
F34r0fTh3D4rk - Mo 09.11.09 17:58
Ich glaube das mit dem POWERMODE Check ist nicht wirklich zuverlässig, da ja auch andere Programme und das BS hin und wieder mal ne Kleinigkeit auf die Platte schreiben. Für
FINDFIRSTCHANGENOTIFICATION müsste ich afaik wissen, wo oder welche Datei geschrieben wird und ich glaube das herauszufinden würde auch nicht ganz leicht werden.
BenBE - Di 10.11.09 12:31
F34r0fTh3D4rk hat folgendes geschrieben : |
Ich glaube das mit dem POWERMODE Check ist nicht wirklich zuverlässig, da ja auch andere Programme und das BS hin und wieder mal ne Kleinigkeit auf die Platte schreiben. Für FINDFIRSTCHANGENOTIFICATION müsste ich afaik wissen, wo oder welche Datei geschrieben wird und ich glaube das herauszufinden würde auch nicht ganz leicht werden. |
Dafür gab's irgendwo hier glaube mal ne Unit, die die offenen Handles eines Prozesses aufgelistet hat. Brauch man aber nicht, weil FindFirstChangeNotification auch rekursiv überwachen kann. Du brauchst dann also nur für jedes Laufwerk eine Überwachung starten und dann das Ergebnis auswerten.
F34r0fTh3D4rk - Di 10.11.09 16:52
Dadurch kann ich mir praktisch für jedes Laufwerk auflisten lassen, welche Prozesse auf dieses schreiben? Dann könnte ich nach sehen, ob das überwachte Programm auf der Liste ist.
Der Vorteil ist natürlich, dass sich dadurch sehr viele Programme überwachen lassen. Der Nachteil ist, dass es doch sehr Rechenintensiv sein dürfte, gerade wenn man diesen Test öfters durchführt. Wobei das nicht einmal so schlimm sein dürfte, wenn man sich zu diesem Zeitpunkt ohnehin nicht am PC befindet.
Um allerdings herauszufinden, wie lange ein Programm schon nicht mehr auf die Festplatte geschrieben hat, eignet sich das wohl weniger. Es kann ja sein, dass man zufällig immer dann prüft, wenn das Programm gerade nicht schreibt.
Aber schlecht ist der Ansatz schon mal nicht und vor allem sicher nicht allzu schwer zu implementieren.
Delete - Di 10.11.09 18:58
Komponente DIRWATCH und Demo sind im Anhang.
Die Demo schreibt die Uhrzeit eines Ereignisses in ein Memofeld.
Getestet mit DELPHI 32 2007 (CodeGear™ Delphi® für Microsoft® Windows™ Version 11)
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!