aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lessons/Lesson_45/Package_list.pngbin0 -> 20268 bytes
-rw-r--r--Lessons/Lesson_45/README.md160
-rw-r--r--Lessons/Lesson_45/StringPackage.vpd1
-rw-r--r--Lessons/Lesson_45/String_package.pngbin0 -> 19441 bytes
-rw-r--r--Lessons/Lesson_45/UCS2_String_block.pngbin0 -> 16836 bytes
-rw-r--r--README.md1
6 files changed, 162 insertions, 0 deletions
diff --git a/Lessons/Lesson_45/Package_list.png b/Lessons/Lesson_45/Package_list.png
new file mode 100644
index 0000000..5ab7c9d
--- /dev/null
+++ b/Lessons/Lesson_45/Package_list.png
Binary files differ
diff --git a/Lessons/Lesson_45/README.md b/Lessons/Lesson_45/README.md
new file mode 100644
index 0000000..a3f2b78
--- /dev/null
+++ b/Lessons/Lesson_45/README.md
@@ -0,0 +1,160 @@
+Let's look one more time at the output of our `ShowHII` application:
+```
+FS0:\> ShowHII.efi
+PackageList[0]: GUID=A487A478-51EF-48AA-8794-7BEE2A0562F1; size=0x1ADC
+ Package[0]: type=STRINGS; size=0x1AC4
+ Package[1]: type=END; size=0x4
+PackageList[1]: GUID=19618BCE-55AE-09C6-37E9-4CE04084C7A1; size=0x21E4
+ Package[0]: type=STRINGS; size=0x21CC
+ Package[1]: type=END; size=0x4
+PackageList[2]: GUID=2F30DA26-F51B-4B6F-85C4-31873C281BCA; size=0xA93
+ Package[0]: type=STRINGS; size=0xA7B
+ Package[1]: type=END; size=0x4
+PackageList[3]: GUID=F74D20EE-37E7-48FC-97F7-9B1047749C69; size=0x2EE9
+ Package[0]: type=IMAGES; size=0x2ED1
+ Package[1]: type=END; size=0x4
+PackageList[4]: GUID=EBF8ED7C-0DD1-4787-84F1-F48D537DCACF; size=0x46C
+ Package[0]: type=FORMS; size=0x82
+ Package[1]: type=FORMS; size=0x82
+ Package[2]: type=STRINGS; size=0x199
+ Package[3]: type=STRINGS; size=0x19B
+ Package[4]: type=DEVICE_PATH; size=0x1C
+ Package[5]: type=END; size=0x4
+PackageList[5]: GUID=FE561596-E6BF-41A6-8376-C72B719874D0; size=0x93F
+ Package[0]: type=FORMS; size=0xF5
+ Package[1]: type=STRINGS; size=0x40A
+ Package[2]: type=STRINGS; size=0x40C
+ Package[3]: type=DEVICE_PATH; size=0x1C
+ Package[4]: type=END; size=0x4
+PackageList[6]: GUID=2A46715F-3581-4A55-8E73-2B769AAA30C5; size=0x6B0
+ Package[0]: type=FORMS; size=0x143
+ Package[1]: type=STRINGS; size=0x539
+ Package[2]: type=DEVICE_PATH; size=0x1C
+ Package[3]: type=END; size=0x4
+PackageList[7]: GUID=99FDC8FD-849B-4EBA-AD13-FB9699C90A4D; size=0x6FE
+ Package[0]: type=STRINGS; size=0x340
+ Package[1]: type=STRINGS; size=0x3A6
+ Package[2]: type=END; size=0x4
+PackageList[8]: GUID=E38C1029-E38F-45B9-8F0D-E2E60BC9B262; size=0x15DA
+ Package[0]: type=STRINGS; size=0xA88
+ Package[1]: type=STRINGS; size=0xB3A
+ Package[2]: type=END; size=0x4
+PackageList[9]: GUID=D9DCC5DF-4007-435E-9098-8970935504B2; size=0x855
+ Package[0]: type=FORMS; size=0x1F6
+ Package[1]: type=STRINGS; size=0x62B
+ Package[2]: type=DEVICE_PATH; size=0x1C
+ Package[3]: type=END; size=0x4
+PackageList[10]: GUID=F5F219D3-7006-4648-AC8D-D61DFB7BC6AD; size=0x14EC
+ Package[0]: type=SIMPLE_FONTS; size=0x14D4
+ Package[1]: type=END; size=0x4
+PackageList[11]: GUID=4B47D616-A8D6-4552-9D44-CCAD2E0F4CF9; size=0x6AC8
+ Package[0]: type=FORMS; size=0x1030
+ Package[1]: type=STRINGS; size=0x3C99
+ Package[2]: type=STRINGS; size=0x1DCB
+ Package[3]: type=DEVICE_PATH; size=0x1C
+ Package[4]: type=END; size=0x4
+PackageList[12]: GUID=F95A7CCC-4C55-4426-A7B4-DC8961950BAE; size=0x13909
+ Package[0]: type=STRINGS; size=0x138F1
+ Package[1]: type=END; size=0x4
+PackageList[13]: GUID=DEC5DAA4-6781-4820-9C63-A7B0E4F1DB31; size=0x8677
+ Package[0]: type=STRINGS; size=0x865F
+ Package[1]: type=END; size=0x4
+PackageList[14]: GUID=4344558D-4EF9-4725-B1E4-3376E8D6974F; size=0x83BD
+ Package[0]: type=STRINGS; size=0x83A5
+ Package[1]: type=END; size=0x4
+PackageList[15]: GUID=0AF0B742-63EC-45BD-8DB6-71AD7F2FE8E8; size=0xCB04
+ Package[0]: type=STRINGS; size=0xCAEC
+ Package[1]: type=END; size=0x4
+PackageList[16]: GUID=25F200AA-D3CB-470A-BF51-E7D162D22E6F; size=0x1D3D7
+ Package[0]: type=STRINGS; size=0x1D3BF
+ Package[1]: type=END; size=0x4
+PackageList[17]: GUID=5F5F605D-1583-4A2D-A6B2-EB12DAB4A2B6; size=0x3048
+ Package[0]: type=STRINGS; size=0x3030
+ Package[1]: type=END; size=0x4
+PackageList[18]: GUID=F3D301BB-F4A5-45A8-B0B7-FA999C6237AE; size=0x26B5
+ Package[0]: type=STRINGS; size=0x269D
+ Package[1]: type=END; size=0x4
+PackageList[19]: GUID=7C04A583-9E3E-4F1C-AD65-E05268D0B4D1; size=0x5CB
+ Package[0]: type=STRINGS; size=0x5B3
+ Package[1]: type=END; size=0x4
+```
+
+From this output you can see that each Package list contains one or more data packages and ends with a special `END` package.
+
+Ordinary package contains `EFI_HII_PACKAGE_HEADER` and data content. But the `END` package is simply a `EFI_HII_PACKAGE_HEADER` with a `Type` field set to `EFI_HII_PACKAGE_END`.
+
+Just in case here are prototypes for the header structures once again:
+```
+typedef struct {
+ EFI_GUID PackageListGuid;
+ UINT32 PackagLength;
+} EFI_HII_PACKAGE_LIST_HEADER;
+
+typedef struct {
+ UINT32 Length:24;
+ UINT32 Type:8;
+ UINT8 Data[ … ];
+} EFI_HII_PACKAGE_HEADER;
+```
+
+So basically package list data here looks something like this:
+
+![Package_list](Package_list.png?raw=true "Package list")
+
+
+Ordinary packages can be of different types. In this lesson we would look at the string package.
+
+# String package
+
+String package is a set of strings in one language. Each of the strings in package can be referred by ID. IDs to these strings are not written anywhere but it is supposed that numbering scheme simply starts from ID=1 in every string package and increases by 1 on every string [there are some exceptions, but it is not important now].
+
+The general idea is to create String packages for each language you want to support for these piece of interface. In every of these language string packages the same words should have the same ID. For example:
+```
+ String package (ENG) String package (FR)
+ ___________________ ___________________
+
+ID=1 ... ...
+
+ ... ...
+
+ID=5 Hello! Bonjour!
+
+ ... ...
+```
+
+In the code strings from the Package list are received from the `(ID, language)` combination. This helps to create UIs that could switch translations easily.
+
+# String package content
+
+String package strarts with a header `EFI_HII_STRING_PACKAGE_HDR` and then contains so called `String blocks`, which can be of different types. And as with the package list, the last element (=String block) has special `END` type.
+
+![String_package](String_package.png?raw=true "String package")
+
+The most important and most common type of String block is UCS2 String block. It contains header which points String block type and a CHAR16 string as a block data. Basically String package is a set of UCS2 String blocks each of which contains one string.
+
+![UCS2_String_block](UCS2_String_block.png?raw=true "UCS2 String block")
+
+
+# Create String package
+
+```
+Prototype:
+typedef struct _EFI_HII_STRING_PACKAGE_HDR {
+ EFI_HII_PACKAGE_HEADER Header;
+ UINT32 HdrSize;
+ UINT32 StringInfoOffset;
+ CHAR16 LanguageWindow[16];
+ EFI_STRING_ID LanguageName;
+ CHAR8 Language[ … ];
+} EFI_HII_STRING_PACKAGE_HDR;
+
+Members:
+Header The standard package header, where Header.Type = EFI_HII_PACKAGE_STRINGS.
+HdrSize Size of this header.
+StringInfoOffset Offset, relative to the start of this header, of the string information.
+LanguageWindow Specifies the default values placed in the static and dynamic windows
+ before processing each SCSU-encoded string.
+LanguageName String identifier within the current string package of the full name of the
+ language specified by Language.
+Language The null-terminated ASCII string that specifies the language of the strings in the package.
+```
diff --git a/Lessons/Lesson_45/StringPackage.vpd b/Lessons/Lesson_45/StringPackage.vpd
new file mode 100644
index 0000000..dadf41f
--- /dev/null
+++ b/Lessons/Lesson_45/StringPackage.vpd
@@ -0,0 +1 @@
+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13WXH115 \ No newline at end of file
diff --git a/Lessons/Lesson_45/String_package.png b/Lessons/Lesson_45/String_package.png
new file mode 100644
index 0000000..c133901
--- /dev/null
+++ b/Lessons/Lesson_45/String_package.png
Binary files differ
diff --git a/Lessons/Lesson_45/UCS2_String_block.png b/Lessons/Lesson_45/UCS2_String_block.png
new file mode 100644
index 0000000..bbeaa90
--- /dev/null
+++ b/Lessons/Lesson_45/UCS2_String_block.png
Binary files differ
diff --git a/README.md b/README.md
index dede06e..ce944e9 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,7 @@ These series of lessons are intendend to get you started with UEFI programming i
- [Lesson 42](Lessons/Lesson_42): Debug your drivers/applications and OVMF itself with GDB
- [Lesson 43](Lessons/Lesson_43): Intro to the HII. Create an application to display HII database content
- [Lesson 44](Lessons/Lesson_44): HII database internals
+- [Lesson 45](Lessons/Lesson_45): Intro to HII strings packages. Create package list with translation strings by hand
_____