efildr.c
来自「Next BIOS Source code : Extensible Firmw」· C语言 代码 · 共 2,225 行 · 第 1/4 页
C
2,225 行
do {
if (Sd->mBitBuf & Mask) {
Val = Sd->mRight[Val];
} else {
Val = Sd->mLeft[Val];
}
Mask >>= 1;
} while (Val >= NP);
}
//
// Advance what we have read
//
Ia32EmbFillBuf (Sd, Sd->mPTLen[Val]);
if (Val) {
Val = (UINT16)((1U << (Val - 1)) + Ia32EmbGetBits (Sd, (UINT16)(Val - 1)));
}
return Val;
}
UINT16
Ia32EmbReadPTLen (
IN SCRATCH_DATA *Sd,
IN UINT16 nn,
IN UINT16 nbit,
IN UINT16 Special
)
/*++
Routine Descriptiion:
Reads code lengths for the Extra Set or the Position Set
Arguments:
Sd - The global scratch data
nn - Number of symbols
nbit - Number of bits needed to represent nn
Special - The special symbol that needs to be taken care of
Returns:
0 - OK.
BAD_TABLE - Table is corrupted.
--*/
{
UINT16 n;
UINT16 c;
UINT16 i;
UINT16 Mask;
n = Ia32EmbGetBits (Sd, nbit);
if (n == 0) {
c = Ia32EmbGetBits (Sd, nbit);
for ( i = 0; i < 256; i ++) {
Sd->mPTTable[i] = c;
}
for ( i = 0; i < nn; i++) {
Sd->mPTLen[i] = 0;
}
return 0;
}
i = 0;
while (i < n) {
c = (UINT16)(Sd->mBitBuf >> (BITBUFSIZ - 3));
if (c == 7) {
Mask = 1U << (BITBUFSIZ - 1 - 3);
while (Mask & Sd->mBitBuf) {
Mask >>= 1;
c += 1;
}
}
Ia32EmbFillBuf (Sd, (UINT16)((c < 7) ? 3 : c - 3));
Sd->mPTLen [i++] = (UINT8)c;
if (i == Special) {
c = Ia32EmbGetBits (Sd, 2);
while ((INT16)(--c) >= 0) {
Sd->mPTLen[i++] = 0;
}
}
}
while (i < nn) {
Sd->mPTLen [i++] = 0;
}
return ( Ia32EmbMakeTable (Sd, nn, Sd->mPTLen, 8, Sd->mPTTable) );
}
VOID
Ia32EmbReadCLen (
SCRATCH_DATA *Sd
)
/*++
Routine Description:
Reads code lengths for Char&Len Set.
Arguments:
Sd - the global scratch data
Returns: (VOID)
--*/
{
UINT16 n;
UINT16 c;
UINT16 i;
UINT16 Mask;
n = Ia32EmbGetBits(Sd, CBIT);
if (n == 0) {
c = Ia32EmbGetBits(Sd, CBIT);
for (i = 0; i < NC; i ++) {
Sd->mCLen[i] = 0;
}
for (i = 0; i < 4096; i ++) {
Sd->mCTable[i] = c;
}
return;
}
i = 0;
while (i < n) {
c = Sd->mPTTable[Sd->mBitBuf >> (BITBUFSIZ - 8)];
if (c >= NT) {
Mask = 1U << (BITBUFSIZ - 1 - 8);
do {
if (Mask & Sd->mBitBuf) {
c = Sd->mRight [c];
} else {
c = Sd->mLeft [c];
}
Mask >>= 1;
}while (c >= NT);
}
//
// Advance what we have read
//
Ia32EmbFillBuf (Sd, Sd->mPTLen[c]);
if (c <= 2) {
if (c == 0) {
c = 1;
} else if (c == 1) {
c = (UINT16)(Ia32EmbGetBits (Sd, 4) + 3);
} else if (c == 2) {
c = (UINT16)(Ia32EmbGetBits (Sd, CBIT) + 20);
}
while ((INT16)(--c) >= 0) {
Sd->mCLen[i++] = 0;
}
} else {
Sd->mCLen[i++] = (UINT8)(c - 2);
}
}
while (i < NC) {
Sd->mCLen[i++] = 0;
}
Ia32EmbMakeTable (Sd, NC, Sd->mCLen, 12, Sd->mCTable);
return;
}
UINT16
Ia32EmbDecodeC (
SCRATCH_DATA *Sd
)
/*++
Routine Description:
Decode a character/length value.
Arguments:
Sd - The global scratch data.
Returns:
The value decoded.
--*/
{
UINT16 j;
UINT16 Mask;
if (Sd->mBlockSize == 0) {
//
// Starting a new block
//
Sd->mBlockSize = Ia32EmbGetBits(Sd, 16);
Sd->mBadTableFlag = Ia32EmbReadPTLen (Sd, NT, TBIT, 3);
if (Sd->mBadTableFlag != 0) {
return 0;
}
Ia32EmbReadCLen (Sd);
Sd->mBadTableFlag = Ia32EmbReadPTLen (Sd, NP, PBIT, (UINT16)(-1));
if (Sd->mBadTableFlag != 0) {
return 0;
}
}
Sd->mBlockSize --;
j = Sd->mCTable[Sd->mBitBuf >> (BITBUFSIZ - 12)];
if (j >= NC) {
Mask = 1U << (BITBUFSIZ - 1 - 12);
do {
if (Sd->mBitBuf & Mask) {
j = Sd->mRight[j];
} else {
j = Sd->mLeft[j];
}
Mask >>= 1;
} while (j >= NC);
}
//
// Advance what we have read
//
Ia32EmbFillBuf(Sd, Sd->mCLen[j]);
return j;
}
VOID
Ia32EmbDecode (
SCRATCH_DATA *Sd,
UINT16 NumOfBytes
)
/*++
Routine Description:
Decode NumOfBytes and put the resulting data at starting point of mBuffer.
The buffer is circular.
Arguments:
Sd - The global scratch data
NumOfBytes - Number of bytes to decode
Returns: (VOID)
--*/
{
UINT16 di;
UINT16 r;
UINT16 c;
r = 0;
di = 0;
Sd->mBytesRemain --;
while ((INT16)(Sd->mBytesRemain) >= 0) {
Sd->mBuffer[di++] = Sd->mBuffer[Sd->mDataIdx++];
if (Sd->mDataIdx >= WNDSIZ) {
Sd->mDataIdx -= WNDSIZ;
}
r ++;
if (r >= NumOfBytes) {
return;
}
Sd->mBytesRemain --;
}
for (;;) {
c = Ia32EmbDecodeC (Sd);
if (Sd->mBadTableFlag != 0) {
return;
}
if (c < 256) {
//
// Process an Original character
//
Sd->mBuffer[di++] = (UINT8)c;
r ++;
if (di >= WNDSIZ) {
return;
}
} else {
//
// Process a Pointer
//
c = (UINT16)(c - (UINT8_MAX + 1 - THRESHOLD));
Sd->mBytesRemain = c;
Sd->mDataIdx = (r - Ia32EmbDecodeP(Sd) - 1) & (WNDSIZ - 1); //Make circular
di = r;
Sd->mBytesRemain --;
while ((INT16)(Sd->mBytesRemain) >= 0) {
Sd->mBuffer[di++] = Sd->mBuffer[Sd->mDataIdx++];
if (Sd->mDataIdx >= WNDSIZ) {
Sd->mDataIdx -= WNDSIZ;
}
r ++;
if (di >= WNDSIZ) {
return;
}
Sd->mBytesRemain --;
}
}
}
return;
}
EFI_STATUS
EFIAPI
Ia32EmbGetInfo (
IN EFI_DECOMPRESS_PROTOCOL *This,
IN VOID *Source,
IN UINT32 SrcSize,
OUT UINT32 *DstSize,
OUT UINT32 *ScratchSize
)
/*++
Routine Description:
The implementation of EFI_DECOMPRESS_PROTOCOL.GetInfo().
Arguments:
This - The protocol instance pointer
Source - The source buffer containing the compressed data.
SrcSize - The size of source buffer
DstSize - The size of destination buffer.
ScratchSize - The size of scratch buffer.
Returns:
EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved.
EFI_INVALID_PARAMETER - The source data is corrupted
--*/
{
UINT8 *Src;
*ScratchSize = sizeof (SCRATCH_DATA);
Src = Source;
if (SrcSize < 8) {
return EFI_INVALID_PARAMETER;
}
*DstSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
Ia32EmbDecompress (
IN EFI_DECOMPRESS_PROTOCOL *This,
IN VOID *Source,
IN UINT32 SrcSize,
IN OUT VOID *Destination,
IN UINT32 DstSize,
IN OUT VOID *Scratch,
IN UINT32 ScratchSize
)
/*++
Routine Description:
The implementation of EFI_DECOMPRESS_PROTOCOL.Decompress().
Arguments:
This - The protocol instance pointer
Source - The source buffer containing the compressed data.
SrcSize - The size of source buffer
Destination - The destination buffer to store the decompressed data
DstSize - The size of destination buffer.
Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data.
ScratchSize - The size of scratch buffer.
Returns:
EFI_SUCCESS - Decompression is successfull
EFI_INVALID_PARAMETER - The source data is corrupted
--*/
{
UINT32 Index;
UINT16 Count;
UINT32 CompSize;
UINT32 OrigSize;
UINT8 *Dst1;
EFI_STATUS Status;
SCRATCH_DATA *Sd;
UINT8 *Src;
UINT8 *Dst;
Status = EFI_SUCCESS;
Src = Source;
Dst = Destination;
Dst1 = Dst;
if (ScratchSize < sizeof (SCRATCH_DATA)) {
return EFI_INVALID_PARAMETER;
}
Sd = (SCRATCH_DATA *)Scratch;
if (SrcSize < 8) {
return EFI_INVALID_PARAMETER;
}
CompSize = Src[0] + (Src[1] << 8) + (Src[2] << 16) + (Src[3] << 24);
OrigSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24);
if (SrcSize < CompSize + 8) {
return EFI_INVALID_PARAMETER;
}
if (DstSize != OrigSize) {
return EFI_INVALID_PARAMETER;
}
Src = Src + 8;
for (Index = 0; Index < sizeof(SCRATCH_DATA); Index++) {
((UINT8*)Sd)[Index] = 0;
}
Sd->mBytesRemain = (UINT16)(-1);
Sd->mSrcBase = Src;
Sd->mDstBase = Dst;
Sd->mCompSize = CompSize;
Sd->mOrigSize = OrigSize;
//
// Fill the first two bytes
//
Ia32EmbFillBuf(Sd, BITBUFSIZ);
while (Sd->mOrigSize > 0) {
Count = (UINT16) (WNDSIZ < Sd->mOrigSize? WNDSIZ: Sd->mOrigSize);
Ia32EmbDecode (Sd, Count);
if (Sd->mBadTableFlag != 0) {
//
// Something wrong with the source
//
return EFI_INVALID_PARAMETER;
}
for (Index = 0; Index < Count; Index ++) {
if (Dst1 < Dst + DstSize) {
*Dst1++ = Sd->mBuffer[Index];
} else {
return EFI_INVALID_PARAMETER;
}
}
Sd->mOrigSize -= Count;
}
if (Sd->mBadTableFlag != 0) {
Status = EFI_INVALID_PARAMETER;
} else {
Status = EFI_SUCCESS;
}
return Status;
}
VOID
EfiLdrCallBack (
UINTN id,
UINTN p1,
UINTN p2,
UINTN p3
)
/*++
Routine Description:
Arguments:
Returns:
--*/
{
switch(id) {
case EFILDR_CB_VA:
Ia32EmbConvertPeImage (
&EfiCoreImage,
p1,
p2,
(VOID*)p3);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?