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 ك ب / التحميلات : 171)
[-] كل من 1 user says قال شكرا ل MjIrIm على المشاركة المفيدة
  • invocker
الرد
#2
رائع !
فعلاً سيفيدني Smile

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


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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم