| |
|
|
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&
|
|
|
| |
|
|
|
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. |
|
|
| 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. |
|
|
| |
|
|