windows-nt/Source/XPSP1/NT/base/efiutil/sdk/lib/init.c
2020-09-26 16:20:57 +08:00

158 lines
3.2 KiB
C

/*++
Copyright (c) 1998 Intel Corporation
Module Name:
Abstract:
Revision History
--*/
#include "lib.h"
VOID
InitializeLib (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/*++
Routine Description:
Initializes EFI library for use
Arguments:
Firmware's EFI system table
Returns:
None
--*/
{
EFI_LOADED_IMAGE *LoadedImage;
EFI_STATUS Status;
CHAR8 *LangCode;
if (!LibInitialized) {
LibInitialized = TRUE;
LibFwInstance = FALSE;
/*
* Set up global pointer to the system table, boot services table,
* and runtime services table
*/
ST = SystemTable;
BS = SystemTable->BootServices;
RT = SystemTable->RuntimeServices;
/* ASSERT (CheckCrc(0, &ST->Hdr));
* ASSERT (CheckCrc(0, &BS->Hdr));
* ASSERT (CheckCrc(0, &RT->Hdr)); */
/*
* Initialize pool allocation type
*/
if (ImageHandle) {
Status = BS->HandleProtocol (
ImageHandle,
&LoadedImageProtocol,
(VOID*)&LoadedImage
);
if (!EFI_ERROR(Status)) {
PoolAllocationType = LoadedImage->ImageDataType;
}
}
/*
* Initialize Guid table
*/
InitializeGuid();
InitializeLibPlatform(ImageHandle,SystemTable);
}
/*
*
*/
if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
InitializeUnicodeSupport (LangCode);
if (LangCode) {
FreePool (LangCode);
}
}
}
VOID
InitializeUnicodeSupport (
CHAR8 *LangCode
)
{
EFI_UNICODE_COLLATION_INTERFACE *Ui;
EFI_STATUS Status;
CHAR8 *Languages;
UINTN Index, Position, Length;
UINTN NoHandles;
EFI_HANDLE *Handles;
/*
* If we don't know it, lookup the current language code
*/
LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
if (!LangCode || !NoHandles) {
goto Done;
}
/*
* Check all driver's for a matching language code
*/
for (Index=0; Index < NoHandles; Index++) {
Status = BS->HandleProtocol (Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui);
if (EFI_ERROR(Status)) {
continue;
}
/*
* Check for a matching language code
*/
Languages = Ui->SupportedLanguages;
Length = strlena(Languages);
for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
/*
* If this code matches, use this driver
*/
if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
UnicodeInterface = Ui;
goto Done;
}
}
}
Done:
/*
* Cleanup
*/
if (Handles) {
FreePool (Handles);
}
}