Collect a library of code, the first post, with the mode enabled "MultiLib Option".
And try to build the library of this code (this is part of the library PBOSL), enabled mode "MultiLib Option".
Code: Select all
; Autor: DoubleDutch
; some extensions by ts-soft
Global vDBin_Size,vDBin_Compressed,vDBin_CRC
CompilerIf #PB_Compiler_Version>=510
UseBriefLZPacker()
CompilerEndIf
Procedure iDBin_RC4Mem(Mem.l, memLen.l, key.s)
; based on source from Pille (German-Forum)
Protected I.l, t.l, x.l, j.l , y.l, l.l, *Sp.LONG, *KeyP.BYTE, *Memm.BYTE
If key
Dim S.l(255)
Dim K.l(255)
I=0: j=0: t=0: x=0
y=0
j = 1
l.l = Len(key)
*Sp = @S()
*KeyP = @key
For I = 0 To 255
*Sp\l = I
*Sp + 4
If *KeyP\b = 0
*KeyP = @key
EndIf
K(I) = *KeyP\b
*KeyP+1
Next I
j = 0
For I = 0 To 255
j = (j + S(I) + K(I)) & 255
Swap S(I),S(j)
Next I
I = 0
j = 0
*Memm = Mem
For x = 0 To memLen-1
I = (I+1) & 255
j = (j + S(I)) & 255
Swap S(I),S(j)
t = (S(I) + (S(j) & 255)) & 255
y = S(t)
*Memm\b ! y
*Memm + 1
Next
EndIf
ProcedureReturn Mem
EndProcedure
Procedure iDBin_Header(file,string$,Size,compressed,crc)
Protected len = Len(string$)
If len
WriteString(file,string$)
EndIf
WriteByte(file,len) ; filename len
WriteLong(file,Size) ; no size
WriteLong(file,compressed) ; no pack
WriteLong(file,crc) ; crc of data
WriteLong(file,$DBDBDBDB) ; id string
EndProcedure
Procedure iDBin_CheckHeader(file,pos)
Protected result=0
Protected len.l, Size.l, compressed.l, stringpos.l
If pos>17
FileSeek(file,pos-4)
If ReadLong(file)=$DBDBDBDB
FileSeek(file,pos-17)
len=ReadByte(file)&$FF
Size=ReadLong(file)
compressed=ReadLong(file)
stringpos=pos-17-len
If compressed
result=stringpos-compressed
Else
result=stringpos-Size
EndIf
FileSeek(file,pos-17)
EndIf
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL DBin_Create(string$,append); Creates an empty DBin
Protected size.l, file.l
If append
size=FileSize(string$)
If size>0
file=OpenFile(#PB_Any,string$)
If file
FileSeek(file,size)
EndIf
EndIf
Else
file=CreateFile(#PB_Any,string$)
EndIf
If file
iDBin_Header(file,"",0,0,0)
CloseFile(file)
EndIf
ProcedureReturn file
EndProcedure
ProcedureDLL DBin_Create_UNICODE(string$,append); Creates an empty DBin
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
string$ = string2$
ProcedureReturn DBin_Create(string$,append)
EndProcedure
ProcedureDLL DBin_AddFile(dest$,string$,key$,comp); Add file to DBin
Protected result=#False
Protected endoffile = FileSize(dest$)
Protected Size.l, source.l, dest.l, file.l, compressed.l, file2.l
If endoffile>0
string$=LCase(ReplaceString(string$,"/","\"))
Size=FileSize(string$)
If Size>0
source=AllocateMemory(Size)
If source
dest=AllocateMemory(Size+8)
If dest
file=ReadFile(#PB_Any,string$)
If file
If ReadData(file,source,Size)=Size
If key$
iDBin_RC4Mem(source, MemorySize(source), key$)
EndIf
CompilerIf #PB_Compiler_Version<510
If comp>=0
compressed=PackMemory(source,dest,Size,comp)
Else
compressed=PackMemory(source,dest,Size)
EndIf
CompilerElse
compressed=CompressMemory(source, Size, dest, Size, #PB_Packer_BriefLZ)
CompilerEndIf
file2=OpenFile(#PB_Any,dest$)
If file2
FileSeek(file2,endoffile)
If compressed
WriteData(file2,dest,compressed)
Else
WriteData(file2,source,Size)
EndIf
iDBin_Header(file2,string$,Size,compressed,CRC32Fingerprint(source,Size))
CloseFile(file2)
result=#True
EndIf
EndIf
CloseFile(file)
EndIf
FreeMemory(dest)
EndIf
FreeMemory(source)
EndIf
EndIf
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL DBin_AddFile_UNICODE(dest$,string$,key$,comp); Add file to DBin
Protected dest2$ = PeekS(@dest$,#PB_Any,#PB_Unicode)
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected key2$ = PeekS(@key$,#PB_Any,#PB_Unicode)
dest$ = dest2$
string$ = string2$
key$ = key2$
ProcedureReturn DBin_AddFile(dest$,string$,key$,comp)
EndProcedure
ProcedureDLL DBin_TotalFiles(string$); Returns total number of files in DBin
Protected result=0
Protected endoffile=FileSize(string$)
Protected file.l
If endoffile>16
file=ReadFile(#PB_Any,string$)
If file
Repeat
endoffile=iDBin_CheckHeader(file,endoffile)
If endoffile
result+1
EndIf
Until Not endoffile
CloseFile(file)
EndIf
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL DBin_TotalFiles_UNICODE(string$); Returns total number of files in DBin
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
string$ = string2$
ProcedureReturn DBin_TotalFiles(string$)
EndProcedure
ProcedureDLL.s DBin_Dir(string$,pos); Returns name of file at specified index
Protected atfile=0
Protected result$=""
Protected endoffile=FileSize(string$)
Protected file.l, len.l, endoffile2.l
If endoffile>16
file=ReadFile(#PB_Any,string$)
If file
Repeat
endoffile2=endoffile
endoffile=iDBin_CheckHeader(file,endoffile)
If endoffile
atfile+1
If atfile>=pos
len=ReadByte(file)&$FF
If len
result$=Space(len)
FileSeek(file,endoffile2-17-len)
ReadData(file,@result$,len)
ReadByte(file) ; skip string len
vDBin_Size=ReadLong(file)
vDBin_Compressed=ReadLong(file)
vDBin_CRC=ReadLong(file)
EndIf
Break
EndIf
EndIf
Until Not endoffile
CloseFile(file)
EndIf
EndIf
ProcedureReturn result$
EndProcedure
ProcedureDLL.s DBin_Dir_UNICODE(string$,pos); Returns name of file at specified index
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected Result.s, Result2.s
string$ = string2$
Result = DBin_Dir(string$,pos)
Result2 = Space(Len(Result) * 2)
PokeS(@Result2, Result, #PB_Any, #PB_Unicode)
ProcedureReturn Result2
EndProcedure
ProcedureDLL DBin_FindFile(string$,file$)
Protected result.l=#False
Protected endoffile=FileSize(string$)
Protected file.l, len.l, compare$, endoffile2.l
file$=LCase(ReplaceString(file$,"/","\"))
If endoffile>16
file=ReadFile(#PB_Any,string$)
If file
Repeat
endoffile2=endoffile
endoffile=iDBin_CheckHeader(file,endoffile)
If endoffile
len=ReadCharacter(file)
If len
compare$ = Space(len)
FileSeek(file,endoffile2-17-len)
ReadData(file, @compare$, len)
If file$=compare$
ReadByte(file) ; skip string len
vDBin_Size=ReadLong(file)
vDBin_Compressed=ReadLong(file)
vDBin_CRC=ReadLong(file)
result=endoffile
Break
EndIf
EndIf
EndIf
Until Not endoffile
CloseFile(file)
EndIf
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL DBin_FindFile_UNICODE(string$,file$)
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected file2$ = PeekS(@file$,#PB_Any,#PB_Unicode)
string$ = string2$
file$ = file2$
ProcedureReturn DBin_FindFile(string$,file$)
EndProcedure
ProcedureDLL DBin_OriginalSize(string$,file$); Returns Original size of file in DBin
If DBin_FindFile(string$,file$)
ProcedureReturn vDBin_Size
Else
ProcedureReturn 0
EndIf
EndProcedure
ProcedureDLL DBin_OriginalSize_UNICODE(string$,file$); Returns Original size of file in DBin
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected file2$ = PeekS(@file$,#PB_Any,#PB_Unicode)
string$ = string2$
file$ = file2$
ProcedureReturn DBin_OriginalSize(string$,file$)
EndProcedure
ProcedureDLL DBin_CompressedSize(string$,file$); Returns Compressed size of file in DBin
If DBin_FindFile(string$,file$)
ProcedureReturn vDBin_Compressed
Else
ProcedureReturn 0
EndIf
EndProcedure
ProcedureDLL DBin_CompressedSize_UNICODE(string$,file$); Returns Compressed size of file in DBin
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected file2$ = PeekS(@file$,#PB_Any,#PB_Unicode)
string$ = string2$
file$ = file2$
ProcedureReturn DBin_CompressedSize(string$,file$)
EndProcedure
ProcedureDLL DBin_CRC32(string$,file$)
If DBin_FindFile(string$,file$)
ProcedureReturn vDBin_CRC
Else
ProcedureReturn 0
EndIf
EndProcedure
ProcedureDLL DBin_CRC32_UNICODE(string$,file$)
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected file2$ = PeekS(@file$,#PB_Any,#PB_Unicode)
string$ = string2$
file$ = file2$
ProcedureReturn DBin_CRC32(string$,file$)
EndProcedure
ProcedureDLL DBin_SaveFile(string$,file$,save$,key$); Unpack and decrypted file in DBin to Disk
Protected result=#False
Protected pos=DBin_FindFile(string$,file$)
Protected dest.l, file.l, source.l
If pos
dest=AllocateMemory(vDBin_Size)
If dest
file=ReadFile(#PB_Any,string$)
If file
FileSeek(file,pos)
If vDBin_Compressed
source=AllocateMemory(vDBin_Compressed)
If source
If ReadData(file,source,vDBin_Compressed)=vDBin_Compressed
CompilerIf #PB_Compiler_Version<510
UnpackMemory(source,dest)
CompilerElse
UncompressMemory(source, vDBin_Compressed, dest, vDBin_Size, #PB_Packer_BriefLZ)
CompilerEndIf
FreeMemory(source)
result=#True
EndIf
EndIf
Else
If ReadData(file,dest,vDBin_Size)=vDBin_Size
result=#True
EndIf
EndIf
CloseFile(file)
If result
result=#False
file=CreateFile(#PB_Any,save$)
If file
If key$
dest = iDBin_RC4Mem(dest, vDBin_Size,key$)
EndIf
WriteData(file,dest,vDBin_Size)
CloseFile(file)
result=#True
EndIf
EndIf
EndIf
FreeMemory(dest)
EndIf
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL DBin_SaveFile_UNICODE(string$,file$,save$,key$); Unpack and decrypted file in DBin to Disk
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected file2$ = PeekS(@file$,#PB_Any,#PB_Unicode)
Protected save2$ = PeekS(@save$,#PB_Any,#PB_Unicode)
Protected key2$ = PeekS(@key$,#PB_Any,#PB_Unicode)
string$ = string2$
file$ = file2$
save$ = save2$
key$ = key2$
ProcedureReturn DBin_SaveFile(string$,file$,save$,key$)
EndProcedure
ProcedureDLL DBin_(string$,file$,key$); Unpacks and decrypted file in DBin and returns Memory Address
Protected result.l=#False
Protected pos.l=DBin_FindFile(string$,file$)
Protected dest.l, file.l, source.l
If pos
dest=AllocateMemory(vDBin_Size)
If dest
file=ReadFile(#PB_Any,string$)
If file
FileSeek(file,pos)
If vDBin_Compressed
source=AllocateMemory(vDBin_Compressed)
If source
If ReadData(file,source,vDBin_Compressed)=vDBin_Compressed
CompilerIf #PB_Compiler_Version<510
UnpackMemory(source,dest)
CompilerElse
UncompressMemory(source, vDBin_Compressed, dest, vDBin_Size, #PB_Packer_BriefLZ)
CompilerEndIf
FreeMemory(source)
result=dest
EndIf
EndIf
Else
If ReadData(file,dest,vDBin_Size)=vDBin_Size
result=dest
EndIf
EndIf
CloseFile(file)
EndIf
If result=#False
FreeMemory(dest)
EndIf
EndIf
EndIf
If key$
iDBin_RC4Mem(result,MemorySize(result),key$)
EndIf
ProcedureReturn result
EndProcedure
ProcedureDLL DBin__UNICODE(string$,file$,key$); Unpacks and decrypted file in DBin and returns Memory Address
Protected string2$ = PeekS(@string$,#PB_Any,#PB_Unicode)
Protected file2$ = PeekS(@file$,#PB_Any,#PB_Unicode)
Protected key2$ = PeekS(@key$,#PB_Any,#PB_Unicode)
string$ = string2$
file$ = file2$
key$ = key2$
ProcedureReturn DBin_(string$,file$,key$)
EndProcedure
ProcedureDLL DBin_Free(mem); Free memory allocated using DBin_ command
ProcedureReturn FreeMemory(mem)
EndProcedure