diff --git a/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c new file mode 100644 index 0000000000..d3685d05c7 --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c @@ -0,0 +1,464 @@ +/** @file +Module produce UC on top of UC2. + +UEFI 2.1 specification supersedes Inte's EFI Specification 1.10. +UNICODE_COLLATION_PROTOCOL defined in Inte's EFI Specification 1.10 is replaced by +EFI_UNICODE_COLLATION_PROTOCOL in UEFI 2.1. +This module produces UC on top of UC2. This module is used on platform when both of +these two conditions are true: +1) EFI 1.10 module consuming UC present +2) And the rest of modules on the platform produce UC2 + +Copyright (c) 2006 - 2008 Intel Corporation.
+All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Module Name: + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +/** + Performs a case-insensitive comparison of two Null-terminated Unicode + strings. + + @param This Protocol instance pointer. + @param Str1 A pointer to a Null-terminated Unicode string. + @param Str2 A pointer to a Null-terminated Unicode string. + + @retval 0 Str1 is equivalent to Str2 + @retval > 0 Str1 is lexically greater than Str2 + @retval < 0 Str1 is lexically less than Str2 + +**/ +INTN +EFIAPI +StriColl ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *Str1, + IN CHAR16 *Str2 + ) +; + +/** + Converts all the Unicode characters in a Null-terminated Unicode string to + lower case Unicode characters. + + @param This Protocol instance pointer. + @param Str A pointer to a Null-terminated Unicode string. + +**/ +VOID +EFIAPI +StrLwr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ) +; + +/** + Converts all the Unicode characters in a Null-terminated Unicode string to upper + case Unicode characters. + + @param This Protocol instance pointer. + @param Str A pointer to a Null-terminated Unicode string. + +**/ +VOID +EFIAPI +StrUpr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ) +; + +/** + Performs a case-insensitive comparison of a Null-terminated Unicode + pattern string and a Null-terminated Unicode string. + + @param This Protocol instance pointer. + @param String A pointer to a Null-terminated Unicode string. + @param Pattern A pointer to a Null-terminated Unicode pattern string. + + @retval TRUE Pattern was found in String. + @retval FALSE Pattern was not found in String. + +**/ +BOOLEAN +EFIAPI +MetaiMatch ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN CHAR16 *Pattern + ) +; + +/** + Converts an 8.3 FAT file name in an OEM character set to a Null-terminated + Unicode string. + + @param This Protocol instance pointer. + @param FatSize The size of the string Fat in bytes. + @param Fat A pointer to a Null-terminated string that contains an 8.3 file + name using an OEM character set. + @param String A pointer to a Null-terminated Unicode string. The string must + be preallocated to hold FatSize Unicode characters. + +**/ +VOID +EFIAPI +FatToStr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN UINTN FatSize, + IN CHAR8 *Fat, + OUT CHAR16 *String + ) +; + +/** + Converts a Null-terminated Unicode string to legal characters in a FAT + filename using an OEM character set. + + @param This Protocol instance pointer. + @param String A pointer to a Null-terminated Unicode string. The string must + be preallocated to hold FatSize Unicode characters. + @param FatSize The size of the string Fat in bytes. + @param Fat A pointer to a Null-terminated string that contains an 8.3 file + name using an OEM character set. + + @retval TRUE Fat is a Long File Name + @retval FALSE Fat is an 8.3 file name + +**/ +BOOLEAN +EFIAPI +StrToFat ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN UINTN FatSize, + OUT CHAR8 *Fat + ) +; + +#define UC_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('_', 'U', 'C', '_') + +typedef struct { + UINT32 Signature; + EFI_UNICODE_COLLATION_PROTOCOL UC; + EFI_UNICODE_COLLATION_PROTOCOL *UC2; +} UC_PRIVATE_DATA; + +#define UC_PRIVATE_DATA_FROM_THIS(a) CR (a, UC_PRIVATE_DATA, UC, UC_PRIVATE_DATA_SIGNATURE) + +// +// Firmware Volume Protocol template +// +EFI_EVENT mUcRegistration; + +UC_PRIVATE_DATA gUCPrivateDataTemplate = { + UC_PRIVATE_DATA_SIGNATURE, + { + StriColl, + MetaiMatch, + StrLwr, + StrUpr, + FatToStr, + StrToFat, + NULL + }, + NULL +}; + +// +// Module globals +// + +VOID +EFIAPI +Uc2NotificationEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + UINTN BufferSize; + EFI_HANDLE Handle; + UC_PRIVATE_DATA *Private; + EFI_UNICODE_COLLATION_PROTOCOL *Uc2; + + while (TRUE) { + BufferSize = sizeof (Handle); + Status = gBS->LocateHandle ( + ByRegisterNotify, + &gEfiUnicodeCollation2ProtocolGuid, + mUcRegistration, + &BufferSize, + &Handle + ); + if (EFI_ERROR (Status)) { + // + // Exit Path of While Loop.... + // + break; + } + + // + // Skip this handle if the Firmware Volume Protocol is already installed + // + Status = gBS->HandleProtocol ( + Handle, + &gEfiUnicodeCollationProtocolGuid, + (VOID **)&Uc2 + ); + if (!EFI_ERROR (Status)) { + continue; + } + + // + // Allocate private data structure + // + Private = AllocateCopyPool (sizeof (UC_PRIVATE_DATA), &gUCPrivateDataTemplate); + if (Private == NULL) { + continue; + } + + // + // Retrieve the UC Protocol + // + Status = gBS->HandleProtocol ( + Handle, + &gEfiUnicodeCollation2ProtocolGuid, + (VOID **)&Private->UC2 + ); + ASSERT_EFI_ERROR (Status); + + // + // Fill in rest of private data structure + // + Private->UC.SupportedLanguages = AllocateZeroPool (ISO_639_2_ENTRY_SIZE + 1); + Status = ConvertRfc3066LanguageToIso639Language (Private->UC2->SupportedLanguages, Private->UC.SupportedLanguages); + + if (!EFI_ERROR (Status)) { + + // + // Install Firmware Volume Protocol onto same handle + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiUnicodeCollationProtocolGuid, + &Private->UC, + NULL + ); + ASSERT_EFI_ERROR (Status); + } + } +} + + +/** + The user Entry Point for DXE driver. The user code starts with this function + as the real entry point for the image goes into a library that calls this + function. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval other Some error occurs when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +InitializeUC ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EfiCreateProtocolNotifyEvent ( + &gEfiUnicodeCollationProtocolGuid, + TPL_CALLBACK, + Uc2NotificationEvent, + NULL, + &mUcRegistration + ); + return EFI_SUCCESS; +} + + +/** + Performs a case-insensitive comparison of two Null-terminated Unicode + strings. + + @param This Protocol instance pointer. + @param Str1 A pointer to a Null-terminated Unicode string. + @param Str2 A pointer to a Null-terminated Unicode string. + + @retval 0 Str1 is equivalent to Str2 + @retval > 0 Str1 is lexically greater than Str2 + @retval < 0 Str1 is lexically less than Str2 + +**/ +INTN +EFIAPI +StriColl ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *Str1, + IN CHAR16 *Str2 + ) +{ + UC_PRIVATE_DATA *Private; + + Private = UC_PRIVATE_DATA_FROM_THIS (This); + + return Private->UC2->StriColl (Private->UC2, Str1, Str2); +} + + +/** + Converts all the Unicode characters in a Null-terminated Unicode string to + lower case Unicode characters. + + @param This Protocol instance pointer. + @param Str A pointer to a Null-terminated Unicode string. + +**/ +VOID +EFIAPI +StrLwr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ) +{ + UC_PRIVATE_DATA *Private; + + Private = UC_PRIVATE_DATA_FROM_THIS (This); + + Private->UC2->StrLwr (Private->UC2, Str); +} + + +/** + Converts all the Unicode characters in a Null-terminated Unicode string to upper + case Unicode characters. + + @param This Protocol instance pointer. + @param Str A pointer to a Null-terminated Unicode string. + +**/ +VOID +EFIAPI +StrUpr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN OUT CHAR16 *Str + ) +{ + UC_PRIVATE_DATA *Private; + + Private = UC_PRIVATE_DATA_FROM_THIS (This); + + Private->UC2->StrUpr (Private->UC2, Str); +} + +/** + Performs a case-insensitive comparison of a Null-terminated Unicode + pattern string and a Null-terminated Unicode string. + + @param This Protocol instance pointer. + @param String A pointer to a Null-terminated Unicode string. + @param Pattern A pointer to a Null-terminated Unicode pattern string. + + @retval TRUE Pattern was found in String. + @retval FALSE Pattern was not found in String. + +**/ +BOOLEAN +EFIAPI +MetaiMatch ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN CHAR16 *Pattern + ) +{ + UC_PRIVATE_DATA *Private; + + Private = UC_PRIVATE_DATA_FROM_THIS (This); + + return Private->UC2->MetaiMatch (Private->UC2, String, Pattern); +} + + +/** + Converts an 8.3 FAT file name in an OEM character set to a Null-terminated + Unicode string. + + @param This Protocol instance pointer. + @param FatSize The size of the string Fat in bytes. + @param Fat A pointer to a Null-terminated string that contains an 8.3 file + name using an OEM character set. + @param String A pointer to a Null-terminated Unicode string. The string must + be preallocated to hold FatSize Unicode characters. + +**/ +VOID +EFIAPI +FatToStr ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN UINTN FatSize, + IN CHAR8 *Fat, + OUT CHAR16 *String + ) +{ + UC_PRIVATE_DATA *Private; + + Private = UC_PRIVATE_DATA_FROM_THIS (This); + + Private->UC2->FatToStr (Private->UC2, FatSize, Fat, String); +} + + +/** + Converts a Null-terminated Unicode string to legal characters in a FAT + filename using an OEM character set. + + @param This Protocol instance pointer. + @param String A pointer to a Null-terminated Unicode string. The string must + be preallocated to hold FatSize Unicode characters. + @param FatSize The size of the string Fat in bytes. + @param Fat A pointer to a Null-terminated string that contains an 8.3 file + name using an OEM character set. + + @retval TRUE Fat is a Long File Name + @retval FALSE Fat is an 8.3 file name + +**/ +BOOLEAN +EFIAPI +StrToFat ( + IN EFI_UNICODE_COLLATION_PROTOCOL *This, + IN CHAR16 *String, + IN UINTN FatSize, + OUT CHAR8 *Fat + ) +{ + UC_PRIVATE_DATA *Private; + + Private = UC_PRIVATE_DATA_FROM_THIS (This); + + return Private->UC2->StrToFat (Private->UC2, String, FatSize, Fat); +} + diff --git a/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf new file mode 100644 index 0000000000..62c0b252e6 --- /dev/null +++ b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf @@ -0,0 +1,61 @@ +#/** @file +# Module produce UC on top of UC2. +# +# UEFI 2.1 specification supersedes Inte's EFI Specification 1.10. +# UNICODE_COLLATION_PROTOCOL defined in Inte's EFI Specification 1.10 is replaced by +# EFI_UNICODE_COLLATION_PROTOCOL in UEFI 2.1. +# This module produces UC on top of UC2. This module is used on platform when both of +# these two conditions are true: +# 1) EFI 1.10 module consuming UC present +# 2) And the rest of modules on the platform produce UC2 +# +# Copyright (c) 2006 - 2008, Intel Corporation +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = UcToUc2Thunk + FILE_GUID = FD76FF8E-665F-4afc-AF75-724EF5A569E5 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + ENTRY_POINT = InitializeUC + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources.common] + UcToUc2Thunk.c + +[Packages] + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + UefiBootServicesTableLib + BaseLib + DebugLib + UefiLib + MemoryAllocationLib + HiiLib + +[Protocols] + gEfiUnicodeCollation2ProtocolGuid + gEfiUnicodeCollationProtocolGuid + +[Depex] + TRUE