Thanks for the suggestion, Andrew. Unfortunately, the decompress
protocol doesn't like the gensec compression format either (after
I manipulated the header as appropriate).

I found some Lzma decompress source and incorporated it into my
EFI appp and used LzmaCompress to compress the data that I append
to the app.

Regards,
Jim


From: Andrew Fish [mailto:[email protected]]
Sent: Wednesday, November 05, 2014 1:23 PM
To: [email protected]
Subject: Re: [edk2] Win32 Compress and UEFI Decompress Question


On Nov 5, 2014, at 8:08 AM, [email protected]<mailto:[email protected]> 
wrote:

I'm building an EFI utility under Windows. I want to compress some data and 
append
it to the utility. Later, when the utility is executed in the EFI shell, I want 
to
have the utility decompress the data.

I tried using BaseTools\Bin\Win32\LzmaCompress.exe to compress the data and 
found
that it doesn't place the compressed and uncompressed sizes of the data at the
beginning of the compressed data.  So, I tried 
BaseTools\Bin\Win32\TianoCompress.exe.

That utility does seem to create an output that the EFI_DECOMPRESS_PROTOCOL's
GetInfo() function likes.  However, that protocol's Decompress() function does 
not
like the compressed data's format (returns Invalid Parameter).

I also tried using the UefiDecompressLib functions to decompress the data, but
that fails similarly.

So, is there some Win32 utility that compresses data in the format that the
EFI_DECOMPRESS_PROTOCOL expects?  If so, what/where is it?


Interesting question. Looks like the tools have code that does the compression.
https://svn.code.sf.net/p/edk2/code/trunk/edk2/BaseTools/Source/C/Common/EfiCompress.c

The stand alone tools are used for GUID’ed compression schemes. These map to an 
EFI_SECTION_GUID_DEFINED in the FV FFS file section, while the 
EFI_SECTION_COMPRESSION is used for the EFI compression type. I think this is 
only reason stand alone tools exist is for the other forms of compression.

A hack would be to use the GenSec tool.

GenSec -s EFI_SECTION_COMPRESSION -o compressedFileSection RawFile

I think it would generate the compressed data that starts with a 
EFI_COMPRESSION_SECTION structure. So if you just point pass the the 
EFI_COMPRESSION_SECTION the decompress should “just work”?

https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdePkg/Include/Pi/PiFirmwareFile.h

///

/// An encapsulation section type in which the

/// section data is compressed.

///

typedef struct {

  ///

  /// Usual common section header. CommonHeader.Type = EFI_SECTION_COMPRESSION.

  ///

  EFI_COMMON_SECTION_HEADER   CommonHeader;

  ///

  /// The UINT32 that indicates the size of the section data after 
decompression.

  ///

  UINT32                      UncompressedLength;

  ///

  /// Indicates which compression algorithm is used.

  ///

  UINT8                       CompressionType;

} EFI_COMPRESSION_SECTION;

If the file is to big to fit in a EFI_COMPRESSION_SECTION it will end up in a 
EFI_COMPRESSION_SECTION2.


typedef struct {

  ///

  /// Usual common section header. CommonHeader.Type = EFI_SECTION_COMPRESSION.

  ///

  EFI_COMMON_SECTION_HEADER2    CommonHeader;

  ///

  /// UINT32 that indicates the size of the section data after decompression.

  ///

  UINT32                        UncompressedLength;

  ///

  /// Indicates which compression algorithm is used.

  ///

  UINT8                         CompressionType;

} EFI_COMPRESSION_SECTION2;

typedef struct {

  ///

  /// A 24-bit unsigned integer that contains the total size of the section in 
bytes,

  /// including the EFI_COMMON_SECTION_HEADER.

  ///

  UINT8             Size[3];



  EFI_SECTION_TYPE  Type;



  ///

  /// If Size is 0xFFFFFF, then ExtendedSize contains the size of the section. 
If

  /// Size is not equal to 0xFFFFFF, then this field does not exist.

  ///

  UINT32            ExtendedSize;

} EFI_COMMON_SECTION_HEADER2;


Thanks,

Andrew Fish



Thanks,
Jim
------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
[email protected]<mailto:[email protected]>
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to