Welcher Prozess, hat welche Datei geöffnet?

Folgende Situation: Es sei eine Datei gegeben, die von einem unbekannten Prozess geöffnet ist. Aufgabe ist es nun, denjenigen Prozess zu finden, welcher diese Datei geöffnet hat. Belebete Programme sind so genannte FileUnlocker, die das Handle auf eine gesperret Datei frei geben, so dass sie gelöscht werden kann, auch wenn sie von einem Prozess gesperrt ist.

Es gibt einige Programmierer, die der Meinung sind, dass man dies mit Code aus dem Usermode lösen könnte. Doch bei diesen gibt es einen kleinen Haken:

[..] weil die Abfrage des Namens eines Dateiobjektes (Dateien, Verzeichnisse, Pipes, MailSlots, ...) bei synchronisierten Objekten solange benötigt bis die aktuelle Operation abgeschlossen ist (und das kann ewig dauern). Da zum Beispiel der Service Control Manager (SCM) Pipes verwendet um mit Service-DLLs zu kommunizieren, gibt es eine Menge solcher Objekte. Zudem gibt es aus dem Benutzermodus keinen sicheren Weg um Dateien von Pipes und/oder MailSlots zu untercheiden. Der Treiber löst das erste Problem üblicherweise dadurch, dass er den IRP zur Abfrage des Objekts selbst erzeugt. Das zweite Problem kann ebenso im Treiber (mit Hilfe des IFS-Kits) gelöst werden (MailSlots oder Pipes sind an Flags erkennbar).
Zitat: Nico Bendlin

Fazit ist, dass man nicht um einen Treiber herumkommt, wenn man eine saubere Lösung haben will.

Siehe dazu auch mein FileUnlocker-Demo, welches versucht eine Dateiliste aus dem Usermode zu erstellen. Dies kann funktionieren, muss aber nicht.

2010-12-29T23:44:45 +0100, mail+homepage[at]michael-puff.de