79 lines
2.2 KiB
ObjectPascal
79 lines
2.2 KiB
ObjectPascal
unit XDeltaDLL;
|
|
|
|
interface
|
|
|
|
uses
|
|
MemoryModule,
|
|
WinAPI.Windows,
|
|
System.SysUtils, System.Classes;
|
|
|
|
type
|
|
xd3_flags = (XD3_JUST_HDR = (1 shl 1), XD3_SKIP_WINDOW = (1 shl 2),
|
|
XD3_SKIP_EMIT = (1 shl 3), XD3_FLUSH = (1 shl 4), XD3_SEC_DJW = (1 shl 5),
|
|
XD3_SEC_FGK = (1 shl 6), XD3_SEC_LZMA = (1 shl 24),
|
|
XD3_SEC_TYPE = (XD3_SEC_DJW or XD3_SEC_FGK or XD3_SEC_LZMA),
|
|
XD3_SEC_NODATA = (1 shl 7), XD3_SEC_NOINST = (1 shl 8),
|
|
XD3_SEC_NOADDR = (1 shl 9), XD3_SEC_NOALL = (XD3_SEC_NODATA or
|
|
XD3_SEC_NOINST or XD3_SEC_NOADDR), XD3_ADLER32 = (1 shl 10),
|
|
XD3_ADLER32_NOVER = (1 shl 11), XD3_NOCOMPRESS = (1 shl 13),
|
|
XD3_BEGREEDY = (1 shl 14), XD3_ADLER32_RECODE = (1 shl 15),
|
|
XD3_COMPLEVEL_SHIFT = 20, XD3_COMPLEVEL_MASK = ($F shl XD3_COMPLEVEL_SHIFT),
|
|
XD3_COMPLEVEL_1 = (1 shl XD3_COMPLEVEL_SHIFT),
|
|
XD3_COMPLEVEL_2 = (2 shl XD3_COMPLEVEL_SHIFT),
|
|
XD3_COMPLEVEL_3 = (3 shl XD3_COMPLEVEL_SHIFT),
|
|
XD3_COMPLEVEL_6 = (6 shl XD3_COMPLEVEL_SHIFT),
|
|
XD3_COMPLEVEL_9 = (9 shl XD3_COMPLEVEL_SHIFT));
|
|
|
|
var
|
|
xd3_encode: function(const input: PByte; input_size: NativeUInt;
|
|
source: PByte; source_size: NativeUInt; output_buffer: PByte;
|
|
output_size: PNativeUInt; avail_output: NativeUInt; flags: Integer)
|
|
: Integer cdecl;
|
|
xd3_decode: function(const input: PByte; input_size: NativeUInt;
|
|
source: PByte; source_size: NativeUInt; output_buf: PByte;
|
|
output_size: PNativeUInt; avail_output: NativeUInt; flags: Integer)
|
|
: Integer cdecl;
|
|
DLLLoaded: boolean = False;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Utils;
|
|
|
|
var
|
|
DLLStream: TResourceStream;
|
|
DLLHandle: TMemoryModule;
|
|
|
|
procedure Init;
|
|
begin
|
|
DLLStream := TResourceStream.Create(HInstance, 'xdelta3_dll', RT_RCDATA);
|
|
DLLHandle := MemoryLoadLibary(DLLStream.Memory);
|
|
if Assigned(DLLHandle) then
|
|
begin
|
|
DLLLoaded := True;
|
|
@xd3_encode := MemoryGetProcAddress(DLLHandle, 'xd3_encode');
|
|
Assert(@xd3_encode <> nil);
|
|
@xd3_decode := MemoryGetProcAddress(DLLHandle, 'xd3_decode');
|
|
Assert(@xd3_decode <> nil);
|
|
end
|
|
else
|
|
DLLLoaded := False;
|
|
end;
|
|
|
|
procedure Deinit;
|
|
begin
|
|
if not DLLLoaded then
|
|
exit;
|
|
MemoryFreeLibrary(DLLHandle);
|
|
end;
|
|
|
|
initialization
|
|
|
|
Init;
|
|
|
|
finalization
|
|
|
|
Deinit;
|
|
|
|
end.
|