Zugriff auf bestimmte Datei sperren



  • Hallo.

    Ich brauche ein Programm, welches, solange es ausgeführt wird, den Zugriff auf eine Datei systemweit sperrt.

    Leider funktioniert eine andere spezielle Software nur, wenn der Zugriff auf diese Datei gesperrt ist.

    Da ich das nicht über die ACL machen möchte, da das System eigentlich nicht großartig verändert werden soll, wollte ich euch fragen, wie ich das am besten machen kann?

    Ich habe es bereits über

    CreateFile("FILE.DLL", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    

    versucht, aber das funktioniert eigenartigerweise nicht. 😞

    Hat jemand von euch eine gute Idee?

    Danke!

    mfg Barton

    (P.S.: Im Moment mache ich es über die Software Sandboxie... ist aber umständlich...)



  • Du kannst es mal über LockFile versuchen.


  • Mod

    Was funktioniert nicht mit dwSahreMode 0 kann kein weiterer Prozess die Datei öffnen, solange Du sie in Benutzung hast. D.h. ein CreateFile auf diese datei wird einen Lock-Fehler liefern.

    Was passiert denn?



  • Hallo.

    Danke für den Hinweis mit LockFile... werde das mal probieren. 🙂

    Es passiert "nichts". Also das Programm startet nicht wenn die DLL vorhanden/verfügbar ist. Und es startet nicht.

    Naja, ich hab erstmal eine andere Lösung gefunden: Eine leere Datei mit dem gleichen Namen in den Ordner der EXE gelegt und das Programm startet.

    Trotzdem vielleicht nicht die sauberste Lösung...

    P.S: Kann es daran liegen, dass es sich um Windows-Systemdateien handelt?
    Es geht um C:\Windows\System32\rsaenh.dll und C:\Windows\SysWOW64\rsaenh.dll. Vielleicht kann ich den Zugriff per CreateFile auf Windows-Systemdateien nicht sperren?


  • Mod

    Was heißt passiert nichts? Was liefert CreateFile?



  • C:\Windows\System32\rsaenh.dll - 0 - ERROR_SUCCESS
    C:\Windows\SysWOW64\rsaenh.dll - 32 - ERROR_SHARING_VIOLATION

    Ich kann mir schon vorstellen, dass irgendeine Anwendung darauf zugreift, ändert aber an dem Problem nichts...


  • Mod

    Ja und? Was willst Du?
    Die 32bit DLL wird nicht benutzt, die 64bit DLL ist bereits on Benutzung?

    Die Return-Codes sind entsprechend...



  • Barton schrieb:

    Also das Programm startet nicht wenn die DLL vorhanden/verfügbar ist.

    Das klingt danach, als wenn das Programm, was starten soll, nur startet wenn keine gültige Version vorhanden ist ..
    Wenn das so sein sollte, ist ein Filelock doch eh nicht das, was da 100%ig Abhilfe schafft .. Dann solltest du die Datei stattdessen lieber mit deinem Programm umbenennen solange dein Programm läuft, und beim Quit wieder die Datei ins Originale zurückbenennen ..



  • Hallo.

    Das würde ich gerne, bloß müsste ich dafür den Besitz übernehmen und danach hat sich Windows geweigert nochmal zu starten. (Nichtmal im abgesicherten Modus)

    Ich lege nun eine leere rsaenh.dll in das Verzeichnis der .EXE-Datei und auf einem PC lässt sich das Programm so überlisten. (Vista 64)
    Auf einem anderen PC (Windows 7 x64) leider nicht...



  • Verstehe ich das richtig: du hast eine DLL, die nur jeweils für einen Prozess verfügbar sein soll? D.h., es dürfen keine weiteren Instanzen dieser DLL im System von anderen Prozessen angelegt werden. Verabschiedet sich ein Prozess, darf ein anderer Prozess die DLL benutzen. Soweit richtig verstanden? 😕 Sofern es sich um eine eigene DLL handelt, kann man das bequem mit einem systemweiten Mutexobjekt handhaben. Bei fremden DLLs und fremden Prozessen weiss ich derzeit keinen Rat.

    Bitte mehr zum konkreten Ziel der Frage mitteilen!



  • Okay, ich erklär es jetzt nochmal so detailliert ich kann.

    Da ist eine Software, welche unter Windows XP funktioniert, aber auf Vista 64 und Win7 64 nicht.

    Damit diese Software auf Vista 64 und Win7 64 funktioniert, muss ich mittels des Programms Sandboxie der Anwendung den Zugriff auf die beiden Dateien

    C:\Windows\System32\rsaenh.dll und C:\Windows\SysWOW64\rsaenh.dll
    

    sperren.

    Sandboxie ist ein Programm mit dem man Programme in einer Sandbox laufen lassen kann und den Zugriff einschränken kann.

    So funktioniert diese Software auch unter Vista 64 sowie Win7 64.

    Da dies aber ein sehr umständlicher Weg ist, bin ich auf der Suche nach einer Lösung, wie ich den Zugriff auf eben diese beiden DLLs für diese Software blockieren kann.

    Den Vista 64 PC konnte ich soweit "austricksen", dass ich ein leeres Text-Dokument zu rsaenh.dll umbenenne und in das gleiche Verzeichnis der EXE-Datei lege. Leider funktioniert diese Lösung (eigenartigerweise) nicht unter Win7.

    Beste Lösung:

    1.) Selbstgeschriebene Launcher.exe starten.
    2.) Launcher.exe sperrz den Zugriff auf beide DLLs.
    3.) Anwendung wird aus dem Launcher heraus gestartet.
    4.) Wenn die Anwendung geschlossen wurde, DLLs wieder freigeben.
    5.) Launcher beenden.

    Die ganze Sache scheitert leider an Punkt 2, da zumindest eine dieser DLLs offenbar von Windows verwendet wird... (wie weiter oben bereits geschrieben)

    mfg


  • Mod

    So bekommst Du das nicht hin.
    Du kanst nicht systemweit die DLL blockieren. Schon gar nicht solche OS-DLs. Mich wundert nicht das durch solche Operaiotnen das OS abschmiert oder gar nicht mehr startet.

    Du müsstest Dich in den Prozess injezieren. Alle Einsprungpunkte der DLL ermitteln. Diese alle hooken und an dieser Stelle blockieren...

    Das ist IMHO der einizg Richtige Weg.
    Wenn igrnedwas im OS (z.B. Windows Update) besagte DLL benötigt, kannst Du es nicht abschmieren lassen...



  • Das Appliation Compatibility Toolkit hilft Dir nicht Deine Anwendung unter Vista/Win7 laufen zu lassen?



  • Inzwischen habe auch ich verstanden, wohin die Pferde laufen sollen. 🙂 Diese Pferde (OS-DLLs) sind aber Zugpferde im System. Unterbindet man einem dieser Zugpferde das Laufen, läuft möglicherweise nichts mehr. So jedenfalls geht es wohl nicht! 🤡 die Frage ist also eine Frage nach der Kompatibilität 32 --> 64 geworden und erfordert bei Problemen andere Vorgehensweisen.



  • @Martin Richter:

    Okay, das klingt ja schonmal nicht schlecht.

    Wenn ich jetzt noch wüsste wo und wie ich anfangen muss?
    Vielleicht kannst du mir ja einen Hinweis auf irgendeine brauchbare Internetseite geben.

    @Jochen Kalmbach:
    Nein, das hat leider auch nicht geholfen...

    Danke.


  • Mod

    Wenn Du schon nicht weißt wo Du anfangen sollst, hast Du Dich vermutlich in der Größe des Projektes verhoben.

    - PE-File Format...
    - Detours...
    - API Hooking

    http://www.codeproject.com/Articles/2082/API-hooking-revealed
    http://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours


Anmelden zum Antworten