Win10 != Win 7 : Speicherproblem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2425
Registriert: 01.04.2007 20:18

Win10 != Win 7 : Speicherproblem

Beitrag von Bisonte »

Hallo.

Ich habe da ein kleines Problem. Folgendes Programm soll aus eine exe Datei PNG Bilder "extrahieren".
Dazu lade ich die "exe" in den Speicher und durchsuche ihn nach der PNG Header Bytefolge ab.
Zum Testen einfach die Test.pb kompilieren und mit dem PNGExtract.pb öffnen.

Es funktioniert eigentlich. Aber mein Problem ist : Es läuft auf Windows 10, aber nicht auf Windows 7.
Beides 64 Bit Systeme und der "Extractor" ist lauch ein 64 Bit Kompilat.

Könnte mich jemand erhellen, wieso es auf Windows 7 nicht funktioniert... ?

Test.pb

Code: Alles auswählen

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

Repeat
  Event = WaitWindowEvent()  
Until Quit

DataSection
  Bild1:
  IncludeBinary #PB_Compiler_Home + "Examples\Sources\Data\world.png"
  Bild2:
  IncludeBinary #PB_Compiler_Home + "Examples\Sources\Data\world.png"
EndDataSection
und hier die PNGExtract.pb

Code: Alles auswählen

UsePNGImageDecoder()

Global *Png_Start = AllocateMemory(8)
PokeQ(*Png_Start, $0A1A0A0D474E5089)  

NewList Img()

File.s = OpenFileRequester("","","",0)
If File = "" : End : EndIf

