Deutsch
Forum

Speicheradressen in Longints an Funktion übergeben

 

Sven
Bader
Hallo zusammen,

folgendes Thema schiebe ich schon eine Weile vor mir hier, weil es zwar in keiner Profan Version von 10 bis X4 funktioniert aber sehr wohl in Profan2CPP.

Ziel ist es, Ressourcen aus dem laufenden Programm oder einer DLL zu laden, welche aber gepackt sind und mittels RtlDecompressBuffer entpackt werden müssen. Dies sollte alles soll passieren, ohne eine Datei zwischenzuspeichern.

Das Problem ist, dass FindResource/LoadResource eine Speicheradresse zurückgibt, welche ich in einem Logint speichere und damit nicht weiterarbeiten kann.

Das simpelste Beispiel, wo es in XProfan schon knallt ist:
umcompressedSize& = Long(res2&,0)

In RtlDecompressBuffer dann 2x für res1& und res2&, XProfan hätte hier wohl gerne selbst dimensionierte Bereiche in Form von res1# und res2#.

Nochmal: in Profan2Cpp läuft der Code, die Werte (nicht die Adresse!) der Integers werden hier korrekt als Speicheradresse erkannt.

Hilft mir hier eine weitere Zuweisung, ein copymemory, eine Typenkonvertierung?

Hier der Code und anbei der Quelltext + die Resourcen-DLL zum testen.
 $H opengl.ph
declare texture&,dll&
Def RtlCompressBuffer(8) !"ntdll.dll", "RtlCompressBuffer"
Def RtlDecompressBuffer(6) !"ntdll.dll", "RtlDecompressBuffer"
Def RtlGetCompressionWorkSpaceSize(3) !"ntdll.dll", "RtlGetCompressionWorkSpaceSize"
Def RtlMoveMemory(3) !"kernel32.dll", "RtlMoveMemory"
Def LoadResource(2) !"KERNEL32","LoadResource"
Def FindResource(3) !"KERNEL32","FindResourceA"
Def LockResource(1) !"KERNEL32","LockResource"
Def FreeResource(1) !"KERNEL32","FreeResource"
Def SizeofResource(2) !"KERNEL32","SizeofResource"
dll& = UseDLL("rgba.dll")
cls

Proc OpenResource

    parameters Typ$,Name$

Endproc

Proc LoadPackedBGRA

    Parameters name$,iWidth&,iHeight&
    Declare umcompressedSize&,umcompressed#,typ$,res1&,res2&,bworkspaacesize&
    typ$ ="PACKED"
    OpenResource("PACKED", name$)
    res1& = FindResource(dll&, addr(name$), addr(typ$))
    res2& = LoadResource(dll&, res1&)
    LockResource(res2&)
    umcompressedSize& = Long(res2&,0)'<- hier knallt es zum 1. Mal, ein Lonint mit Speicheradresse wird hier nicht korrekt verarbeitet
    'Den könnte man auch noch berechnen
    'umcompressedSize& = (iWidth& * iHeight& * 4)
    dim umcompressed#, umcompressedSize&
    'Gescheiteter Versuch, es zu retten
    'declare res2#,res1#
    'res2# =  res2&
    'res1# =  res1&
    'dim res1#, 100'???
    'dim res2#, umcompressedSize&
    'RtlDecompressBuffer(2,umcompressed#,umcompressedSize&,res2#+4,SizeofResource(%hInstance, res1#)-4,Addr(bworkspacesize&))
    'Hier knallt es vermutlich doppelt bei res1& und res&, da hier wieder Speicheradressen in einem Longint stehen
    RtlDecompressBuffer(2,umcompressed#,umcompressedSize&,res2&+4,SizeofResource(dll&, res1&)-4,Addr(bworkspacesize&))
    'in  USHORT CompressionFormat
    'out PUCHAR UncompressedBuffer
    'in  ULONG  UncompressedBufferSize
    'in  PUCHAR CompressedBuffer         <- eine loning Variable
    'in  ULONG  CompressedBufferSize
    'out PULONG FinalUncompressedSize
    declare txID&
    txID& = 1
    ogl("glGenTextures",1, addr(txID&))
    ogl("glBindTexture",~GL_TEXTURE_2D, txID&)
    ogl("glEnable",~GL_ALPHA_TEST)'RGBA
    ogl("glTexEnvi",~GL_TEXTURE_ENV, ~GL_TEXTURE_ENV_MODE, ~GL_MODULATE)
    ogl("glTexImage2D",~GL_TEXTURE_2D,0,~GL_RGBA,iWidth&, iHeight&,0,~GL_BGRA,~GL_UNSIGNED_BYTE,umcompressed#)
    ogl("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
    ogl("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
    ogl("glBindTexture",~GL_TEXTURE_2D, 0)
    FreeResource(res2&)
    dispose umcompressed#
    Return txID&

EndProc

oGL("init",%hwnd,0,0,0,1)
oGL("glBlendFunc", ~GL_SRC_ALPHA, ~GL_ONE_MINUS_SRC_ALPHA)
oGL("glEnable",    ~GL_BLEND)
oGL("blendmode",    2)
oGL("posmode",    1)
texture&= LoadPackedBGRA("LOGO",128,128)

whilenot iskey(27)

    sleep 16
    oGL("clear")
    oGL("origin",0,0,-1)
    oGL("texture",texture&,1)
    ogl("Quad",0.5,0.5)
    oGL("show")

endwhile

FreeDLL dll&

29 kB
Hochgeladen:09.02.2023
Ladeanzahl51
Herunterladen
 
09.02.2023  
 




H.Brill
Bei mir läuft es unter X4.
Vielleicht stimmt der Pfad der DLL nicht.
Überprüfe mal, ob dll& ein gültiges Handle hat,
also <> 0.

56 kB
Hochgeladen:10.02.2023
Ladeanzahl55
Herunterladen
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
10.02.2023  
 




Sven
Bader
Oh man, du hast recht. Das einzige, was ich nur für den Forenbeitrag gemacht habe ist, eine DLL statt einer Ressource aus der EXE zu nehmen, dort scheint die Ressource irgendwie defekt zu sein.

Mit folgender Zeile geht es jetzt auch in der EXE, zumindest ab X3
$RES LOGO.res

Die Datei erstelle ich vorab mit dem Ressource Hacker.
 
10.02.2023  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.510 Betrachtungen

Unbenanntvor 0 min.
Sven Bader vor 23 Tagen
H.Brill16.06.2024
Georg Teles02.01.2024
funkheld25.09.2023
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

Sven Bader (2x)
H.Brill (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie