ReadFile mit exe unmöglich?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

ReadFile mit exe unmöglich?

Beitrag von Regenduft »

Hallo liebe Leute,

ich bin in ein seltsames Problem gstolpert. Wenn ich eine Exe mit ReadFile() öffnen möchte, so schlägt dies immer fehl (Rückgabe = 0). Wenn ich die Dateierweiterung z.B. von .exe in .xyz ändere, so schlägt ReadFile() immer noch fehl. Wenn ich aber die Exe kopiere und gleichzeitig die Dateierweiterung ändere, dann funktioniert es.

Ich habe das ganze mit Windows 7, deaktiviertem Virenschutz, in einem Verzeichnis mit vollen Schreibrechten und aktiviertem Administrator-Modus in den Compileroptionen versucht. Ich erhalte immer identische Ergebnisse... sogar wenn ich die "Vorbereitungsmaßnahmen" per Explorer oder Kommandozeile ausführe...

Ich vermute mal, dass das ganze irgendwie mit Windows zusammenhängt, aber irgendwie muss man doch eine Exe ohne Herumkopiererei öffnen können!

Wie immer vielen Dank im vorraus! :D

Code: Alles auswählen

Debug ReadFile(0, "D:\foo.exe") ; Debug-Ausgabe: 0

Code: Alles auswählen

Debug RenameFile("D:\foo.exe", "D:\foo.xyz") ; Debug-Ausgabe: 1
Debug ReadFile(0, "D:\foo.xyz")              ; Debug-Ausgabe: 0

Code: Alles auswählen

Debug CopyFile("D:\foo.exe", "D:\foo.xyz") ; Debug-Ausgabe: 1
Debug ReadFile(0, "D:\foo.xyz")            ; Debug-Ausgabe: 260
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: ReadFile mit exe unmöglich?

Beitrag von NicTheQuick »

Wird foo.exe zufällig gerade ausgeführt? Ansonsten probier auch mal das Flag #PB_File_SharedRead.
Bild
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ReadFile mit exe unmöglich?

Beitrag von mk-soft »

Gerade mein Code auf Windows getestet und angepasst ...
SharedRead hilft ;)

Code: Alles auswählen

;-TOP by mk-soft, v1.01.3, 09.04.2022 - 15.04.2022

; ----

Macro PeekInteger(Memory)
  PeekI(Memory) : Memory + SizeOf(Integer)
EndMacro

Macro PeekLong(Memory)
  PeekL(Memory) : Memory + SizeOf(Long)
EndMacro

Macro PeekQuad(Memory)
  PeekQ(Memory) : Memory + SizeOf(Quad)
EndMacro

Macro PeekFloat(Memory)
  PeekFloat(Memory) : Memory + SizeOf(Float)
EndMacro

Macro PeekDouble(Memory)
  PeekD(Memory) : Memory + SizeOf(Double)
EndMacro

Macro PeekString(Memory)
  PeekS(Memory) : Memory + (Len(PeekS(Memory)) + 1) * SizeOf(Character)
EndMacro

; ----

Procedure GetDataPosition(*Memory, Label.s, cbSize)
  Protected r1, *mem, index, len, len2
  
  If *Memory
    Label = #STX$ + Label + #ETX$
    len2 = StringByteLength(Label)
    len = cbSize - len2 - 1
    *mem = *Memory
    For index = 0 To len
      If CompareMemory(*mem, @Label, len2)
        r1 = *mem + len2 + SizeOf(character)
        Break
      EndIf
      *mem + 1
    Next
  EndIf
  ProcedureReturn r1
EndProcedure

; ----

