Italia
Foro

Speicheradressen in Longints an Funktion trasferimento

 

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 File 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 per res1& und res2&, XProfan hätte hier wohl gerne selbst dimensionierte Bereiche in Form von res1# und res2#.

Nochmal: in Profan2Cpp corre 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 potuto 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 presumibilmente 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
Downloadcounter51
Download
 
09.02.2023  
 




H.Brill
Bei mir corre 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
Downloadcounter55
Download
 
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 per 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 File erstelle ich vorab mit dem Ressource Hacker.
 
10.02.2023  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

1.512 Views

Untitledvor 0 min.
Sven Bader vor 24 Tagen
H.Brill16.06.2024
Georg Teles02.01.2024
funkheld25.09.2023
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

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


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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