예제 #1
0
파일: NtRtl.cs 프로젝트: codehz/winsilo
 public static extern NtStatus RtlDecompressBuffer(
     RtlCompressionFormat CompressionFormat,
     [In] byte[] UncompressedBuffer,
     int UncompressedBufferSize,
     [Out] byte[] CompressedBuffer,
     int CompressedBufferSize,
     out int FinalUncompressedSize
     );
예제 #2
0
파일: NtRtl.cs 프로젝트: codehz/winsilo
 public static extern NtStatus RtlCompressBuffer(
     RtlCompressionFormat CompressionFormatAndEngine,
     [In] byte[] UncompressedBuffer,
     int UncompressedBufferSize,
     [Out] byte[] CompressedBuffer,
     int CompressedBufferSize,
     int UncompressedChunkSize,
     out int FinalCompressedSize,
     [Out] byte[] WorkSpace
     );
        private static NtResult <byte[]> DecompressBuffer(CLAIM_SET_METADATA set)
        {
            RtlCompressionFormat format = (RtlCompressionFormat)set.usCompressionFormat.Value;

            if (format == RtlCompressionFormat.None)
            {
                return(set.ClaimsSet.GetValue().CreateResult());
            }
            return(NtCompression.DecompressBuffer(format, set.ClaimsSet, set.ulUncompressedClaimsSetSize, false));
        }
예제 #4
0
 /// <summary>
 /// Decompress a buffer.
 /// </summary>
 /// <param name="format">The compression format used.</param>
 /// <param name="compressed_buffer">The compressed buffer.</param>
 /// <param name="uncompressed_length">The expected uncompressed length.</param>
 /// <param name="throw_on_error">True to throw on error.</param>
 /// <returns>The uncompressed buffer.</returns>
 public static NtResult <byte[]> DecompressBuffer(RtlCompressionFormat format, byte[] compressed_buffer, int uncompressed_length, bool throw_on_error)
 {
     byte[] uncompressed_buffer = new byte[uncompressed_length];
     return(Decompress(format, compressed_buffer, uncompressed_buffer, out int final_size).CreateResult(throw_on_error, () => {
         if (uncompressed_buffer.Length != final_size)
         {
             Array.Resize(ref uncompressed_buffer, final_size);
         }
         return uncompressed_buffer;
     }
                                                                                                        ));
 }
예제 #5
0
 private static NtStatus Decompress(RtlCompressionFormat format, byte[] compressed_buffer, byte[] uncompressed_buffer, out int final_size)
 {
     if (format == RtlCompressionFormat.XPRESS_HUFF)
     {
         NtStatus status = NtRtl.RtlGetCompressionWorkSpaceSize(format, out int compress_size, out int fragment_size);
         if (!status.IsSuccess())
         {
             final_size = 0;
             return(status);
         }
         byte[] workspace = new byte[compress_size];
         return(NtRtl.RtlDecompressBufferEx(format, uncompressed_buffer, uncompressed_buffer.Length,
                                            compressed_buffer, compressed_buffer.Length, out final_size, workspace));
     }
     return(NtRtl.RtlDecompressBuffer(format, uncompressed_buffer, uncompressed_buffer.Length,
                                      compressed_buffer, compressed_buffer.Length, out final_size));
 }
예제 #6
0
파일: NtRtl.cs 프로젝트: codehz/winsilo
 public static extern NtStatus RtlGetCompressionWorkSpaceSize(
     RtlCompressionFormat CompressionFormatAndEngine,
     out int CompressBufferWorkSpaceSize,
     out int CompressFragmentWorkSpaceSize
     );
예제 #7
0
 /// <summary>
 /// Decompress a buffer.
 /// </summary>
 /// <param name="format">The compression format used.</param>
 /// <param name="compressed_buffer">The compressed buffer.</param>
 /// <param name="uncompressed_length">The expected uncompressed length.</param>
 /// <returns>The uncompressed buffer.</returns>
 public static byte[] DecompressBuffer(RtlCompressionFormat format, byte[] compressed_buffer, int uncompressed_length)
 {
     return(DecompressBuffer(format, compressed_buffer, uncompressed_length, true).Result);
 }