ID = ReadFile(#PB_Any, File)

If ID
  Size = Lof(ID)
  *File = AllocateMemory(Size)
  If *File
    ReadData(ID, *File, Size)
  EndIf
  CloseFile(ID)
EndIf
MessageRequester("", "Los Gehts")

For a = 0 To Size - 8 ; Jedes Byte abklappern
  If CompareMemory(*File + a, *Png_Start, 8)
    AddElement(Img()) : Img() = CatchImage(#PB_Any, *File + a)
    Height + ImageHeight(Img())
    a + 8
  EndIf
Next a

MessageRequester("", "Gefundene Bilder : "+Str(ListSize(Img())))

a = 1 : y = 0

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

AddKeyboardShortcut(0, #PB_Shortcut_Escape, 59999)

ScrollAreaGadget(0, 0, 0, 640, 480, 1000, Height + 20)

ForEach Img()
  ImageGadget(a, 10, y, 0, 0, ImageID(Img()))
  a + 1
  y + ImageHeight(Img())
Next

CloseGadgetList()

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Quit = #True
  EndSelect
  
Until Quit
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Win10 != Win 7 : Speicherproblem

Beitrag von DePe »

Edit: vorherigen Blödsinn gelöscht.

Die Signatur ist in dem Bild vorhanden.
Aber bei mir ist es unter Windows 7 Home 64-Bit so, dass eine ausfühbare Datei, eine exe oder bat usw., für ~ 1 Minute gesperrt ist, wenn sie im Explorer oder irgendeinem Dateidialog angezeigt wird. Darum wird bei mir kein Bild gefunden. Wenn ich aber den Pfad zu der 'Test.exe' in den Dialog händisch kopiere, ohne das die 'Test.exe' angezeigt wird, funktioniert es, und es werden die zwei PNGs gefunden.
Ich muss aber immer diese Minute abwarten. Ich kann auch nicht zweimal hintereinander kompilieren, da gibt es eine Fehlermeldung von PB. Das ganze hat mit irgendeinem Windows-Update begonnen.

Peter
Zuletzt geändert von DePe am 19.09.2018 08:37, insgesamt 5-mal geändert.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Win10 != Win 7 : Speicherproblem

Beitrag von Mijikai »

Wird wie schon erwähnt ein Signatur Problem sein da es bei mir mit Windows 7 funktioniert
(hab das PNG mit MsPaint erstellt).

Versuch es mal ohne das erste Byte.
Benutzeravatar
Captn. Jinguji
Beiträge: 395
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: Win10 != Win 7 : Speicherproblem

Beitrag von Captn. Jinguji »

Also, hier läuft das glatt, ohne Verzögerung.
Win7 64 bit, nur der übliche MS-Virenscanner im Einsatz.
Ist das Kunst hier, oder kann das weg ?
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Win10 != Win 7 : Speicherproblem

Beitrag von DePe »

Ich habe es nochmal probiert, jeweils 32 und 64-Bit Versionen vom Extractor und Test.exe. Öffne ich eine Test.exe mit dem Dialog funktioniert es vielleicht beim erstenmal, dann nicht mehr. Außer ich warte wieder über eine Minute. Benenne ich die Test.exe um in Test.dat, warte ich wieder die Minute, dann funktioniert es immer, 32- und 64-bit Versionen.

Ein Virenscanner außer dem MS Defender ist nicht installiert. Ändert aber nichts wenn man ihn deaktiviert.

Peter
Benutzeravatar
Bisonte
Beiträge: 2425
Registriert: 01.04.2007 20:18

Re: Win10 != Win 7 : Speicherproblem

Beitrag von Bisonte »

Bei dem W7 ist kein Virenscanner drauf, bei W10 der Standard Windows Defender.
Also denke ich an dem AV Gewurschtel wirds nicht liegen.
Mijikai hat geschrieben:Versuch es mal ohne das erste Byte.
Welches erste Byte ? Meinst du damit die 137 ($89) ? Dieser Wert gehört zum PNG wie das Amen in die Kirche ;)
DePe hat geschrieben:Benenne ich die Test.exe um in Test.dat, warte ich wieder die Minute, dann funktioniert es immer, 32- und 64-bit Versionen.
Wäre natürlich eine Möglichkeit, das File vor dem einlesen umzubenennen und danach wieder zurück, wobei das aber nur eine Notlösung sein kann. Viel dringender ist die Ursache ...
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Win10 != Win 7 : Speicherproblem

Beitrag von DePe »

Ich glaube mich zu erinnern, dass es mit Windows 7 Pro 32-Bit ohne Servicepack 1 dieses Problem nicht gab. Nach irgendeinen Upate ist das Problem dann aufgetaucht.
Windows 7 Home 64-Bit habe ich nur mit integriertem Servicepack 1, und da ist das Problem direkt nach der Installation vorhanden.

Mit Sysinternals Process Explorer habe ich versucht den Schuldigen zu finden, aber es ist irgendein Systemprozess wo keine weiteren Information angezeigt werden.

Es betrifft aber nur ausführbare Dateien die im Windows Explorer angezeigt werden. Oder anderen Dateimanagern, ich verwende z.B. den Speed Commander.
Wenn ich eine .exe lösche, bleibt sie ~ 1 Minute sichtbar und verschwindet dann.
Alles ohne Fehlermeldung, außer ich will sie nochmals löschen, weil sie noch sichtbar ist.

Bei FAT32 gibt es das Problem nicht, nur beim NTFS-Dateisystem.

Peter
Benutzeravatar
Captn. Jinguji
Beiträge: 395
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: Win10 != Win 7 : Speicherproblem

Beitrag von Captn. Jinguji »

Ich muss mich allerdings korrigieren, ich hatte das Extractprogramm nur unter dem Debugger laufend getestet.
Hat jedesmal funkionier, auch "sub-minutiös"
In der Tat ist es mit dem kompilierten Programm anders.

aber mit folgender Änderung
ID = ReadFile(#PB_Any, File, #PB_File_SharedRead )

klappt's endgültig bei mir.


Code: Alles auswählen

UsePNGImageDecoder()

Global *Png_Start = AllocateMemory(8)
PokeQ(*Png_Start, $0A1A0A0D474E5089)  

NewList Img()
OpenConsole("Bisonte")

File.s = OpenFileRequester("Test.exe","C:\Users\Dirk-A\Pictures\test.exe","*.exe|*.exe",0)

If File = "" : End : EndIf

ID = ReadFile(#PB_Any, File, #PB_File_SharedRead )
PrintN( Str( GetLastError_() ) )
If ID
  
  Size = Lof(ID)
  
  *File = AllocateMemory(Size)
  
  If *File
    a = ReadData(ID, *File, Size)
    PrintN( Str(a) ) 
  EndIf
  CloseFile(ID)
EndIf
MessageRequester("", "Los Gehts")
PrintN(Str(size) )  
For a = 0 To Size - 8 ; Jedes Byte abklappern
  If CompareMemory(*File + a, *Png_Start, 8)
    AddElement(Img()) : Img() = CatchImage(#PB_Any, *File + a)
    Height + ImageHeight(Img())
    a + 8
  EndIf
Next a

MessageRequester("", "Gefundene Bilder : "+Str(ListSize(Img())))

a = 1 : y = 0

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

AddKeyboardShortcut(0, #PB_Shortcut_Escape, 59999)

ScrollAreaGadget(0, 0, 0, 640, 480, 1000, Height + 20)

ForEach Img()
  ImageGadget(a, 10, y, 0, 0, ImageID(Img()))
  a + 1
  y + ImageHeight(Img())
Next

CloseGadgetList()

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Quit = #True
  EndSelect
  
Until Quit
Ist das Kunst hier, oder kann das weg ?
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Win10 != Win 7 : Speicherproblem

Beitrag von DePe »

Hi Captn. Jinguji,

mit #PB_File_SharedRead funktioniert es auch bei mir sofort und immer.

Peter
Antworten