FASM in einer DLL
FASM in einer DLL
Hi,
ich hab mir Heute den Tag genommen um FASM für ein Projekt in eine
DLL zu quetschen. Hier ist das Resultat samt Beispielcode zu bewundern:
http://www.mvxa.net/WIN32_DLL.zip
//Edit:
schlagt mich ruhig wegen meinem Assembler Stil. Ich wusste nicht wie
der STDCall Kopf aussieht.
wusste nich so ganz wohin damit.
ich hab mir Heute den Tag genommen um FASM für ein Projekt in eine
DLL zu quetschen. Hier ist das Resultat samt Beispielcode zu bewundern:
http://www.mvxa.net/WIN32_DLL.zip
//Edit:
schlagt mich ruhig wegen meinem Assembler Stil. Ich wusste nicht wie
der STDCall Kopf aussieht.
wusste nich so ganz wohin damit.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin

Funzt einwandfrei, ersten Test hat er einwandfrei übersetzt, mach weiter.
PS: ein bissel Doku wäre nicht schlecht!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Code: Alles auswählen
Prototype FASM_ApplyCallBack(A.l, *pB.Long)
Global sASMSource.s
Global lReadPos.l
Global lBinary.l
Procedure CLB_Print(*pBuffer.Byte)
If *pBuffer
;Debug PeekS(*pBuffer)
Print(PeekS(*pBuffer))
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CLB_Open(*pDateiName.Byte, lMode.l)
Protected lReturn
If *pDateiName
Select lMode.l
Case 1
If PeekS(*pDateiName) = "INPUT"
lReturn = 2
Else
lReturn = ReadFile(#PB_Any, PeekS(*pDateiName))
EndIf
Case 2
lReturn = 3
EndSelect
Debug "> Öffne Datei: " + PeekS(*pDateiName) + " ("+Str(lReturn)+")"
ProcedureReturn lReturn
Else
ProcedureReturn -1
EndIf
EndProcedure
Procedure CLB_Write(lFileID.l, *pBuffer.Byte, lSize.l)
lBinary = AllocateMemory(lSize+1)
CopyMemory(*pBuffer, lBinary, lSize)
ProcedureReturn #True
EndProcedure
Procedure CLB_Read(lFileID.l, *pBuffer.Byte, lSize.l, *pRead.Long)
If lFileID And *pRead
If lFileID = 2
CopyMemory(@sASMSource, *pBuffer, lSize)
*pRead\l = lSize
Else
*pRead\l = ReadData(lFileID, *pBuffer, lSize)
EndIf
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CLB_Close(lFileID.l)
If lFileID
If (lFileID <> 2) And (lFileID <> 3)
ProcedureReturn CloseFile(lFileID)
Else
ProcedureReturn #True
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CLB_Seek(lFileID.l, lDistanz.l, lMode.l)
If lFileID
If lFileID = 2
If lMode = 2
ProcedureReturn (Len(sASMSource) - lDistanz)
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn SetFilePointer_(FileID(lFileID), lDistanz, 0, lMode)
EndIf
EndIf
EndProcedure
Procedure CLB_EnVar(*pName.Byte, *pBuffer.Byte, lSize.l)
Shared sIncFolder.s
If *pName And *pBuffer
Select PeekS(*pName)
Case "INCLUDE"
PokeS(*pBuffer, sIncFolder, lSize)
ProcedureReturn MemoryStringLength(*pBuffer)
EndSelect
Else
ProcedureReturn #False
EndIf
EndProcedure
If OpenLibrary(1, "FASM.DLL")
ApplyCallback.FASM_ApplyCallBack = GetFunction(1, "ApplyCallBack")
OpenConsole()
If Not ApplyCallback(1, @CLB_Print()): End 1: EndIf
If Not ApplyCallback(2, @Clb_Open() ): End 2: EndIf
If Not ApplyCallback(3, @CLB_Write()): End 3: EndIf
If Not ApplyCallback(4, @CLB_Read() ): End 4: EndIf
If Not ApplyCallback(5, @CLB_Close()): End 5: EndIf
If Not ApplyCallback(6, @CLB_Seek() ): End 6: EndIf
If Not ApplyCallback(7, @CLB_EnVar()): End 7: EndIf
sIncFolder = "D:\Compiler\fasm\INCLUDE\"
sASMSource + "USE32" + #CRLF$
sASMSource + "mov eax, 42" + #CRLF$
sASMSource + "ret" + #CRLF$
CallFunction(1, "SetInputFile", "INPUT")
CallFunction(1, "StartAssemble")
If lBinary
If VirtualProtect_(lBinary, MemorySize(lBinary)+1, #PAGE_EXECUTE_READWRITE, @lOldProt.l)
MessageRequester("FASM JITC", Str(CallFunctionFast(lBinary)))
VirtualProtect_(lBinary, MemorySize(lBinary)+1, lOldProt, @lOldProt.l)
EndIf
FreeMemory(lBinary)
EndIf
Input()
EndIf
~100 mal angesehen aber bis jetzt hat sich nur TS Soft gemeldet.
Feedback ist erwünscht, nur so zur Info.
MVXA hat geschrieben:Sry, hatte die Woche nicht viel Zeit. Heute werde ich mich darum bischen
kümmern und noch eine Userlib veröffentlichen, die FASM enthält.

C:\Dokumente und Einstellungen[...]MVXA hat geschrieben: > aber ich kann keine Pfadangaben machen wenn Leerzeichen
> vorhanden sind (SetOutputFile) .
Haste irgendwie ein kleines Beispiel für mich?
Soa, alles ist bereinigt, ich wollte eigentlich schon gestern oder so die
neue Version hoch laden. Habs aber gelassen. Dann wollte ich die
Heute hoch laden aber Stronghold Crussader, was ich mir heute ge-
kauft hab, hat mich zusehr gefesselt. Ich hoffe morgen bekomme
ich meinen fetten Hinterteil dazu die Version upzuloaden. sry
neue Version hoch laden. Habs aber gelassen. Dann wollte ich die
Heute hoch laden aber Stronghold Crussader, was ich mir heute ge-
kauft hab, hat mich zusehr gefesselt. Ich hoffe morgen bekomme
ich meinen fetten Hinterteil dazu die Version upzuloaden. sry
