diff --git a/Lib/KoW/KolibriOS.inc b/Lib/KoW/KolibriOS.inc index 9c0421f..17e07b1 100644 --- a/Lib/KoW/KolibriOS.inc +++ b/Lib/KoW/KolibriOS.inc @@ -126,6 +126,7 @@ function LoadFile(FileName: PKolibriChar; var Size: LongWord): Pointer; var hFile: THandle; QSize: UInt64; + Unpacked: Pointer; begin hFile := CreateFileA(FileName, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if (hFile <> INVALID_HANDLE_VALUE) and GetFileSizeEx(hFile, QSize) then @@ -133,6 +134,14 @@ begin Size := QSize; GetMem(Result, Size); Windows.ReadFile(hFile, Result^, Size, Size, nil); + if PPackedFileHeader(Result).Signature = KPCK then + begin + Size := PPackedFileHeader(Result).UnpackedSize; + GetMem(Unpacked, Size); + Unpack(PPackedFile(Result)^, Unpacked^); + FreeMem(Result); + Result := Unpacked; + end; Exit; end; Size := 0; diff --git a/Lib/KoW/Unpack.inc b/Lib/KoW/Unpack.inc new file mode 100644 index 0000000..612798f --- /dev/null +++ b/Lib/KoW/Unpack.inc @@ -0,0 +1,25 @@ +(* + KolibriOS on Windows (KoW) unpacker (KPCK) support unit + + Copyright (c) 2021 Delphi SDK for KolibriOS team +*) + +const + KPCK = $4B43504B; + +type + PPackedFileHeader = ^TPackedFileHeader; + TPackedFileHeader = packed record + Signature: LongWord; // KPCK + UnpackedSize: LongWord; + PackMethod: LongWord; // LZMA, CallTrick, NoCallTrick + end; + + PPackedFile = ^TPackedFile; + TPackedFile = packed record + Header: TPackedFileHeader; + Data: array[0..0] of Byte; + end; + +procedure Unpack(const Source: TPackedFile; var Dest); stdcall; external; +{$L KoW\unpacker.obj} diff --git a/Lib/KoW/unpacker.obj b/Lib/KoW/unpacker.obj new file mode 100644 index 0000000..c457c9f Binary files /dev/null and b/Lib/KoW/unpacker.obj differ diff --git a/Lib/KolibriOS.pas b/Lib/KolibriOS.pas index f28deb7..ba4c30c 100644 --- a/Lib/KolibriOS.pas +++ b/Lib/KolibriOS.pas @@ -671,6 +671,10 @@ const function GetProcAddress(hLib: Pointer; ProcName: PKolibriChar): Pointer; stdcall; {$ENDIF} +{$IFNDEF KolibriOS} + {$I KoW\Unpack.inc} +{$ENDIF} + implementation {$IFNDEF KolibriOS}