untaPlib by ErazerZ

Post date: Sep 28, 2010 4:56:54 PM

aPlib objects are attached at the bottom of the page.

{
  untaPlib by ErazerZ
  25. Juni 2006
  Example:
    CompressFile('c:\Data.dat', 'c:\Compressed.dat');
    DecompressFile('c:\Compressed.dat', 'c:\Data_ok.dat');
}
unit untaPlib;
interface
uses Windows;
function CompressMemory(lpBuffer: Pointer; var Size: Cardinal): Pointer;
function DecompressMemory(lpBuffer: Pointer; var Size: Cardinal): Pointer;
function CompressFile(lpFilename, lpOutputfile: String): Boolean;
function DecompressFile(lpFilename, lpOutputfile: String): Boolean;
{
  Taken out from aPlibu
}
type
  TaPack_Status = function(w0, w1, w2 : DWORD; cbparam : Pointer) : DWORD;cdecl;
  function _aP_pack(var Source; var Destination; Length : DWORD; var WorkMem; Callback: TaPack_Status; cbparam : Pointer): DWORD; cdecl;
  function _aP_workmem_size(InputSize : DWORD): DWORD; cdecl;
  function _aPsafe_pack(var Source; var Destination; Length : DWORD; var WorkMem; Callback : TaPack_Status; cbparam : Pointer): DWORD; cdecl;
  function _aPsafe_get_orig_size(var Source): DWORD; cdecl;
  function _aPsafe_depack(var Source; SrcLen: DWORD; var Destination; DstLen :DWORD): DWORD; cdecl;
  function _aP_depack_asm(var Source, Destination) : DWORD; cdecl;
  function _aP_crc32(var Source; Length : DWORD): DWORD; cdecl;
  function _aP_depack_asm_safe(var Source; SrcLen : DWORD; var Destination; DstLen :DWORD) : DWORD; cdecl;
implementation

{$L lib_aplib\aplib.obj} //Attached

{$L lib_aplib\depack.obj} //Attached

{$L lib_aplib\depacks.obj} //Attached

{$L lib_aplib\crc32.obj} //Attached

{$L lib_aplib\spack.obj} //Attached

{$L lib_aplib\sgetsize.obj} //Attached

{$L lib_aplib\sdepack.obj} //Attached

function _aP_pack(var Source; var Destination; Length : DWORD; var WorkMem; Callback : TaPack_Status; cbparam : Pointer) : DWORD; external;
function _aP_workmem_size(InputSize : DWORD) : DWORD; external;
function _aPsafe_pack(var Source; var Destination; Length : DWORD; var WorkMem; Callback : TaPack_Status; cbparam : Pointer) : DWORD; external;
function _aPsafe_get_orig_size(var Source) : DWORD; external;
function _aPsafe_depack(var Source; SrcLen : DWORD; var Destination; DstLen :DWORD) : DWORD; external;
function _aP_depack_asm(var Source, Destination) : DWORD; external;
function _aP_crc32(var Source; Length : DWORD): DWORD; external;
function _aP_depack_asm_safe(var Source; SrcLen : DWORD; var Destination; DstLen :DWORD) : DWORD; external;
function GetPointerSize(lpBuffer: Pointer): Cardinal;
begin
  if lpBuffer = nil then
    Result := Cardinal(-1)
  else
    Result := Cardinal(Pointer(Cardinal(lpBuffer) -4)^) and $7FFFFFFC -4;
end;
{
  Result: Pointer of the Compressed Buffer.
  lpBuffer: Buffer that should be compressed.
  var Size: Length of how much should be compressed, later the compressed size.
  Safe: Should be True
}
function CompressMemory(lpBuffer: Pointer; var Size: Cardinal): Pointer;
var
  lpOutput, lpWorkspace: Pointer;
begin
  Result := nil;
  if lpBuffer = nil then
    Exit;
  if Size = INVALID_HANDLE_VALUE then
    Size := GetPointerSize(lpBuffer);
  lpWorkspace := VirtualAlloc(nil, _aP_workmem_size(Size), MEM_COMMIT, PAGE_READWRITE);
  lpOutput := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
  Size := _aPsafe_pack(lpBuffer^, lpOutput^, Size, lpWorkspace^, nil, nil);
  Result := lpOutput;
  VirtualFree(lpWorkspace, 0, MEM_RELEASE);
end;
{
  Result: Pointer of the Decompressed Buffer.
  lpBuffer: Buffer that should be decompressed.
  var Size: Length of how much should be decompressed (FileSize), later the decompressed size.
  Safe: Should be True
}
function DecompressMemory(lpBuffer: Pointer; var Size: Cardinal): Pointer;
var
  lpOutput: Pointer;
  dwOrginalSize: Cardinal;
begin
  Result := nil;
  if lpBuffer = nil then
    Exit;
  if Size = INVALID_HANDLE_VALUE then
    Size := GetPointerSize(lpBuffer);
  dwOrginalSize := _aPsafe_get_orig_size(lpBuffer^);
  if (dwOrginalSize <> INVALID_HANDLE_VALUE) or (dwOrginalSize <> 0) then
  begin
    lpOutput := VirtualAlloc(nil, dwOrginalSize, MEM_COMMIT, PAGE_READWRITE);
    Size := _aPsafe_depack(lpBuffer^, Size, lpOutput^, dwOrginalSize) ;
    Result := lpOutput;
  end;
end;
function CompressFile(lpFilename, lpOutputfile: String): Boolean;
var
  hFileIn, hFileMappingObjectIn,
  hFileOut: THandle;
  dwFileSize, lpNumberOfBytesWritten: DWORD;
  lpBaseAddressIn, lpBuffer: Pointer;
begin
  Result := False;
  hFileIn := CreateFile(PChar(lpFilename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);
  if hFileIn = INVALID_HANDLE_VALUE then
    Exit;
  dwFileSize := Windows.GetFileSize(hFileIn, nil);
  hFileMappingObjectIn := CreateFileMapping(hFileIn, nil, PAGE_READWRITE, 0, 0, nil);
  lpBaseAddressIn := MapViewOfFile(hFileMappingObjectIn, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0);
  lpBuffer := CompressMemory(lpBaseAddressIn, dwFileSize);
  hFileOut := CreateFile(PChar(lpOutputfile), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
  if hFileOut <> INVALID_HANDLE_VALUE then
  begin
    WriteFile(hFileOut, lpBuffer^, dwFileSize, lpNumberOfBytesWritten, nil);
    CloseHandle(hFileOut);
  end;
  UnmapViewOfFile(lpBaseAddressIn);
  CloseHandle(hFileMappingObjectIn);
  CloseHandle(hFileIn);
end;
function DecompressFile(lpFilename, lpOutputfile: String): Boolean;
var
  hFileIn, hFileMappingObjectIn,
  hFileOut: THandle;
  dwFileSize, lpNumberOfBytesWritten: DWORD;
  lpBaseAddressIn, lpBuffer: Pointer;
begin
  Result := False;
  hFileIn := CreateFile(PChar(lpFilename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);
  if hFileIn = INVALID_HANDLE_VALUE then
    Exit;
  dwFileSize := Windows.GetFileSize(hFileIn, nil);
  hFileMappingObjectIn := CreateFileMapping(hFileIn, nil, PAGE_READWRITE, 0, 0, nil);
  lpBaseAddressIn := MapViewOfFile(hFileMappingObjectIn, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0);
  lpBuffer := DecompressMemory(lpBaseAddressIn, dwFileSize);
  hFileOut := CreateFile(PChar(lpOutputfile), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
  if hFileOut <> INVALID_HANDLE_VALUE then
  begin
    WriteFile(hFileOut, lpBuffer^, dwFileSize, lpNumberOfBytesWritten, nil);
    CloseHandle(hFileOut);
  end;
  VirtualFree(lpBuffer, 0, MEM_RELEASE);
  UnmapViewOfFile(lpBaseAddressIn);
  CloseHandle(hFileMappingObjectIn);
  CloseHandle(hFileIn);
end;
end.