2 UEFI and Tiano Custom Decompress Library
3 Tt will do Tiano or UEFI decompress with different verison parameter.
5 Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "BaseUefiTianoCustomDecompressLibInternals.h"
19 Shift mBitBuf NumOfBits left. Read in NumOfBits of bits from source.
21 @param Sd The global scratch data
22 @param NumOfBits The number of bits to shift and read.
31 // Left shift NumOfBits of bits in advance
33 Sd
->mBitBuf
= (UINT32
) (Sd
->mBitBuf
<< NumOfBits
);
36 // Copy data needed in bytes into mSbuBitBuf
38 while (NumOfBits
> Sd
->mBitCount
) {
40 Sd
->mBitBuf
|= (UINT32
) (Sd
->mSubBitBuf
<< (NumOfBits
= (UINT16
) (NumOfBits
- Sd
->mBitCount
)));
42 if (Sd
->mCompSize
> 0) {
44 // Get 1 byte into SubBitBuf
48 Sd
->mSubBitBuf
= Sd
->mSrcBase
[Sd
->mInBuf
++];
53 // No more bits from the source, just pad zero bit.
62 // Caculate additional bit count read to update mBitCount
64 Sd
->mBitCount
= (UINT16
) (Sd
->mBitCount
- NumOfBits
);
67 // Copy NumOfBits of bits from mSubBitBuf into mBitBuf
69 Sd
->mBitBuf
|= Sd
->mSubBitBuf
>> Sd
->mBitCount
;
73 Get NumOfBits of bits out from mBitBuf
75 Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent
76 NumOfBits of bits from source. Returns NumOfBits of bits that are
79 @param Sd The global scratch data.
80 @param NumOfBits The number of bits to pop and read.
82 @return The bits that are popped out.
94 // Pop NumOfBits of Bits from Left
96 OutBits
= (UINT32
) (Sd
->mBitBuf
>> (BITBUFSIZ
- NumOfBits
));
99 // Fill up mBitBuf from source
101 FillBuf (Sd
, NumOfBits
);
107 Creates Huffman Code mapping table according to code length array.
109 Creates Huffman Code mapping table for Extra Set, Char&Len Set
110 and Position Set according to code length array.
111 If TableBits > 16, then ASSERT ().
113 @param Sd The global scratch data
114 @param NumOfChar Number of symbols in the symbol set
115 @param BitLen Code length array
116 @param TableBits The width of the mapping table
117 @param Table The table to be created.
120 @retval BAD_TABLE The table is corrupted.
148 // The maximum mapping table width supported by this internal
149 // working function is 16.
151 ASSERT (TableBits
<= 16);
153 for (Index
= 0; Index
<= 16; Index
++) {
157 for (Index
= 0; Index
< NumOfChar
; Index
++) {
158 Count
[BitLen
[Index
]]++;
164 for (Index
= 1; Index
<= 16; Index
++) {
165 WordOfStart
= Start
[Index
];
166 WordOfCount
= Count
[Index
];
167 Start
[Index
+ 1] = (UINT16
) (WordOfStart
+ (WordOfCount
<< (16 - Index
)));
170 if (Start
[17] != 0) {
172 return (UINT16
) BAD_TABLE
;
175 JuBits
= (UINT16
) (16 - TableBits
);
178 for (Index
= 1; Index
<= TableBits
; Index
++) {
179 Start
[Index
] >>= JuBits
;
180 Weight
[Index
] = (UINT16
) (1U << (TableBits
- Index
));
183 while (Index
<= 16) {
184 Weight
[Index
] = (UINT16
) (1U << (16 - Index
));
188 Index
= (UINT16
) (Start
[TableBits
+ 1] >> JuBits
);
191 Index3
= (UINT16
) (1U << TableBits
);
192 if (Index
< Index3
) {
193 SetMem16 (Table
+ Index
, (Index3
- Index
) * sizeof (*Table
), 0);
198 Mask
= (UINT16
) (1U << (15 - TableBits
));
200 for (Char
= 0; Char
< NumOfChar
; Char
++) {
203 if (Len
== 0 || Len
>= 17) {
207 NextCode
= (UINT16
) (Start
[Len
] + Weight
[Len
]);
209 if (Len
<= TableBits
) {
211 for (Index
= Start
[Len
]; Index
< NextCode
; Index
++) {
218 Pointer
= &Table
[Index3
>> JuBits
];
219 Index
= (UINT16
) (Len
- TableBits
);
222 if (*Pointer
== 0 && Avail
< (2 * NC
- 1)) {
223 Sd
->mRight
[Avail
] = Sd
->mLeft
[Avail
] = 0;
227 if (*Pointer
< (2 * NC
- 1)) {
228 if ((Index3
& Mask
) != 0) {
229 Pointer
= &Sd
->mRight
[*Pointer
];
231 Pointer
= &Sd
->mLeft
[*Pointer
];
243 Start
[Len
] = NextCode
;
252 Decodes a position value.
254 Get a position value according to Position Huffman Table.
256 @param Sd the global scratch data
258 @return The position value decoded.
269 Val
= Sd
->mPTTable
[Sd
->mBitBuf
>> (BITBUFSIZ
- 8)];
272 Mask
= 1U << (BITBUFSIZ
- 1 - 8);
276 if ((Sd
->mBitBuf
& Mask
) != 0) {
277 Val
= Sd
->mRight
[Val
];
279 Val
= Sd
->mLeft
[Val
];
283 } while (Val
>= MAXNP
);
286 // Advance what we have read
288 FillBuf (Sd
, Sd
->mPTLen
[Val
]);
292 Pos
= (UINT32
) ((1U << (Val
- 1)) + GetBits (Sd
, (UINT16
) (Val
- 1)));
299 Reads code lengths for the Extra Set or the Position Set.
301 Read in the Extra Set or Pointion Set Length Arrary, then
302 generate the Huffman code mapping for them.
304 @param Sd The global scratch data.
305 @param nn Number of symbols.
306 @param nbit Number of bits needed to represent nn.
307 @param Special The special symbol that needs to be taken care of.
310 @retval BAD_TABLE Table is corrupted.
327 // Read Extra Set Code Length Array size
329 Number
= (UINT16
) GetBits (Sd
, nbit
);
333 // This represents only Huffman code used
335 CharC
= (UINT16
) GetBits (Sd
, nbit
);
337 for (Index
= 0; Index
< 256; Index
++) {
338 Sd
->mPTTable
[Index
] = CharC
;
341 SetMem (Sd
->mPTLen
, nn
, 0);
348 while (Index
< Number
&& Index
< NPT
) {
350 CharC
= (UINT16
) (Sd
->mBitBuf
>> (BITBUFSIZ
- 3));
353 // If a code length is less than 7, then it is encoded as a 3-bit
354 // value. Or it is encoded as a series of "1"s followed by a
355 // terminating "0". The number of "1"s = Code length - 4.
358 Mask
= 1U << (BITBUFSIZ
- 1 - 3);
359 while (Mask
& Sd
->mBitBuf
) {
365 FillBuf (Sd
, (UINT16
) ((CharC
< 7) ? 3 : CharC
- 3));
367 Sd
->mPTLen
[Index
++] = (UINT8
) CharC
;
371 // After the third length of the code length concatenation,
372 // a 2-bit value is used to indicated the number of consecutive
373 // zero lengths after the third length.
375 if (Index
== Special
) {
376 CharC
= (UINT16
) GetBits (Sd
, 2);
377 while ((INT16
) (--CharC
) >= 0 && Index
< NPT
) {
378 Sd
->mPTLen
[Index
++] = 0;
383 while (Index
< nn
&& Index
< NPT
) {
384 Sd
->mPTLen
[Index
++] = 0;
387 return MakeTable (Sd
, nn
, Sd
->mPTLen
, 8, Sd
->mPTTable
);
391 Reads code lengths for Char&Len Set.
393 Read in and decode the Char&Len Set Code Length Array, then
394 generate the Huffman Code mapping table for the Char&Len Set.
396 @param Sd the global scratch data
409 Number
= (UINT16
) GetBits (Sd
, CBIT
);
413 // This represents only Huffman code used
415 CharC
= (UINT16
) GetBits (Sd
, CBIT
);
417 SetMem (Sd
->mCLen
, NC
, 0);
419 for (Index
= 0; Index
< 4096; Index
++) {
420 Sd
->mCTable
[Index
] = CharC
;
427 while (Index
< Number
&& Index
< NC
) {
428 CharC
= Sd
->mPTTable
[Sd
->mBitBuf
>> (BITBUFSIZ
- 8)];
430 Mask
= 1U << (BITBUFSIZ
- 1 - 8);
434 if (Mask
& Sd
->mBitBuf
) {
435 CharC
= Sd
->mRight
[CharC
];
437 CharC
= Sd
->mLeft
[CharC
];
442 } while (CharC
>= NT
);
445 // Advance what we have read
447 FillBuf (Sd
, Sd
->mPTLen
[CharC
]);
453 } else if (CharC
== 1) {
454 CharC
= (UINT16
) (GetBits (Sd
, 4) + 3);
455 } else if (CharC
== 2) {
456 CharC
= (UINT16
) (GetBits (Sd
, CBIT
) + 20);
459 while ((INT16
) (--CharC
) >= 0 && Index
< NC
) {
460 Sd
->mCLen
[Index
++] = 0;
465 Sd
->mCLen
[Index
++] = (UINT8
) (CharC
- 2);
470 SetMem (Sd
->mCLen
+ Index
, NC
- Index
, 0);
472 MakeTable (Sd
, NC
, Sd
->mCLen
, 12, Sd
->mCTable
);
478 Decode a character/length value.
480 Read one value from mBitBuf, Get one code from mBitBuf. If it is at block boundary, generates
481 Huffman code mapping table for Extra Set, Code&Len Set and
484 @param Sd The global scratch data.
486 @return The value decoded.
497 if (Sd
->mBlockSize
== 0) {
499 // Starting a new block
500 // Read BlockSize from block header
502 Sd
->mBlockSize
= (UINT16
) GetBits (Sd
, 16);
505 // Read in the Extra Set Code Length Arrary,
506 // Generate the Huffman code mapping table for Extra Set.
508 Sd
->mBadTableFlag
= ReadPTLen (Sd
, NT
, TBIT
, 3);
509 if (Sd
->mBadTableFlag
!= 0) {
514 // Read in and decode the Char&Len Set Code Length Arrary,
515 // Generate the Huffman code mapping table for Char&Len Set.
520 // Read in the Position Set Code Length Arrary,
521 // Generate the Huffman code mapping table for the Position Set.
523 Sd
->mBadTableFlag
= ReadPTLen (Sd
, MAXNP
, Sd
->mPBit
, (UINT16
) (-1));
524 if (Sd
->mBadTableFlag
!= 0) {
530 // Get one code according to Code&Set Huffman Table
533 Index2
= Sd
->mCTable
[Sd
->mBitBuf
>> (BITBUFSIZ
- 12)];
536 Mask
= 1U << (BITBUFSIZ
- 1 - 12);
539 if ((Sd
->mBitBuf
& Mask
) != 0) {
540 Index2
= Sd
->mRight
[Index2
];
542 Index2
= Sd
->mLeft
[Index2
];
546 } while (Index2
>= NC
);
549 // Advance what we have read
551 FillBuf (Sd
, Sd
->mCLen
[Index2
]);
557 Decode the source data and put the resulting data into the destination buffer.
559 @param Sd The global scratch data
570 BytesRemain
= (UINT16
) (-1);
576 // Get one code from mBitBuf
578 CharC
= DecodeC (Sd
);
579 if (Sd
->mBadTableFlag
!= 0) {
585 // Process an Original character
587 if (Sd
->mOutBuf
>= Sd
->mOrigSize
) {
591 // Write orignal character into mDstBase
593 Sd
->mDstBase
[Sd
->mOutBuf
++] = (UINT8
) CharC
;
600 CharC
= (UINT16
) (CharC
- (BIT8
- THRESHOLD
));
608 // Locate string position
610 DataIdx
= Sd
->mOutBuf
- DecodeP (Sd
) - 1;
613 // Write BytesRemain of bytes into mDstBase
616 while ((INT16
) (BytesRemain
) >= 0) {
617 Sd
->mDstBase
[Sd
->mOutBuf
++] = Sd
->mDstBase
[DataIdx
++];
618 if (Sd
->mOutBuf
>= Sd
->mOrigSize
) {
632 Given a compressed source buffer, this function retrieves the size of
633 the uncompressed buffer and the size of the scratch buffer required
634 to decompress the compressed source buffer.
636 Retrieves the size of the uncompressed buffer and the temporary scratch buffer
637 required to decompress the buffer specified by Source and SourceSize.
638 If the size of the uncompressed buffer or the size of the scratch buffer cannot
639 be determined from the compressed data specified by Source and SourceData,
640 then RETURN_INVALID_PARAMETER is returned. Otherwise, the size of the uncompressed
641 buffer is returned in DestinationSize, the size of the scratch buffer is returned
642 in ScratchSize, and RETURN_SUCCESS is returned.
643 This function does not have scratch buffer available to perform a thorough
644 checking of the validity of the source data. It just retrieves the "Original Size"
645 field from the beginning bytes of the source data and output it as DestinationSize.
646 And ScratchSize is specific to the decompression implementation.
648 If Source is NULL, then ASSERT().
649 If DestinationSize is NULL, then ASSERT().
650 If ScratchSize is NULL, then ASSERT().
652 @param Source The source buffer containing the compressed data.
653 @param SourceSize The size, in bytes, of the source buffer.
654 @param DestinationSize A pointer to the size, in bytes, of the uncompressed buffer
655 that will be generated when the compressed buffer specified
656 by Source and SourceSize is decompressed..
657 @param ScratchSize A pointer to the size, in bytes, of the scratch buffer that
658 is required to decompress the compressed buffer specified
659 by Source and SourceSize.
661 @retval RETURN_SUCCESS The size of the uncompressed data was returned
662 in DestinationSize and the size of the scratch
663 buffer was returned in ScratchSize.
664 @retval RETURN_INVALID_PARAMETER
665 The size of the uncompressed data or the size of
666 the scratch buffer cannot be determined from
667 the compressed data specified by Source
672 UefiDecompressGetInfo (
673 IN CONST VOID
*Source
,
674 IN UINT32 SourceSize
,
675 OUT UINT32
*DestinationSize
,
676 OUT UINT32
*ScratchSize
679 UINT32 CompressedSize
;
681 ASSERT (Source
!= NULL
);
682 ASSERT (DestinationSize
!= NULL
);
683 ASSERT (ScratchSize
!= NULL
);
685 if (SourceSize
< 8) {
686 return RETURN_INVALID_PARAMETER
;
689 CompressedSize
= ReadUnaligned32 ((UINT32
*)Source
);
690 if (SourceSize
< (CompressedSize
+ 8)) {
691 return RETURN_INVALID_PARAMETER
;
694 *ScratchSize
= sizeof (SCRATCH_DATA
);
695 *DestinationSize
= ReadUnaligned32 ((UINT32
*)Source
+ 1);
697 return RETURN_SUCCESS
;
701 Decompresses a compressed source buffer by EFI or Tiano algorithm.
703 Extracts decompressed data to its original form.
704 This function is designed so that the decompression algorithm can be implemented
705 without using any memory services. As a result, this function is not allowed to
706 call any memory allocation services in its implementation. It is the caller's
707 responsibility to allocate and free the Destination and Scratch buffers.
708 If the compressed source data specified by Source is successfully decompressed
709 into Destination, then RETURN_SUCCESS is returned. If the compressed source data
710 specified by Source is not in a valid compressed data format,
711 then RETURN_INVALID_PARAMETER is returned.
713 If Source is NULL, then ASSERT().
714 If Destination is NULL, then ASSERT().
715 If the required scratch buffer size > 0 and Scratch is NULL, then ASSERT().
717 @param Source The source buffer containing the compressed data.
718 @param Destination The destination buffer to store the decompressed data
719 @param Scratch A temporary scratch buffer that is used to perform the decompression.
720 This is an optional parameter that may be NULL if the
721 required scratch buffer size is 0.
722 @param Version 1 for UEFI Decompress algoruthm, 2 for Tiano Decompess algorithm.
724 @retval RETURN_SUCCESS Decompression completed successfully, and
725 the uncompressed buffer is returned in Destination.
726 @retval RETURN_INVALID_PARAMETER
727 The source buffer specified by Source is corrupted
728 (not in a valid compressed format).
732 UefiTianoDecompress (
733 IN CONST VOID
*Source
,
734 IN OUT VOID
*Destination
,
735 IN OUT VOID
*Scratch
,
745 ASSERT (Source
!= NULL
);
746 ASSERT (Destination
!= NULL
);
747 ASSERT (Scratch
!= NULL
);
752 Sd
= (SCRATCH_DATA
*) Scratch
;
754 CompSize
= Src
[0] + (Src
[1] << 8) + (Src
[2] << 16) + (Src
[3] << 24);
755 OrigSize
= Src
[4] + (Src
[5] << 8) + (Src
[6] << 16) + (Src
[7] << 24);
758 // If compressed file size is 0, return
761 return RETURN_SUCCESS
;
766 SetMem (Sd
, sizeof (SCRATCH_DATA
), 0);
769 // The length of the field 'Position Set Code Length Array Size' in Block Header.
770 // For UEFI 2.0 de/compression algorithm(Version 1), mPBit = 4
771 // For Tiano de/compression algorithm(Version 2), mPBit = 5
783 Sd
->mSrcBase
= (UINT8
*)Src
;
786 // CompSize and OrigSize are caculated in bytes
788 Sd
->mCompSize
= CompSize
;
789 Sd
->mOrigSize
= OrigSize
;
792 // Fill the first BITBUFSIZ bits
794 FillBuf (Sd
, BITBUFSIZ
);
801 if (Sd
->mBadTableFlag
!= 0) {
803 // Something wrong with the source
805 return RETURN_INVALID_PARAMETER
;
808 return RETURN_SUCCESS
;
812 Decompresses a UEFI compressed source buffer.
814 Extracts decompressed data to its original form.
815 This function is designed so that the decompression algorithm can be implemented
816 without using any memory services. As a result, this function is not allowed to
817 call any memory allocation services in its implementation. It is the caller's
818 responsibility to allocate and free the Destination and Scratch buffers.
819 If the compressed source data specified by Source is successfully decompressed
820 into Destination, then RETURN_SUCCESS is returned. If the compressed source data
821 specified by Source is not in a valid compressed data format,
822 then RETURN_INVALID_PARAMETER is returned.
824 If Source is NULL, then ASSERT().
825 If Destination is NULL, then ASSERT().
826 If the required scratch buffer size > 0 and Scratch is NULL, then ASSERT().
828 @param Source The source buffer containing the compressed data.
829 @param Destination The destination buffer to store the decompressed data
830 @param Scratch A temporary scratch buffer that is used to perform the decompression.
831 This is an optional parameter that may be NULL if the
832 required scratch buffer size is 0.
834 @retval RETURN_SUCCESS Decompression completed successfully, and
835 the uncompressed buffer is returned in Destination.
836 @retval RETURN_INVALID_PARAMETER
837 The source buffer specified by Source is corrupted
838 (not in a valid compressed format).
843 IN CONST VOID
*Source
,
844 IN OUT VOID
*Destination
,
845 IN OUT VOID
*Scratch OPTIONAL
848 return UefiTianoDecompress (Source
, Destination
, Scratch
, 1);
852 Examines a GUIDed section and returns the size of the decoded buffer and the
853 size of an optional scratch buffer required to actually decode the data in a GUIDed section.
855 Examines a GUIDed section specified by InputSection.
856 If GUID for InputSection does not match the GUID that this handler supports,
857 then RETURN_UNSUPPORTED is returned.
858 If the required information can not be retrieved from InputSection,
859 then RETURN_INVALID_PARAMETER is returned.
860 If the GUID of InputSection does match the GUID that this handler supports,
861 then the size required to hold the decoded buffer is returned in OututBufferSize,
862 the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field
863 from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute.
865 If InputSection is NULL, then ASSERT().
866 If OutputBufferSize is NULL, then ASSERT().
867 If ScratchBufferSize is NULL, then ASSERT().
868 If SectionAttribute is NULL, then ASSERT().
871 @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.
872 @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required
873 if the buffer specified by InputSection were decoded.
874 @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space
875 if the buffer specified by InputSection were decoded.
876 @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes
877 field of EFI_GUID_DEFINED_SECTION in the PI Specification.
879 @retval RETURN_SUCCESS The information about InputSection was returned.
880 @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.
881 @retval RETURN_INVALID_PARAMETER The information can not be retrieved from the section specified by InputSection.
886 TianoDecompressGetInfo (
887 IN CONST VOID
*InputSection
,
888 OUT UINT32
*OutputBufferSize
,
889 OUT UINT32
*ScratchBufferSize
,
890 OUT UINT16
*SectionAttribute
894 ASSERT (SectionAttribute
!= NULL
);
896 if (InputSection
== NULL
) {
897 return RETURN_INVALID_PARAMETER
;
901 &gTianoCustomDecompressGuid
,
902 &(((EFI_GUID_DEFINED_SECTION
*) InputSection
)->SectionDefinitionGuid
))) {
903 return RETURN_INVALID_PARAMETER
;
906 // Get guid attribute of guid section.
908 *SectionAttribute
= ((EFI_GUID_DEFINED_SECTION
*) InputSection
)->Attributes
;
911 // Call Tiano GetInfo to get the required size info.
913 return UefiDecompressGetInfo (
914 (UINT8
*) InputSection
+ ((EFI_GUID_DEFINED_SECTION
*) InputSection
)->DataOffset
,
915 (*(UINT32
*) (((EFI_COMMON_SECTION_HEADER
*) InputSection
)->Size
) & 0x00ffffff) - ((EFI_GUID_DEFINED_SECTION
*) InputSection
)->DataOffset
,
922 Decompress a Tiano compressed GUIDed section into a caller allocated output buffer.
924 Decodes the GUIDed section specified by InputSection.
925 If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned.
926 If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned.
927 If the GUID of InputSection does match the GUID that this handler supports, then InputSection
928 is decoded into the buffer specified by OutputBuffer and the authentication status of this
929 decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the
930 data in InputSection, then OutputBuffer is set to point at the data in InputSection. Otherwise,
931 the decoded data will be placed in caller allocated buffer specified by OutputBuffer.
933 If InputSection is NULL, then ASSERT().
934 If OutputBuffer is NULL, then ASSERT().
935 If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().
936 If AuthenticationStatus is NULL, then ASSERT().
939 @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.
940 @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation.
941 @param[in] ScratchBuffer A caller allocated buffer that may be required by this function
942 as a scratch buffer to perform the decode operation.
943 @param[out] AuthenticationStatus
944 A pointer to the authentication status of the decoded output buffer.
945 See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
946 section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must
947 never be set by this handler.
949 @retval RETURN_SUCCESS The buffer specified by InputSection was decoded.
950 @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.
951 @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded.
957 IN CONST VOID
*InputSection
,
958 OUT VOID
**OutputBuffer
,
959 IN VOID
*ScratchBuffer
, OPTIONAL
960 OUT UINT32
*AuthenticationStatus
963 ASSERT (OutputBuffer
!= NULL
);
964 ASSERT (InputSection
!= NULL
);
967 &gTianoCustomDecompressGuid
,
968 &(((EFI_GUID_DEFINED_SECTION
*) InputSection
)->SectionDefinitionGuid
))) {
969 return RETURN_INVALID_PARAMETER
;
973 // Set Authentication to Zero.
975 *AuthenticationStatus
= 0;
978 // Call Tiano Decompress to get the raw data
980 return UefiTianoDecompress (
981 (UINT8
*) InputSection
+ ((EFI_GUID_DEFINED_SECTION
*) InputSection
)->DataOffset
,
989 Registers TianoDecompress and TianoDecompressGetInfo handlers with TianoCustomerDecompressGuid
991 @retval RETURN_SUCCESS Register successfully.
992 @retval RETURN_OUT_OF_RESOURCES No enough memory to store this handler.
996 TianoDecompressLibConstructor (
999 return ExtractGuidedSectionRegisterHandlers (
1000 &gTianoCustomDecompressGuid
,
1001 TianoDecompressGetInfo
,