Unpacker support for LoadFile in KoW

This commit is contained in:
2021-01-10 05:43:16 +03:00
parent fa788aeb37
commit d808aeb0f9
4 changed files with 38 additions and 0 deletions

View File

@@ -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;

25
Lib/KoW/Unpack.inc Normal file
View File

@@ -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}

BIN
Lib/KoW/unpacker.obj Normal file

Binary file not shown.

View File

@@ -671,6 +671,10 @@ const
function GetProcAddress(hLib: Pointer; ProcName: PKolibriChar): Pointer; stdcall;
{$ENDIF}
{$IFNDEF KolibriOS}
{$I KoW\Unpack.inc}
{$ENDIF}
implementation
{$IFNDEF KolibriOS}