aboutsummaryrefslogtreecommitdiffstats
path: root/Lessons/Lesson_50
diff options
context:
space:
mode:
authorKonstantin Aladyshev <aladyshev22@gmail.com>2021-10-26 16:01:35 +0300
committerKonstantin Aladyshev <aladyshev22@gmail.com>2021-10-26 16:01:35 +0300
commitdcbd8fb9a24cbc4ad99c37c35f248cb4d29828e0 (patch)
treed7145b23c96fc4300c8e65a49aa76964cf2362ad /Lessons/Lesson_50
parent17aca5e9aeeeda7ed6e07c5b92f7d88075769182 (diff)
downloadUEFI-Lessons-dcbd8fb9a24cbc4ad99c37c35f248cb4d29828e0.tar.gz
UEFI-Lessons-dcbd8fb9a24cbc4ad99c37c35f248cb4d29828e0.tar.bz2
UEFI-Lessons-dcbd8fb9a24cbc4ad99c37c35f248cb4d29828e0.zip
Add lesson 50
Signed-off-by: Konstantin Aladyshev <aladyshev22@gmail.com>
Diffstat (limited to 'Lessons/Lesson_50')
-rw-r--r--Lessons/Lesson_50/README.md256
-rw-r--r--Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.c54
-rw-r--r--Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.inf30
-rw-r--r--Lessons/Lesson_50/UefiLessonsPkg/Strings.uni8
-rw-r--r--Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dec38
-rw-r--r--Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dsc68
6 files changed, 454 insertions, 0 deletions
diff --git a/Lessons/Lesson_50/README.md b/Lessons/Lesson_50/README.md
new file mode 100644
index 0000000..686a528
--- /dev/null
+++ b/Lessons/Lesson_50/README.md
@@ -0,0 +1,256 @@
+In this lesson we would look at another method how your application can publish HII String packages. This time we would talk about embedding HII data in the resulting EFI file PE/COFF resources.
+
+# Create application
+
+As usual create new application:
+```
+./createNewApp.sh HIIStringsUNIRC
+```
+
+Add it to our DSC package file UefiLessonsPkg/UefiLessonsPkg.dsc:
+```
+[Components]
+ ...
+ UefiLessonsPkg/HIIStringsUNI/HIIStringsUNI.inf
+```
+
+As last time, we would need a GUID for our package list, declare it in package DEC file UefiLessonsPkg/UefiLessonsPkg.dec:
+```
+[Guids]
+ ...
+ gHIIStringsUNIRCGuid = { 0x785693b4, 0x623e, 0x40fa, { 0x9a, 0x45, 0x68, 0xda, 0x38, 0x30, 0x89, 0xdd }}
+```
+
+Now modify application files to be similar to the `HIIStringsUNI` app. You'll need to create `Strings.uni` file and modify application INF and *.c file:
+- `UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC.inf`
+- `UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC.c`
+- `UefiLessonsPkg/HIIStringsUNIRC/Strings.uni`
+
+In the end you should have the same result as the `HIIStringsUNI` app:
+```
+FS0:\> HIIStringsUNIRC.efi
+en-US ID=1: English
+en-US ID=2: Hello!
+en-US ID=3: Bye!
+fr-FR ID=1: Francais
+fr-FR ID=2: Bonjour!
+fr-FR ID=3: Au revoir!
+Best language ID=1: English
+Best language ID=2: Hello!
+Best language ID=3: Bye!
+fr ID=3: Au revoir!
+```
+
+Now we'are ready for modifications.
+
+# UEFI_HII_RESOURCE_SECTION
+
+Add this to the `UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC.inf`:
+```
+[Defines]
+ ...
+ UEFI_HII_RESOURCE_SECTION = TRUE
+```
+
+`UEFI_HII_RESOURCE_SECTION` flag specifies whether HII resource section is generated into PE image.
+
+Now you wouldn't be able to build our application because of the error:
+```
+UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC.c:15:42: error: ‘HIIStringsUNIRCStrings’ undeclared (first use in this function);
+```
+
+If you'll look at the `Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC/DEBUG/HIIStringsUNIRCStrDefs.h` you'll see that this file still contains string tokens, but the `HIIStringsUNIRCStrings` is no longer here:
+
+And `AutoGen.c` file no longer contains `HIIStringsUNIRCStrings` array initialization code (`Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC/DEBUG/AutoGen.c`).
+
+Now our strings directly encoded into the special section of the resulting *.efi image.
+
+To get them we need to search for a protocol `EFI_HII_PACKAGE_LIST_PROTOCOL` in the application `EFI_HANDLE ImageHandle`.
+
+Here is relevant content from UEFI specification for the `EFI_BOOT_SERVICES.LoadImage()` function which shell uses to load every program:
+```
+Once the image is loaded, LoadImage() installs EFI_HII_PACKAGE_LIST_PROTOCOL on the handle if
+the image contains a custom PE/COFF resource with the type 'HII'. The protocol's interface pointer points
+to the HII package list which is contained in the resource's data
+```
+
+The `EFI_HII_PACKAGE_LIST_PROTOCOL` is identified by the `gEfiHiiPackageListProtocolGuid` from the https://github.com/tianocore/edk2/blob/master/MdePkg/MdePkg.dec:
+```
+[Protocols]
+ ...
+ ## Include/Protocol/HiiPackageList.h
+ gEfiHiiPackageListProtocolGuid = { 0x6a1ee763, 0xd47a, 0x43b4, {0xaa, 0xbe, 0xef, 0x1d, 0xe2, 0xab, 0x56, 0xfc}}
+```
+
+As we already have `MdeModulePkg/MdeModulePkg.dec` in the `[Packages]` section of our INF file, all we need to do is add this GUID to the `[Protocols]` section:
+```
+[Protocols]
+ gEfiHiiPackageListProtocolGuid
+```
+
+In the code we could aquire `PackageList` protocol from the application `ImageHandle` with a help of `OpenProtocol` UEFI boot service:
+```
+...
+
+EFI_STATUS
+EFIAPI
+UefiMain (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_HII_PACKAGE_LIST_HEADER *PackageList;
+ //
+ // Retrieve HII package list from ImageHandle.
+ //
+ Status = gBS->OpenProtocol (
+ ImageHandle,
+ &gEfiHiiPackageListProtocolGuid,
+ (VOID **)&PackageList,
+ ImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ Print(L"Error! Can't open EFI_HII_PACKAGE_LIST_PROTOCOL\n");
+ return Status;
+ }
+ ...
+```
+
+The resulting `PackageList` is not only String packages with some size header from the `StrGather` script like in was in the case of `HIIStringsUNI` application. It is an ordinary Package list like the one that we've manually constructed in our `HIIStringsC` application.
+So instead of using `HiiAddPackages` library function we need to use `EFI_HII_DATABASE_PROTOCOL.NewPackageList()` directly:
+```
+EFI_HII_HANDLE Handle;
+Status = gHiiDatabase->NewPackageList(gHiiDatabase, PackageList, NULL, &Handle);
+if (EFI_ERROR(Status))
+{
+ Print(L"Can't register HII Package list %g, status = %r\n", gHIIStringsUNIRCGuid, Status);
+ return Status;
+}
+```
+
+Here I've used `gHiiDatabase`, so don't forget to add necessary header ```#include <Library/UefiHiiServicesLib.h>```and add `UefiHiiServicesLib` to the Library classes in the application INF file:
+```
+[LibraryClasses]
+ ...
+ UefiHiiServicesLib
+```
+
+Now you can build and verify that everything is ok:
+```
+FS0:\> HIIStringsUNIRC.efi
+Status = Success
+en-US ID=1: English
+en-US ID=2: Hello!
+en-US ID=3: Bye!
+fr-FR ID=1: Francais
+fr-FR ID=2: Bonjour!
+fr-FR ID=3: Au revoir!
+Best language ID=1: English
+Best language ID=2: Hello!
+Best language ID=3: Bye!
+fr ID=3: Au revoir!
+```
+
+# PE/COFF resource with the type 'HII'
+
+Let's use `objdump` utility to look at the application headers. You can output content of all headers with the `-x` option:
+```
+objdump -x Build/UefiLessonsPkg/RELEASE_GCC5/X64/HIIStringsUNIRC.efi
+```
+
+Pay attention to these things:
+```
+...
+
+The Data Directory
+Entry 0 0000000000000000 00000000 Export Directory [.edata (or where ever we found it)]
+Entry 1 0000000000000000 00000000 Import Directory [parts of .idata]
+Entry 2 00000000000023c0 00000180 Resource Directory [.rsrc] <---------- Resource Directory has data
+Entry 3 0000000000000000 00000000 Exception Directory [.pdata]
+Entry 4 0000000000000000 00000000 Security Directory
+Entry 5 0000000000000000 00000000 Base Relocation Directory [.reloc]
+Entry 6 00000000000022cc 0000001c Debug Directory
+Entry 7 0000000000000000 00000000 Description Directory
+Entry 8 0000000000000000 00000000 Special Directory
+Entry 9 0000000000000000 00000000 Thread Storage Directory [.tls]
+Entry a 0000000000000000 00000000 Load Configuration Directory
+Entry b 0000000000000000 00000000 Bound Import Directory
+Entry c 0000000000000000 00000000 Import Address Table Directory
+Entry d 0000000000000000 00000000 Delay Import Directory
+Entry e 0000000000000000 00000000 CLR Runtime Header
+Entry f 0000000000000000 00000000 Reserved
+
+...
+
+The .rsrc Resource Directory section:
+000 Type Table: Char: 0, Time: 00000000, Ver: 0/0, Num Names: 1, IDs: 0
+010 Entry: name: [val: 80000048 len 3]: HII, Value: 0x80000018 <--------- Data has type HII
+018 Name Table: Char: 0, Time: 00000000, Ver: 0/0, Num Names: 1, IDs: 0
+028 Entry: name: [val: 80000050 len 3]: EFI, Value: 0x80000030
+030 Language Table: Char: 0, Time: 00000000, Ver: 0/0, Num Names: 1, IDs: 0
+040 Entry: name: [val: 80000058 len 3]: BIN, Value: 0x000060
+060 Leaf: Addr: 0x002430, Size: 0x0000ea, Codepage: 0
+ String table starts at offset: 0x48
+ Resources start at offset: 0x70
+
+Sections:
+Idx Name Size VMA LMA File off Algn
+ 0 .text 00001fc0 0000000000000240 0000000000000240 00000240 2**4
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 1 .data 000001c0 0000000000002200 0000000000002200 00002200 2**4
+ CONTENTS, ALLOC, LOAD, DATA
+ 2 .rsrc 00000180 00000000000023c0 00000000000023c0 000023c0 2**2 <----- .rsrc is displayed here as well
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+SYMBOL TABLE:
+no symbols
+```
+
+Now comment `UEFI_HII_RESOURCE_SECTION` in the `UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC.inf`:
+```
+[Defines]
+ ...
+ #UEFI_HII_RESOURCE_SECTION = TRUE
+```
+Build application and execute `objdump` once again:
+```
+...
+
+The Data Directory
+Entry 0 0000000000000000 00000000 Export Directory [.edata (or where ever we found it)]
+Entry 1 0000000000000000 00000000 Import Directory [parts of .idata]
+Entry 2 0000000000000000 00000000 Resource Directory [.rsrc] <----- Resource directory is empty
+Entry 3 0000000000000000 00000000 Exception Directory [.pdata]
+Entry 4 0000000000000000 00000000 Security Directory
+Entry 5 0000000000000000 00000000 Base Relocation Directory [.reloc]
+Entry 6 00000000000022cc 0000001c Debug Directory
+Entry 7 0000000000000000 00000000 Description Directory
+Entry 8 0000000000000000 00000000 Special Directory
+Entry 9 0000000000000000 00000000 Thread Storage Directory [.tls]
+Entry a 0000000000000000 00000000 Load Configuration Directory
+Entry b 0000000000000000 00000000 Bound Import Directory
+Entry c 0000000000000000 00000000 Import Address Table Directory
+Entry d 0000000000000000 00000000 Delay Import Directory
+Entry e 0000000000000000 00000000 CLR Runtime Header
+Entry f 0000000000000000 00000000 Reserved
+
+... <----- No .rsrc Resource Directory section
+
+Sections:
+Idx Name Size VMA LMA File off Algn
+ 0 .text 00001fc0 0000000000000240 0000000000000240 00000240 2**4
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 1 .data 000001c0 0000000000002200 0000000000002200 00002200 2**4 <---- No .rsrc section here as well
+ CONTENTS, ALLOC, LOAD, DATA
+SYMBOL TABLE:
+no symbols
+```
+
+If you try to execute this version of our application you would get:
+```
+FS0:\> HIIStringsUNIRC.efi
+Error! Can't open EFI_HII_PACKAGE_LIST_PROTOCOL
+```
+
diff --git a/Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.c b/Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.c
new file mode 100644
index 0000000..39efbc5
--- /dev/null
+++ b/Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.c
@@ -0,0 +1,54 @@
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+#include <Library/HiiLib.h>
+#include <Library/UefiHiiServicesLib.h>
+
+EFI_STATUS
+EFIAPI
+UefiMain (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_HII_PACKAGE_LIST_HEADER *PackageList;
+ //
+ // Retrieve HII package list from ImageHandle.
+ //
+ Status = gBS->OpenProtocol (
+ ImageHandle,
+ &gEfiHiiPackageListProtocolGuid,
+ (VOID **)&PackageList,
+ ImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ Print(L"Error! Can't open EFI_HII_PACKAGE_LIST_PROTOCOL\n");
+ return Status;
+ }
+
+ EFI_HII_HANDLE Handle;
+ Status = gHiiDatabase->NewPackageList(gHiiDatabase, PackageList, NULL, &Handle);
+ if (EFI_ERROR(Status))
+ {
+ Print(L"Can't register HII Package list %g, status = %r\n", gHIIStringsUNIRCGuid, Status);
+ return Status;
+ }
+
+ Print(L"en-US ID=1: %s\n", HiiGetString(Handle, 1, "en-US"));
+ Print(L"en-US ID=2: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_HELLO), "en-US"));
+ Print(L"en-US ID=3: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_BYE), "en-US"));
+ Print(L"fr-FR ID=1: %s\n", HiiGetString(Handle, 1, "fr-FR"));
+ Print(L"fr-FR ID=2: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_HELLO), "fr-FR"));
+ Print(L"fr-FR ID=3: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_BYE), "fr-FR"));
+
+ Print(L"Best language ID=1: %s\n", HiiGetString(Handle, 1, NULL));
+ Print(L"Best language ID=2: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_HELLO), NULL));
+ Print(L"Best language ID=3: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_BYE), NULL));
+
+ Print(L"fr ID=3: %s\n", HiiGetString(Handle, STRING_TOKEN(STR_BYE), "fr"));
+
+ return EFI_SUCCESS;
+}
diff --git a/Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.inf b/Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.inf
new file mode 100644
index 0000000..c31e19d
--- /dev/null
+++ b/Lessons/Lesson_50/UefiLessonsPkg/HIIStringsUNIRC.inf
@@ -0,0 +1,30 @@
+[Defines]
+ INF_VERSION = 1.25
+ BASE_NAME = HIIStringsUNIRC
+ FILE_GUID = f8dc4b7a-8c6d-4a16-b2a1-03682db32bfd
+ MODULE_TYPE = UEFI_APPLICATION
+ VERSION_STRING = 1.0
+ ENTRY_POINT = UefiMain
+ UEFI_HII_RESOURCE_SECTION = TRUE
+
+[Sources]
+ HIIStringsUNIRC.c
+ Strings.uni
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ UefiLessonsPkg/UefiLessonsPkg.dec
+
+[LibraryClasses]
+ UefiApplicationEntryPoint
+ UefiLib
+ HiiLib
+ UefiHiiServicesLib
+
+[Protocols]
+ gEfiHiiPackageListProtocolGuid
+
+[Guids]
+ gHIIStringsUNIRCGuid
+
diff --git a/Lessons/Lesson_50/UefiLessonsPkg/Strings.uni b/Lessons/Lesson_50/UefiLessonsPkg/Strings.uni
new file mode 100644
index 0000000..2bce7e3
--- /dev/null
+++ b/Lessons/Lesson_50/UefiLessonsPkg/Strings.uni
@@ -0,0 +1,8 @@
+#langdef en-US "English"
+#langdef fr-FR "Francais"
+
+#string STR_HELLO #language en-US "Hello!"
+ #language fr-FR "Bonjour!"
+
+#string STR_BYE #language en-US "Bye!"
+ #language fr-FR "Au revoir!"
diff --git a/Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dec b/Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dec
new file mode 100644
index 0000000..2f9f3e2
--- /dev/null
+++ b/Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dec
@@ -0,0 +1,38 @@
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+ PACKAGE_NAME = UefiLessonsPkg
+ PACKAGE_GUID = 7e7edbba-ca2c-4177-a3f0-d3371358773a
+ PACKAGE_VERSION = 1.01
+
+[Includes]
+ Include
+
+[Guids]
+ # FILE_GUID as defined in UefiLessonsPkg/HelloWorld/HelloWorld.inf
+ gHelloWorldFileGuid = {0x2e55fa38, 0xf148, 0x42d3, {0xaf, 0x90, 0x1b, 0xe2, 0x47, 0x32, 0x3e, 0x30}}
+ gUefiLessonsPkgTokenSpaceGuid = {0x150cab53, 0xad47, 0x4385, {0xb5, 0xdd, 0xbc, 0xfc, 0x76, 0xba, 0xca, 0xf0}}
+ gHIIStringsCGuid = { 0x8e0b8ed3, 0x14f7, 0x499d, { 0xa2, 0x24, 0xae, 0xe8, 0x9d, 0xc9, 0x7f, 0xa3 }}
+ gHIIStringsUNIGuid = { 0x6ee19058, 0x0fe2, 0x44ed, { 0x89, 0x1c, 0xa5, 0xd7, 0xe1, 0x08, 0xee, 0x1a }}
+ gHIIStringsUNIRCGuid = { 0x785693b4, 0x623e, 0x40fa, { 0x9a, 0x45, 0x68, 0xda, 0x38, 0x30, 0x89, 0xdd }}
+
+[Protocols]
+ gSimpleClassProtocolGuid = { 0xb5510eea, 0x6f11, 0x4e4b, { 0xad, 0x0f, 0x35, 0xce, 0x17, 0xbd, 0x7a, 0x67 }}
+
+[PcdsFixedAtBuild]
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyVar32|42|UINT32|0x00000001
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyVar32_1|42|UINT32|0x00000002
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyVar32_2|42|UINT32|0x00000003
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyVarBool|FALSE|BOOLEAN|0x00000004
+
+[PcdsPatchableInModule]
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyPatchableVar32|0x31313131|UINT32|0x10000001
+
+[PcdsFeatureFlag]
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyFeatureFlagVar|FALSE|BOOLEAN|0x20000001
+
+[PcdsDynamic]
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyDynamicVar32|0x38323232|UINT32|0x30000001
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyDynamicVar32_1|42|UINT32|0x30000002
+
+[PcdsDynamicEx]
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyDynamicExVar32|0x38333333|UINT32|0x40000001
diff --git a/Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dsc b/Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dsc
new file mode 100644
index 0000000..6cf0ffc
--- /dev/null
+++ b/Lessons/Lesson_50/UefiLessonsPkg/UefiLessonsPkg.dsc
@@ -0,0 +1,68 @@
+[Defines]
+ DSC_SPECIFICATION = 0x0001001C
+ PLATFORM_GUID = 3db7270f-ffac-4139-90a4-0ae68f3f8167
+ PLATFORM_VERSION = 0.01
+ PLATFORM_NAME = UefiLessonsPkg
+ SKUID_IDENTIFIER = DEFAULT
+ SUPPORTED_ARCHITECTURES = X64
+ BUILD_TARGETS = RELEASE
+
+
+[LibraryClasses]
+ UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
+ UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
+ DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf
+ BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+ #PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+ RegisterFilterLib|MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf
+ PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+ DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
+ UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+ UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+ ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
+ ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
+ FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+ HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
+ SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+ UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
+ UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
+ #SimpleLibrary|UefiLessonsPkg/Library/SimpleLibrary/SimpleLibrary.inf
+ #SimpleLibrary|UefiLessonsPkg/Library/SimpleLibraryWithConstructor/SimpleLibraryWithConstructor.inf
+ SimpleLibrary|UefiLessonsPkg/Library/SimpleLibraryWithConstructorAndDestructor/SimpleLibraryWithConstructorAndDestructor.inf
+
+[Components]
+ UefiLessonsPkg/SimplestApp/SimplestApp.inf
+ UefiLessonsPkg/HelloWorld/HelloWorld.inf
+ UefiLessonsPkg/ImageHandle/ImageHandle.inf
+ UefiLessonsPkg/ImageInfo/ImageInfo.inf
+ UefiLessonsPkg/MemoryInfo/MemoryInfo.inf
+ UefiLessonsPkg/SimpleShellApp/SimpleShellApp.inf
+ UefiLessonsPkg/ListVariables/ListVariables.inf
+ UefiLessonsPkg/ShowBootVariables/ShowBootVariables.inf
+ UefiLessonsPkg/InteractiveApp/InteractiveApp.inf
+ UefiLessonsPkg/PCDLesson/PCDLesson.inf
+ UefiLessonsPkg/SmbiosInfo/SmbiosInfo.inf
+ UefiLessonsPkg/ShowTables/ShowTables.inf
+ UefiLessonsPkg/AcpiInfo/AcpiInfo.inf
+ UefiLessonsPkg/SaveBGRT/SaveBGRT.inf
+ UefiLessonsPkg/ListPCI/ListPCI.inf
+ UefiLessonsPkg/SimpleDriver/SimpleDriver.inf
+ UefiLessonsPkg/PCIRomInfo/PCIRomInfo.inf
+ UefiLessonsPkg/Library/SimpleLibrary/SimpleLibrary.inf
+ UefiLessonsPkg/Library/SimpleLibraryWithConstructor/SimpleLibraryWithConstructor.inf
+ UefiLessonsPkg/SimpleLibraryUser/SimpleLibraryUser.inf
+ UefiLessonsPkg/SimpleClassProtocol/SimpleClassProtocol.inf
+ UefiLessonsPkg/SimpleClassUser/SimpleClassUser.inf
+ UefiLessonsPkg/HotKeyDriver/HotKeyDriver.inf
+ UefiLessonsPkg/ShowHII/ShowHII.inf
+ UefiLessonsPkg/HIIStringsC/HIIStringsC.inf
+ UefiLessonsPkg/HIIStringsUNI/HIIStringsUNI.inf
+ UefiLessonsPkg/HIIStringsUNIRC/HIIStringsUNIRC.inf
+
+[PcdsFixedAtBuild]
+ gUefiLessonsPkgTokenSpaceGuid.PcdMyVar32_2|44
+