Problem mit Fehlerauswertungen?

  • Ich glaube, das hier ist evtl. das gleiche Problem...
    Wenn ich ab Vista eine EXE im Ordner Program Files (Rechte und Umleitung des Ordners beachten) öffne (kein Manifest), erzeugt folgender Quelltext


    bei mir folgenden Fehler:
    [Blockierte Grafik: http://s4.postimage.org/u0rBJ.jpg]

    Wie kommt das?
    OpenRW schlägt hier fehl, da zum Öffnen (Read / Write) einer EXE im Ordner Program Files Adminrechte erforderlich sind - die hat das Programm aber nicht.
    Normalerweise würde hier in VirtualStore umgeleitet werden - bei bestimmten Dateiendungen findet aber eine solche Umleitung nicht statt (unter anderem EXE und DLL Dateien). Profan merkt sich hier, das OpenRW fehlgeschlagen ist (Errorcode 5 = Zugriff verweigert). BlockRead würde hier problemlos funktionieren, aufgrund des vorangegangenen Fehlers schlägt der Befehl hier aber fehl. Muss das sein?

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress, WoltLab & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

    Wenn du Fragen hast, kannst du dich gerne jederzeit an @Maximilian Rupp wenden

    Hinweis:

  • roland:
    Das Problem ist schon sehr alt. Blätter mal einige Jahre in deinem Forum zurück, da hast du damals dazu angeraten, vor jeder Dateiaktion %IORESULT auszulesen und damit auf 0 zu setzen.
    Ich persönlich denke, dass man Fehler dort auswerten sollte, wo sie passieren und nicht einen Fehlercode mitschleppen und dann auf die Sachen anwenden sollte, bei denen gar kein Fehler passiert...

  • @AHT: Hier handelt sich um das ganz normale Verhalten von Pascal-Dateioperationen. Wenn man sich an meinen Rat hält, kann man damit gut umgehen. Gerade nach einem Öffnen einer Datei sollte man immer überprüfen, ob es geklappt hat.

    Aber in diesem speziellen Fall spricht natürlich nichts dagegen, dass ich in der BlockRead-Funktion %IOResult sicherheitshalber selbst zurücksetze. In XProfan 12 wird es so sein.

    Gruß
    Roland

    AMD Ryzen 5 5600U with Radeon Graphics 2,3 GHz / 32 GB RAM / 500 + 2000 GB SSD / Windows 11 - XProfan X4a

    Als Backup: MD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4

    http://www.xprofan.de

  • Das ganze ist eine böse Falle. Im Prinzip müsste man dann ja wirklich vor jeder Dateioperation

    • Print #
    • Input #
    • Rewrite
    • OpenRw
    • Open
    • Close
    • CloseRw
    • BlockRead
    • BlockWrite
    • GetFileSize
    • GetFAttr
    • GetFDate$
    • GetFTime$
    • Append
    • Seek
    • ...?

    zumindestens folgendes verwenden:

    Code
    io%=%IOResult


    Ab Vista läuft bei Dateien sehr viel schief, da selbst ein Admin normalerweise keine Adminrechte hat - ob etwas schief läuft und wann, das ist unter anderem von der Datei selbst und den Systemgegebenheiten abhängig (auch davon, wie das Programm gestartet wurde) - wie man in meinem Beispiel sieht, sogar von der Dateiendung.
    Ein Programm läuft unter Umständen (setzt man nicht zurück) dann auf dem einen Rechner, auf dem nächsten läuft es aber wiederum nicht. Da nicht genau fest steht, welche Profanbefehle überhaupt intern auf %IORESULT reagieren, weiß man auch nicht genau, was man überhaupt zurücksetzen muss und was nicht...

  • Zitat von AHT;765219

    Das ganze ist eine böse Falle. Im Prinzip müsste man dann ja wirklich vor jeder Dateioperation ...

    Nein, nicht vor, sondern nach jeder Dateioperation sollte man überprüfen, ob sie funktioniert hat, in dem man %IOResult abfragt. Also auf alle Fälle nach OpenRW, Reset, Append, Rewrite und natürlich nach allen Schreib- und Leseoperationen, bei denen eine Dateinummer einer geöffneten Datei anzugeben ist.
    Die genannten Rechteprobleme zeigen sich in der Regel ja bereits beim Öffnen der Datei. Wenn das schon nicht klappt, sind weitere Schreib- oder Leseoperationen hinfällig.
    Auch nach dem Schließen der Datei mit Close sollte mit %IOResult überprüft werden, ob es funkionierte.

    Tatsächlich wird bei den allermeisten Dateioperationen allerdings %IOResult bereits von mir vor Ausführung der Funktion zurückgesetzt. Bei BlockWrite und BlockRead war das bisher nicht der Fall, wird aber in XProfan 12 auch so sein.

    Gruß
    Roland


    Gruß
    Roland

    AMD Ryzen 5 5600U with Radeon Graphics 2,3 GHz / 32 GB RAM / 500 + 2000 GB SSD / Windows 11 - XProfan X4a

    Als Backup: MD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4

    http://www.xprofan.de

  • Zitat von RGH;765234

    Nein, nicht vor, sondern nach jeder Dateioperation sollte man überprüfen, ob sie funktioniert hat, in dem man %IOResult abfragt. Also auf alle Fälle nach OpenRW, Reset, Append, Rewrite und natürlich nach allen Schreib- und Leseoperationen, bei denen eine Dateinummer einer geöffneten Datei anzugeben ist.


    Nach welchen Befehlen genau? Zum Beispiel auch bei GetFileSize? Siehe auch hier! Was setzt denn jetzt %IORESULT überhaupt alles?

    Zitat von RGH;765234


    Die genannten Rechteprobleme zeigen sich in der Regel ja bereits beim Öffnen der Datei. Wenn das schon nicht klappt, sind weitere Schreib- oder Leseoperationen hinfällig.


    Das Problem dabei ist aber, dass die darauffolgenden Aktion nichts mit dem vorher geschehenen Fehler zu tun haben muss und trotzdem fehlschlägt, obwohl sie eigentlich funktionieren würde.

    Zitat von RGH;765234


    Tatsächlich wird bei den allermeisten Dateioperationen allerdings %IOResult bereits von mir vor Ausführung der Funktion zurückgesetzt.


    Bei welchen genau und bei welchen Befehlen wird das nicht getan? Was reagiert überhaupt genau auf %IORESULT?

  • Zitat von AHT;765242

    Nach welchen Befehlen genau? Zum Beispiel auch bei GetFileSize? Siehe auch hier! Was setzt denn jetzt %IORESULT überhaupt alles?

    Wie ich schon schrieb: alle Dateioperationen, die eine Dateinummer als Parameter erwarten.

    Zitat

    Das Problem dabei ist aber, dass die darauffolgenden Aktion nichts mit dem vorher geschehenen Fehler zu tun haben muss und trotzdem fehlschlägt, obwohl sie eigentlich funktionieren würde.

    Das ist natürlich konstruierbar: Du öffnest Datei A. Dann öffnest Du Datei B, ohne dich darum zu kümmern, ob es funktioniert hat. Es schlägt fehl und Du merkst es nicht. Nun machst Du wieder etwas mit Datei A und der Fehler schlägt zu, weil Du versäumt hast, ihn zuvor abzufangen.

    Gruß
    Roland

    AMD Ryzen 5 5600U with Radeon Graphics 2,3 GHz / 32 GB RAM / 500 + 2000 GB SSD / Windows 11 - XProfan X4a

    Als Backup: MD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4

    http://www.xprofan.de

  • roland:
    GetFilesize schlägt aber nicht fehl, wenn %IORESULT von einer anderen Aktion gesetzt wurde.

    Problem bei der ganzen Sache
    %IORESULT dürfte von GetLastError gesetzt werden. Die Adresse des von GetLastError ausgelesenen Errorcodes (LastErrorValue) ist aber ein Member des TEB (das weiß jedes Kleinkind), und der TEB kann problemlos von jeder anderen Anwendung ermittelt und der Inhalt von LastError geändert werden.
    Reagieren irgendwelche Profanbefehle also blind auf %IORESULT, kann man das Funktionieren einer Anwendung problemlos von außen steuern - das dazu nötige Programmierwissen geht gegen null.
    Bitte mal sehr genau überdenken, was da evtl. noch zu ändern ist...

  • Zitat von AHT;765321

    roland:
    GetFilesize schlägt aber nicht fehl, wenn %IORESULT von einer anderen Aktion gesetzt wurde.

    Ja, das ist die berühmte Ausnahme von der Regel. ;) Da die zugrundeliegende Delphi-Funktion IOResult nicht setzt, frage ich es auch nicht ab.

    Zitat

    %IORESULT dürfte von GetLastError gesetzt werden.


    Hier liegst Du falsch! %IOResult entspricht exakt der Delphi-Systemvariablen IOResult, die ausschließlich von Delphi-Dateioperationen gesetzt wird, und das mit den in der Hilfe zu %IOResult genannten Werten. Und IOResult gab es schon lange, bevor sich bei Microsoft irgend jemand das GetLastError ausgedacht hatte.

    Gruß
    Roland

    AMD Ryzen 5 5600U with Radeon Graphics 2,3 GHz / 32 GB RAM / 500 + 2000 GB SSD / Windows 11 - XProfan X4a

    Als Backup: MD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4

    http://www.xprofan.de

  • Zitat von RGH;765333

    Hier liegst Du falsch!


    Hab's gerade getestet, damit liegst du leider falsch

    Wie von mir bereits angedeutet lassen sich Profanbefehle durch das Setzen des Fehlercodes ins Nirwana schicken (von einem Fremdprogramm aus). Getestet habe ich das mit BlockRead 8O.

    Edit: Kommando zurück, hatte noch einen Copy / Paste Fehler drin :lol:. Extern scheint da zum Glück nichts möglich zu sein.

  • Kleiner Zusatz: Was natürlich möglich ist, ist sich einen Pointer auf die interne IORESULT Variable zu verschaffen und diese von einem fremden Prozess aus direkt zu ändern (gestern getestet). In der Praxis wäre ein Hooking da aber besser und leichter auszuführen. Mir ging es da erst mal um einen Zusammenhang mit dem LastErrorValue, und der besteht zum Glück nicht.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!