CompilerIf #PB_Compiler_IsMainFile
  
  Define *mem, *mem2, size
  
  If ReadFile(0, ProgramFilename(), #PB_File_SharedRead)
    size = Lof(0)
    *mem = AllocateMemory(size)
    ReadData(file, *mem, size)
    CloseFile(0)
    *mem2 = GetDataPosition(*mem, "!MyDataPosition!", size)
    Debug "DataPostion " + *mem2
    If *mem2
      Debug PeekInteger(*mem2)
      Debug PeekInteger(*mem2)
      Debug PeekInteger(*mem2)
      Debug PeekString(*mem2)
      Debug PeekString(*mem2)
    EndIf
    *mem2 = GetDataPosition(*mem, "!MyDataPositionValues!", size)
    Debug "DataPostion Values " + *mem2 
    If *mem2
      Debug PeekDouble(*mem2)
      Debug PeekDouble(*mem2)
      Debug PeekDouble(*mem2)
    EndIf
    FreeMemory(*mem)
  Else
    Debug "Error open execute file"
  EndIf
  
  ; ----
  
  DataSection
    Data.s #STX$ + "!MyDataPosition!" + #ETX$
    Data.i 1, 2, 3
    Data.s "Hello World!"
    Data.s "I like PureBasic ;)"
    Data.s #STX$ + "!MyDataPositionValues!" + #ETX$
    Data.d 1.1, 1.2, 1.3
  EndDataSection
  
CompilerEndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: ReadFile mit exe unmöglich?

Beitrag von Regenduft »

Danke für die flotten Antworten! Ich bin auch nach über 10 Jahren Forenmitgliedschaft (wenn auch seltenst noch aktiv) begeistert von der Hilfsbereitschaft hier! :allright:
NicTheQuick hat geschrieben: 15.04.2022 13:39Wird foo.exe zufällig gerade ausgeführt? Ansonsten probier auch mal das Flag #PB_File_SharedRead.
Nein, foo.exe wird nicht ausgeführt - und es besteht laut Windows Ressourcenmanager auch kein sonstiger Dateizugriff statt.
Ja, #PB_File_SharedRead hilft! Danke! :D
Ich hatte das "verkehrt herum" im Kopf! Ich dachte immer mit #PB_File_SharedRead erlaube ich, dass auch andere Programme die Datei öffnen können. Hätte ich mal die PB-Hilfe genauer gelesen...

Ich werde gerade leider anderweitig "benötigt"... ich schreibe später weiter... Nochmals Danke für die Hilfe!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: ReadFile mit exe unmöglich?

Beitrag von Regenduft »

Fortsetzung:

Ich habe das grundlegende Problem entdeckt! Als mk-softs Code beim ersten Kompilieren den Debugger zum Absturz brachte, beim zweiten mal aber einwandfrei funktionierte, habe ich meine Festplatten mit einem "externen" Defragger komplett defragmentiert (was ca. 30 Stunden benötigte) und plötzlich funktiniert alles wie es soll!

Ich benutze diesen Rechner häufig für Mehrspur-Tonaufnahmen, was zu heftiger Fragmentierung führt. Da NTFS ein Fragmentierungslimit hat, könnte es evtl. sein, dass ich das überschritten hatte (?) - oder es war ein "Timeout" bzw. eine "Zugriffsüberschneidung mit dem System o.ä.", da die zweite Festplatte ("D:\", Baujahr 2008) mehr Probleme bereitete als die erste ("C:\", genauer ""%TEMP%\", ca. 5 Jahre jünger).

Jetzt funktioniert sogar OpenFile() - was ich in meinem Post nicht erwähnte, aber gar nicht funktionierte - und zwar OHNE jegliche Flags (also weder #PB_File_SharedRead noch #PB_File_SharedWrite!

Das faszinierende dabei: Mit einem Hex-, einem Wave- und einem Text-Editor konnte ich jeweils auch vor der Defragmentierung die Exe-Dateien im schreibzugriff öffnen.

Ach ja! Die Windows-Defragmentierung hatte übrigens nicht genügend defragmentiert (bei einmaliger Ausführung), weshalb ich einen "externen" Defragger nutzte (es wurde also praktisach jedes einzelne Byte auf den Platten herumgeschoben).

Vielleicht helfen die Infos ja jemanden, der mal in ein ähnliches Problem läuft... wobei ich das bei der heutigen SSD-Verbreitung eher für unwahrscheinlich halte... ;)

Nochmals Danke für die Hilfe!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: ReadFile mit exe unmöglich?

Beitrag von Benubi »

Sag niemals nie. Ich habe einen Komplettrechner mir zugelegt damit ich Probleme umgehen kann auf die ich dann trotz Allem frontal reingeknallt bin. Alles war vorinstalliert aber ein Maus Bug (zwinker) verleitete mich die Mainboard Treiber von der mitgegebenen original CD nochmal zu installieren bzw zu Updaten. Ich vermute es war der Intel Fast Storage irgendetwas welcher ausgerechnet Probleme verursacht hat. Ich dachte mir Fast Storage klingt doch gut, geht das noch schneller... muss man installieren. Pustekuchen. Danach war alles sehr sehr sehr sehr langsam. Kein abgesicherter Modus bei Neustart möglich, Maus Bewegungen extrem langsam, Festplatte so lahm wie C64; booten hat ca. 10-15 Minuten gedauert und die Login GUI brauchte 5-10 Minuten um zu auf Klicks zu reagieren, damit mir die Eingabe Maske angezeigt wird; PW blind tippen mehrmals mit Return, weil die Reaktion Minuten verzögert ist, wenn man aber wartet verschwindet aber die Maske wieder ohne daß man Zeit gehabt hätte das PW einzugeben, bzw. wurde dieses dann in einem Zeitfenster eingegeben welcher dem Rechner einfach entgangen ist. Auf das Symbol "Neustart" und dann bis zum Abgesicherten Modus zu gelangen, das dauerte jedes mal zwischen 30-45 Minuten, und schlug fehl (schwarzer Bildschirm nach Neustart im A.M.). Nur eine komplette Neuinstallation hat den neuen Rechner wieder lauffähig gemacht. Ich mußte auch die BIOS Batterie rausnehmen, damit das "Fast Boot" erstmal wegbleibt und ich überhaupt irgendwas am System ändern kann - hat aber nichts gebracht, auch wenn ich jetzt glücklich bin wieder ins BIOS gelangen zu können. Wenn was schief gehen kann, dann wird das auch schief gehen, und man kann auch SSD's auf C64 Diskettenlaufwerk Speed hinbekommen wenn man nur die richtigen Treiber dafür installiert. :lol:
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: ReadFile mit exe unmöglich?

Beitrag von Regenduft »

@Benubi:
Musste bei der Geschichte gleich an meinen alten Dell-Laptop denken. Da hatten die Treiberentwickler anscheinend tatsächlich "Volume Up" und "Volume Down" (welche "Key Down" und "Key Up" Ereignisse besitzen) mit "Volume Increment" und "Volume Decrement" (welche nur "Key Down", aber keine "Key Up" Ereignisse besitzen) durcheinander gewürfelt (Link zum alten Tread).

Darum musste ich dann immer dieses kleine Programm (Link) im Hintergrund laufen lassen, welches mit kurzer Zeitverzögerung ein "Key Up" Ereignisse nachreichte. :lol:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten