NtCompress Unit
#1
في البداية السلام عليكم


كود :
{
  untNtCompress

  Compression types:
    COMPRESSION_FORMAT_NONE
    COMPRESSION_FORMAT_DEFAULT
    COMPRESSION_FORMAT_LZNT1
    COMPRESSION_FORMAT_NS3
    COMPRESSION_FORMAT_NS15
    COMPRESSION_FORMAT_SPARSE

  Example:
    CompressFile('C:\MyFile.dat', 'C:\Compressed.dat', COMPRESSION_FORMAT_LZNT1 or COMPRESSION_ENGINE_MAXIMUM);
    DecompressFile('C:\Compressed.dat', 'C:\Uncompressed.dat', COMPRESSION_FORMAT_LZNT1 or COMPRESSION_ENGINE_MAXIMUM);
  you can also call it like that:
    CompressFile('C:\MyFile.dat', 'C:\Compressed.dat');
    DecompressFile('C:\Compressed.dat', 'C:\Uncompressed.dat');
}

unit untNtCompress;

interface

uses Windows;

const
  COMPRESSION_FORMAT_NONE         = $00000000;
  COMPRESSION_FORMAT_DEFAULT     = $00000001;
  COMPRESSION_FORMAT_LZNT1       = $00000002;
  COMPRESSION_FORMAT_NS3         = $00000003;
  COMPRESSION_FORMAT_NS15         = $0000000F;
  COMPRESSION_FORMAT_SPARSE       = $00004000;

  COMPRESSION_ENGINE_STANDARD     = $00000000;
  COMPRESSION_ENGINE_MAXIMUM     = $00000100;
  COMPRESSION_ENGINE_HIBER       = $00000200;

function CompressMemory(lpMemory: Pointer; var Size: Cardinal; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Pointer;
function DecompressMemory(lpMemory: Pointer; var Size: Cardinal; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Pointer;
function CompressFile(lpFilename, lpOutputfile: String; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Boolean;
function DecompressFile(lpFilename, lpOutputfile: String; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Boolean;

implementation

const
  ntdll = 'ntdll.dll';

function RtlGetCompressionWorkSpaceSize(CompressionFormatAndEngine: ULONG; CompressBufferWorkSpaceSize, CompressFragmentWorkSpaceSize : PULONG): Cardinal; stdcall; external ntdll name 'RtlGetCompressionWorkSpaceSize';
function RtlCompressBuffer(CompressionFormatAndEngine: ULONG; SourceBuffer: Pointer; SourceBufferLength: ULONG; DestinationBuffer: Pointer; DestinationBufferLength: ULONG;
                           SourceChunkSize: ULONG; pDestinationSize: PULONG; WorkspaceBuffer: Pointer): Cardinal; stdcall; external ntdll name 'RtlCompressBuffer';
function RtlDeCompressBuffer(CompressionFormatAndEngine:ULONG; DestinationBuffer: Pointer; DestinationBufferLength: ULONG; SourceBuffer: Pointer; SourceBufferLength: ULONG;
                             pDestinationSize: PULONG): Cardinal; stdcall; external ntdll name 'RtlDecompressBuffer';

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.
  lpMemory: Buffer that should be compressed.
  var Size: Length of how much should be compressed, later the compressed size.
  dwCompression: Compression type.
}
function CompressMemory(lpMemory: Pointer; var Size: Cardinal; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Pointer;
var
  lpWorkspace, lpOutput: Pointer;
  dwTemp, dwOutputSize: DWORD;
begin
  Result := nil;
  if Size = INVALID_HANDLE_VALUE then
    Size := GetPointerSize(lpMemory);
  dwOutputSize := Size;
  lpOutput := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
  if lpOutput <> nil then
  begin
    RtlGetCompressionWorkSpaceSize(dwCompression, @dwTemp, @dwOutputSize);
    lpWorkspace := VirtualAlloc(nil, dwTemp, MEM_COMMIT, PAGE_READWRITE);
    if lpWorkspace <> nil then
    begin
      dwTemp := 0;
      RtlCompressBuffer(dwCompression, lpMemory, Size, lpOutput, Size, 0, @dwTemp, lpWorkspace);
      if dwTemp <> 0 then
      begin
        VirtualFree(lpWorkspace, 0, MEM_RELEASE);
        Size := dwTemp;
        Result := lpOutput;
      end;
    end;
  end;
end;

{
  Result: Pointer of the Decompressed Buffer.
  lpMemory: Buffer that should be decompressed.
  var Size: Length of how much should be decompressed (FileSize), later the decompressed size.
  dwCompression: Compression type.
}
function DecompressMemory(lpMemory: Pointer; var Size: Cardinal; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): Pointer;
var
  lpOutput: Pointer;
  dwTemp, dwOutputSize: DWORD;
begin
  Result := nil;
  dwOutputSize := Round(Size * 12.5);
  lpOutput := VirtualAlloc(nil, dwOutputSize, MEM_COMMIT, PAGE_READWRITE);
  if lpOutput <> nil then
  begin
    begin
      dwTemp := 0;
      RtlDecompressBuffer(dwCompression, lpOutput, dwOutputSize, lpMemory, Size, @dwTemp);
      if dwTemp <> 0 then
      begin
        Size := dwTemp;
        Result := lpOutput;
      end;
    end;
  end;
end;

function CompressFile(lpFilename, lpOutputfile: String; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): 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 := 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, dwCompression);
  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; dwCompression: DWORD = COMPRESSION_FORMAT_LZNT1): 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 := 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, dwCompression);
  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.

التحميل من المرفقات

و السلام.


الملفات المرفقة
.rar   NtCompress.rar (الحجم : 1.43 KB / التحميلات : 146)
الرد
#2
رائع !
فعلاً سيفيدني Smile

شكرا ً
الأنسان بمعدنه ِ و جوهره ِ , لا بمضهره ِ و مخبره ِ Smile
الرد
#3
بارك الله فيك أخي MjIrIm الله يحفظك.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...
الرد
#4
شكرا لك ،،،، وبارك الله فيك
الرد
#5
ممكن مثال و لك جزيل الشكر
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف