1 /** @file
2   This file defines the encoding for the VFR (Visual Form Representation) language.
3   IFR is primarily consumed by the EFI presentation engine, and produced by EFI
4   internal application and drivers as well as all add-in card option-ROM drivers
5 
6 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
7 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
8 SPDX-License-Identifier: BSD-2-Clause-Patent
9 
10   @par Revision Reference:
11   These definitions are from UEFI 2.1 and 2.2.
12 
13 **/
14 
15 #ifndef __UEFI_INTERNAL_FORMREPRESENTATION_H__
16 #define __UEFI_INTERNAL_FORMREPRESENTATION_H__
17 
18 #include <Guid/HiiFormMapMethodGuid.h>
19 
20 ///
21 /// The following types are currently defined:
22 ///
23 typedef VOID*   EFI_HII_HANDLE;
24 typedef CHAR16* EFI_STRING;
25 typedef UINT16  EFI_IMAGE_ID;
26 typedef UINT16  EFI_QUESTION_ID;
27 typedef UINT16  EFI_STRING_ID;
28 typedef UINT16  EFI_FORM_ID;
29 typedef UINT16  EFI_VARSTORE_ID;
30 typedef UINT16  EFI_ANIMATION_ID;
31 
32 typedef UINT16  EFI_DEFAULT_ID;
33 
34 typedef UINT32  EFI_HII_FONT_STYLE;
35 
36 #pragma pack(1)
37 
38 //
39 // Definitions for Package Lists and Package Headers
40 // Section 27.3.1
41 //
42 
43 ///
44 /// The header found at the start of each package list.
45 ///
46 typedef struct {
47   EFI_GUID               PackageListGuid;
48   UINT32                 PackageLength;
49 } EFI_HII_PACKAGE_LIST_HEADER;
50 
51 ///
52 /// The header found at the start of each package.
53 ///
54 typedef struct {
55   UINT32  Length:24;
56   UINT32  Type:8;
57   // UINT8  Data[...];
58 } EFI_HII_PACKAGE_HEADER;
59 
60 //
61 // Value of HII package type
62 //
63 #define EFI_HII_PACKAGE_TYPE_ALL             0x00
64 #define EFI_HII_PACKAGE_TYPE_GUID            0x01
65 #define EFI_HII_PACKAGE_FORMS                0x02
66 #define EFI_HII_PACKAGE_STRINGS              0x04
67 #define EFI_HII_PACKAGE_FONTS                0x05
68 #define EFI_HII_PACKAGE_IMAGES               0x06
69 #define EFI_HII_PACKAGE_SIMPLE_FONTS         0x07
70 #define EFI_HII_PACKAGE_DEVICE_PATH          0x08
71 #define EFI_HII_PACKAGE_KEYBOARD_LAYOUT      0x09
72 #define EFI_HII_PACKAGE_ANIMATIONS           0x0A
73 #define EFI_HII_PACKAGE_END                  0xDF
74 #define EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN    0xE0
75 #define EFI_HII_PACKAGE_TYPE_SYSTEM_END      0xFF
76 
77 //
78 // Definitions for Simplified Font Package
79 //
80 
81 ///
82 /// Contents of EFI_NARROW_GLYPH.Attributes.
83 ///@{
84 #define EFI_GLYPH_NON_SPACING                0x01
85 #define EFI_GLYPH_WIDE                       0x02
86 #define EFI_GLYPH_HEIGHT                     19
87 #define EFI_GLYPH_WIDTH                      8
88 ///@}
89 
90 ///
91 /// The EFI_NARROW_GLYPH has a preferred dimension (w x h) of 8 x 19 pixels.
92 ///
93 typedef struct {
94   ///
95   /// The Unicode representation of the glyph. The term weight is the
96   /// technical term for a character code.
97   ///
98   CHAR16                 UnicodeWeight;
99   ///
100   /// The data element containing the glyph definitions.
101   ///
102   UINT8                  Attributes;
103   ///
104   /// The column major glyph representation of the character. Bits
105   /// with values of one indicate that the corresponding pixel is to be
106   /// on when normally displayed; those with zero are off.
107   ///
108   UINT8                  GlyphCol1[EFI_GLYPH_HEIGHT];
109 } EFI_NARROW_GLYPH;
110 
111 ///
112 /// The EFI_WIDE_GLYPH has a preferred dimension (w x h) of 16 x 19 pixels, which is large enough
113 /// to accommodate logographic characters.
114 ///
115 typedef struct {
116   ///
117   /// The Unicode representation of the glyph. The term weight is the
118   /// technical term for a character code.
119   ///
120   CHAR16                 UnicodeWeight;
121   ///
122   /// The data element containing the glyph definitions.
123   ///
124   UINT8                  Attributes;
125   ///
126   /// The column major glyph representation of the character. Bits
127   /// with values of one indicate that the corresponding pixel is to be
128   /// on when normally displayed; those with zero are off.
129   ///
130   UINT8                  GlyphCol1[EFI_GLYPH_HEIGHT];
131   ///
132   /// The column major glyph representation of the character. Bits
133   /// with values of one indicate that the corresponding pixel is to be
134   /// on when normally displayed; those with zero are off.
135   ///
136   UINT8                  GlyphCol2[EFI_GLYPH_HEIGHT];
137   ///
138   /// Ensures that sizeof (EFI_WIDE_GLYPH) is twice the
139   /// sizeof (EFI_NARROW_GLYPH). The contents of Pad must
140   /// be zero.
141   ///
142   UINT8                  Pad[3];
143 } EFI_WIDE_GLYPH;
144 
145 ///
146 /// A simplified font package consists of a font header
147 /// followed by a series of glyph structures.
148 ///
149 typedef struct _EFI_HII_SIMPLE_FONT_PACKAGE_HDR {
150   EFI_HII_PACKAGE_HEADER Header;
151   UINT16                 NumberOfNarrowGlyphs;
152   UINT16                 NumberOfWideGlyphs;
153   // EFI_NARROW_GLYPH       NarrowGlyphs[];
154   // EFI_WIDE_GLYPH         WideGlyphs[];
155 } EFI_HII_SIMPLE_FONT_PACKAGE_HDR;
156 
157 //
158 // Definitions for Font Package
159 // Section 27.3.3
160 //
161 
162 //
163 // Value for font style
164 //
165 #define EFI_HII_FONT_STYLE_NORMAL            0x00000000
166 #define EFI_HII_FONT_STYLE_BOLD              0x00000001
167 #define EFI_HII_FONT_STYLE_ITALIC            0x00000002
168 #define EFI_HII_FONT_STYLE_EMBOSS            0x00010000
169 #define EFI_HII_FONT_STYLE_OUTLINE           0x00020000
170 #define EFI_HII_FONT_STYLE_SHADOW            0x00040000
171 #define EFI_HII_FONT_STYLE_UNDERLINE         0x00080000
172 #define EFI_HII_FONT_STYLE_DBL_UNDER         0x00100000
173 
174 typedef struct _EFI_HII_GLYPH_INFO {
175   UINT16                 Width;
176   UINT16                 Height;
177   INT16                  OffsetX;
178   INT16                  OffsetY;
179   INT16                  AdvanceX;
180 } EFI_HII_GLYPH_INFO;
181 
182 ///
183 /// The fixed header consists of a standard record header,
184 /// then the character values in this section, the flags
185 /// (including the encoding method) and the offsets of the glyph
186 /// information, the glyph bitmaps and the character map.
187 ///
188 typedef struct _EFI_HII_FONT_PACKAGE_HDR {
189   EFI_HII_PACKAGE_HEADER Header;
190   UINT32                 HdrSize;
191   UINT32                 GlyphBlockOffset;
192   EFI_HII_GLYPH_INFO     Cell;
193   EFI_HII_FONT_STYLE     FontStyle;
194   CHAR16                 FontFamily[1];
195 } EFI_HII_FONT_PACKAGE_HDR;
196 
197 //
198 // Value of different glyph info block types
199 //
200 #define EFI_HII_GIBT_END                  0x00
201 #define EFI_HII_GIBT_GLYPH                0x10
202 #define EFI_HII_GIBT_GLYPHS               0x11
203 #define EFI_HII_GIBT_GLYPH_DEFAULT        0x12
204 #define EFI_HII_GIBT_GLYPHS_DEFAULT       0x13
205 #define EFI_HII_GIBT_GLYPH_VARIABILITY    0x14
206 #define EFI_HII_GIBT_DUPLICATE            0x20
207 #define EFI_HII_GIBT_SKIP2                0x21
208 #define EFI_HII_GIBT_SKIP1                0x22
209 #define EFI_HII_GIBT_DEFAULTS             0x23
210 #define EFI_HII_GIBT_EXT1                 0x30
211 #define EFI_HII_GIBT_EXT2                 0x31
212 #define EFI_HII_GIBT_EXT4                 0x32
213 
214 typedef struct _EFI_HII_GLYPH_BLOCK {
215   UINT8                  BlockType;
216 } EFI_HII_GLYPH_BLOCK;
217 
218 //
219 // Definition of different glyph info block types
220 //
221 
222 typedef struct _EFI_HII_GIBT_DEFAULTS_BLOCK {
223   EFI_HII_GLYPH_BLOCK    Header;
224   EFI_HII_GLYPH_INFO     Cell;
225 } EFI_HII_GIBT_DEFAULTS_BLOCK;
226 
227 typedef struct _EFI_HII_GIBT_DUPLICATE_BLOCK {
228   EFI_HII_GLYPH_BLOCK    Header;
229   CHAR16                 CharValue;
230 } EFI_HII_GIBT_DUPLICATE_BLOCK;
231 
232 typedef struct _EFI_GLYPH_GIBT_END_BLOCK {
233   EFI_HII_GLYPH_BLOCK    Header;
234 } EFI_GLYPH_GIBT_END_BLOCK;
235 
236 typedef struct _EFI_HII_GIBT_EXT1_BLOCK {
237   EFI_HII_GLYPH_BLOCK    Header;
238   UINT8                  BlockType2;
239   UINT8                  Length;
240 } EFI_HII_GIBT_EXT1_BLOCK;
241 
242 typedef struct _EFI_HII_GIBT_EXT2_BLOCK {
243   EFI_HII_GLYPH_BLOCK    Header;
244   UINT8                  BlockType2;
245   UINT16                 Length;
246 } EFI_HII_GIBT_EXT2_BLOCK;
247 
248 typedef struct _EFI_HII_GIBT_EXT4_BLOCK {
249   EFI_HII_GLYPH_BLOCK    Header;
250   UINT8                  BlockType2;
251   UINT32                 Length;
252 } EFI_HII_GIBT_EXT4_BLOCK;
253 
254 typedef struct _EFI_HII_GIBT_GLYPH_BLOCK {
255   EFI_HII_GLYPH_BLOCK    Header;
256   EFI_HII_GLYPH_INFO     Cell;
257   UINT8                  BitmapData[1];
258 } EFI_HII_GIBT_GLYPH_BLOCK;
259 
260 typedef struct _EFI_HII_GIBT_GLYPHS_BLOCK {
261   EFI_HII_GLYPH_BLOCK    Header;
262   EFI_HII_GLYPH_INFO     Cell;
263   UINT16                 Count;
264   UINT8                  BitmapData[1];
265 } EFI_HII_GIBT_GLYPHS_BLOCK;
266 
267 typedef struct _EFI_HII_GIBT_GLYPH_DEFAULT_BLOCK {
268   EFI_HII_GLYPH_BLOCK    Header;
269   UINT8                  BitmapData[1];
270 } EFI_HII_GIBT_GLYPH_DEFAULT_BLOCK;
271 
272 typedef struct _EFI_HII_GIBT_GLYPHS_DEFAULT_BLOCK {
273   EFI_HII_GLYPH_BLOCK    Header;
274   UINT16                 Count;
275   UINT8                  BitmapData[1];
276 } EFI_HII_GIBT_GLYPHS_DEFAULT_BLOCK;
277 
278 typedef struct _EFI_HII_GIBT_VARIABILITY_BLOCK {
279   EFI_HII_GLYPH_BLOCK    Header;
280   EFI_HII_GLYPH_INFO     Cell;
281   UINT8                  GlyphPackInBits;
282   UINT8                  BitmapData [1];
283 } EFI_HII_GIBT_VARIABILITY_BLOCK;
284 
285 typedef struct _EFI_HII_GIBT_SKIP1_BLOCK {
286   EFI_HII_GLYPH_BLOCK    Header;
287   UINT8                  SkipCount;
288 } EFI_HII_GIBT_SKIP1_BLOCK;
289 
290 typedef struct _EFI_HII_GIBT_SKIP2_BLOCK {
291   EFI_HII_GLYPH_BLOCK    Header;
292   UINT16                 SkipCount;
293 } EFI_HII_GIBT_SKIP2_BLOCK;
294 
295 //
296 // Definitions for Device Path Package
297 // Section 27.3.4
298 //
299 
300 ///
301 /// The device path package is used to carry a device path
302 /// associated with the package list.
303 ///
304 typedef struct _EFI_HII_DEVICE_PATH_PACKAGE_HDR {
305   EFI_HII_PACKAGE_HEADER   Header;
306   // EFI_DEVICE_PATH_PROTOCOL DevicePath[];
307 } EFI_HII_DEVICE_PATH_PACKAGE_HDR;
308 
309 //
310 // Definitions for GUID Package
311 // Section 27.3.5
312 //
313 
314 ///
315 /// The GUID package is used to carry data where the format is defined by a GUID.
316 ///
317 typedef struct _EFI_HII_GUID_PACKAGE_HDR {
318   EFI_HII_PACKAGE_HEADER  Header;
319   EFI_GUID                Guid;
320   // Data per GUID definition may follow
321 } EFI_HII_GUID_PACKAGE_HDR;
322 
323 //
324 // Definitions for String Package
325 // Section 27.3.6
326 //
327 
328 #define UEFI_CONFIG_LANG   "x-UEFI"
329 #define UEFI_CONFIG_LANG_2 "x-i-UEFI"
330 
331 ///
332 /// The fixed header consists of a standard record header and then the string identifiers
333 /// contained in this section and the offsets of the string and language information.
334 ///
335 typedef struct _EFI_HII_STRING_PACKAGE_HDR {
336   EFI_HII_PACKAGE_HEADER  Header;
337   UINT32                  HdrSize;
338   UINT32                  StringInfoOffset;
339   CHAR16                  LanguageWindow[16];
340   EFI_STRING_ID           LanguageName;
341   CHAR8                   Language[1];
342 } EFI_HII_STRING_PACKAGE_HDR;
343 
344 typedef struct {
345   UINT8                   BlockType;
346 } EFI_HII_STRING_BLOCK;
347 
348 //
349 // Value of different string information block types
350 //
351 #define EFI_HII_SIBT_END                     0x00
352 #define EFI_HII_SIBT_STRING_SCSU             0x10
353 #define EFI_HII_SIBT_STRING_SCSU_FONT        0x11
354 #define EFI_HII_SIBT_STRINGS_SCSU            0x12
355 #define EFI_HII_SIBT_STRINGS_SCSU_FONT       0x13
356 #define EFI_HII_SIBT_STRING_UCS2             0x14
357 #define EFI_HII_SIBT_STRING_UCS2_FONT        0x15
358 #define EFI_HII_SIBT_STRINGS_UCS2            0x16
359 #define EFI_HII_SIBT_STRINGS_UCS2_FONT       0x17
360 #define EFI_HII_SIBT_DUPLICATE               0x20
361 #define EFI_HII_SIBT_SKIP2                   0x21
362 #define EFI_HII_SIBT_SKIP1                   0x22
363 #define EFI_HII_SIBT_EXT1                    0x30
364 #define EFI_HII_SIBT_EXT2                    0x31
365 #define EFI_HII_SIBT_EXT4                    0x32
366 #define EFI_HII_SIBT_FONT                    0x40
367 
368 //
369 // Definition of different string information block types
370 //
371 
372 typedef struct _EFI_HII_SIBT_DUPLICATE_BLOCK {
373   EFI_HII_STRING_BLOCK    Header;
374   EFI_STRING_ID           StringId;
375 } EFI_HII_SIBT_DUPLICATE_BLOCK;
376 
377 typedef struct _EFI_HII_SIBT_END_BLOCK {
378   EFI_HII_STRING_BLOCK    Header;
379 } EFI_HII_SIBT_END_BLOCK;
380 
381 typedef struct _EFI_HII_SIBT_EXT1_BLOCK {
382   EFI_HII_STRING_BLOCK    Header;
383   UINT8                   BlockType2;
384   UINT8                   Length;
385 } EFI_HII_SIBT_EXT1_BLOCK;
386 
387 typedef struct _EFI_HII_SIBT_EXT2_BLOCK {
388   EFI_HII_STRING_BLOCK    Header;
389   UINT8                   BlockType2;
390   UINT16                  Length;
391 } EFI_HII_SIBT_EXT2_BLOCK;
392 
393 typedef struct _EFI_HII_SIBT_EXT4_BLOCK {
394   EFI_HII_STRING_BLOCK    Header;
395   UINT8                   BlockType2;
396   UINT32                  Length;
397 } EFI_HII_SIBT_EXT4_BLOCK;
398 
399 typedef struct _EFI_HII_SIBT_FONT_BLOCK {
400   EFI_HII_SIBT_EXT2_BLOCK Header;
401   UINT8                   FontId;
402   UINT16                  FontSize;
403   EFI_HII_FONT_STYLE      FontStyle;
404   CHAR16                  FontName[1];
405 } EFI_HII_SIBT_FONT_BLOCK;
406 
407 typedef struct _EFI_HII_SIBT_SKIP1_BLOCK {
408   EFI_HII_STRING_BLOCK    Header;
409   UINT8                   SkipCount;
410 } EFI_HII_SIBT_SKIP1_BLOCK;
411 
412 typedef struct _EFI_HII_SIBT_SKIP2_BLOCK {
413   EFI_HII_STRING_BLOCK    Header;
414   UINT16                  SkipCount;
415 } EFI_HII_SIBT_SKIP2_BLOCK;
416 
417 typedef struct _EFI_HII_SIBT_STRING_SCSU_BLOCK {
418   EFI_HII_STRING_BLOCK    Header;
419   UINT8                   StringText[1];
420 } EFI_HII_SIBT_STRING_SCSU_BLOCK;
421 
422 typedef struct _EFI_HII_SIBT_STRING_SCSU_FONT_BLOCK {
423   EFI_HII_STRING_BLOCK    Header;
424   UINT8                   FontIdentifier;
425   UINT8                   StringText[1];
426 } EFI_HII_SIBT_STRING_SCSU_FONT_BLOCK;
427 
428 typedef struct _EFI_HII_SIBT_STRINGS_SCSU_BLOCK {
429   EFI_HII_STRING_BLOCK    Header;
430   UINT16                  StringCount;
431   UINT8                   StringText[1];
432 } EFI_HII_SIBT_STRINGS_SCSU_BLOCK;
433 
434 typedef struct _EFI_HII_SIBT_STRINGS_SCSU_FONT_BLOCK {
435   EFI_HII_STRING_BLOCK    Header;
436   UINT8                   FontIdentifier;
437   UINT16                  StringCount;
438   UINT8                   StringText[1];
439 } EFI_HII_SIBT_STRINGS_SCSU_FONT_BLOCK;
440 
441 typedef struct _EFI_HII_SIBT_STRING_UCS2_BLOCK {
442   EFI_HII_STRING_BLOCK    Header;
443   CHAR16                  StringText[1];
444 } EFI_HII_SIBT_STRING_UCS2_BLOCK;
445 
446 typedef struct _EFI_HII_SIBT_STRING_UCS2_FONT_BLOCK {
447   EFI_HII_STRING_BLOCK    Header;
448   UINT8                   FontIdentifier;
449   CHAR16                  StringText[1];
450 } EFI_HII_SIBT_STRING_UCS2_FONT_BLOCK;
451 
452 typedef struct _EFI_HII_SIBT_STRINGS_UCS2_BLOCK {
453   EFI_HII_STRING_BLOCK    Header;
454   UINT16                  StringCount;
455   CHAR16                  StringText[1];
456 } EFI_HII_SIBT_STRINGS_UCS2_BLOCK;
457 
458 typedef struct _EFI_HII_SIBT_STRINGS_UCS2_FONT_BLOCK {
459   EFI_HII_STRING_BLOCK    Header;
460   UINT8                   FontIdentifier;
461   UINT16                  StringCount;
462   CHAR16                  StringText[1];
463 } EFI_HII_SIBT_STRINGS_UCS2_FONT_BLOCK;
464 
465 //
466 // Definitions for Image Package
467 // Section 27.3.7
468 //
469 
470 typedef struct _EFI_HII_IMAGE_PACKAGE_HDR {
471   EFI_HII_PACKAGE_HEADER  Header;
472   UINT32                  ImageInfoOffset;
473   UINT32                  PaletteInfoOffset;
474 } EFI_HII_IMAGE_PACKAGE_HDR;
475 
476 typedef struct _EFI_HII_IMAGE_BLOCK {
477   UINT8                   BlockType;
478 } EFI_HII_IMAGE_BLOCK;
479 
480 //
481 // Value of different image information block types
482 //
483 #define EFI_HII_IIBT_END               0x00
484 #define EFI_HII_IIBT_IMAGE_1BIT        0x10
485 #define EFI_HII_IIBT_IMAGE_1BIT_TRANS  0x11
486 #define EFI_HII_IIBT_IMAGE_4BIT        0x12
487 #define EFI_HII_IIBT_IMAGE_4BIT_TRANS  0x13
488 #define EFI_HII_IIBT_IMAGE_8BIT        0x14
489 #define EFI_HII_IIBT_IMAGE_8BIT_TRANS  0x15
490 #define EFI_HII_IIBT_IMAGE_24BIT       0x16
491 #define EFI_HII_IIBT_IMAGE_24BIT_TRANS 0x17
492 #define EFI_HII_IIBT_IMAGE_JPEG        0x18
493 #define EFI_HII_IIBT_IMAGE_PNG         0x19
494 #define EFI_HII_IIBT_DUPLICATE         0x20
495 #define EFI_HII_IIBT_SKIP2             0x21
496 #define EFI_HII_IIBT_SKIP1             0x22
497 #define EFI_HII_IIBT_EXT1              0x30
498 #define EFI_HII_IIBT_EXT2              0x31
499 #define EFI_HII_IIBT_EXT4              0x32
500 
501 //
502 // Definition of different image information block types
503 //
504 
505 typedef struct _EFI_HII_IIBT_END_BLOCK {
506   EFI_HII_IMAGE_BLOCK          Header;
507 } EFI_HII_IIBT_END_BLOCK;
508 
509 typedef struct _EFI_HII_IIBT_EXT1_BLOCK {
510   EFI_HII_IMAGE_BLOCK          Header;
511   UINT8                        BlockType2;
512   UINT8                        Length;
513 } EFI_HII_IIBT_EXT1_BLOCK;
514 
515 typedef struct _EFI_HII_IIBT_EXT2_BLOCK {
516   EFI_HII_IMAGE_BLOCK          Header;
517   UINT8                        BlockType2;
518   UINT16                       Length;
519 } EFI_HII_IIBT_EXT2_BLOCK;
520 
521 typedef struct _EFI_HII_IIBT_EXT4_BLOCK {
522   EFI_HII_IMAGE_BLOCK          Header;
523   UINT8                        BlockType2;
524   UINT32                       Length;
525 } EFI_HII_IIBT_EXT4_BLOCK;
526 
527 typedef struct _EFI_HII_IIBT_IMAGE_1BIT_BASE {
528   UINT16                       Width;
529   UINT16                       Height;
530   UINT8                        Data[1];
531 } EFI_HII_IIBT_IMAGE_1BIT_BASE;
532 
533 typedef struct _EFI_HII_IIBT_IMAGE_1BIT_BLOCK {
534   EFI_HII_IMAGE_BLOCK          Header;
535   UINT8                        PaletteIndex;
536   EFI_HII_IIBT_IMAGE_1BIT_BASE Bitmap;
537 } EFI_HII_IIBT_IMAGE_1BIT_BLOCK;
538 
539 typedef struct _EFI_HII_IIBT_IMAGE_1BIT_TRANS_BLOCK {
540   EFI_HII_IMAGE_BLOCK          Header;
541   UINT8                        PaletteIndex;
542   EFI_HII_IIBT_IMAGE_1BIT_BASE Bitmap;
543 } EFI_HII_IIBT_IMAGE_1BIT_TRANS_BLOCK;
544 
545 typedef struct _EFI_HII_RGB_PIXEL {
546   UINT8                        b;
547   UINT8                        g;
548   UINT8                        r;
549 } EFI_HII_RGB_PIXEL;
550 
551 typedef struct _EFI_HII_IIBT_IMAGE_24BIT_BASE {
552   UINT16                       Width;
553   UINT16                       Height;
554   EFI_HII_RGB_PIXEL            Bitmap[1];
555 } EFI_HII_IIBT_IMAGE_24BIT_BASE;
556 
557 typedef struct _EFI_HII_IIBT_IMAGE_24BIT_BLOCK {
558   EFI_HII_IMAGE_BLOCK           Header;
559   EFI_HII_IIBT_IMAGE_24BIT_BASE Bitmap;
560 } EFI_HII_IIBT_IMAGE_24BIT_BLOCK;
561 
562 typedef struct _EFI_HII_IIBT_IMAGE_24BIT_TRANS_BLOCK {
563   EFI_HII_IMAGE_BLOCK           Header;
564   EFI_HII_IIBT_IMAGE_24BIT_BASE Bitmap;
565 } EFI_HII_IIBT_IMAGE_24BIT_TRANS_BLOCK;
566 
567 typedef struct _EFI_HII_IIBT_IMAGE_4BIT_BASE {
568   UINT16                       Width;
569   UINT16                       Height;
570   UINT8                        Data[1];
571 } EFI_HII_IIBT_IMAGE_4BIT_BASE;
572 
573 typedef struct _EFI_HII_IIBT_IMAGE_4BIT_BLOCK {
574   EFI_HII_IMAGE_BLOCK          Header;
575   UINT8                        PaletteIndex;
576   EFI_HII_IIBT_IMAGE_4BIT_BASE Bitmap;
577 } EFI_HII_IIBT_IMAGE_4BIT_BLOCK;
578 
579 typedef struct _EFI_HII_IIBT_IMAGE_4BIT_TRANS_BLOCK {
580   EFI_HII_IMAGE_BLOCK          Header;
581   UINT8                        PaletteIndex;
582   EFI_HII_IIBT_IMAGE_4BIT_BASE Bitmap;
583 } EFI_HII_IIBT_IMAGE_4BIT_TRANS_BLOCK;
584 
585 typedef struct _EFI_HII_IIBT_IMAGE_8BIT_BASE {
586   UINT16                       Width;
587   UINT16                       Height;
588   UINT8                        Data[1];
589 } EFI_HII_IIBT_IMAGE_8BIT_BASE;
590 
591 typedef struct _EFI_HII_IIBT_IMAGE_8BIT_PALETTE_BLOCK {
592   EFI_HII_IMAGE_BLOCK          Header;
593   UINT8                        PaletteIndex;
594   EFI_HII_IIBT_IMAGE_8BIT_BASE Bitmap;
595 } EFI_HII_IIBT_IMAGE_8BIT_BLOCK;
596 
597 typedef struct _EFI_HII_IIBT_IMAGE_8BIT_TRANS_BLOCK {
598   EFI_HII_IMAGE_BLOCK          Header;
599   UINT8                        PaletteIndex;
600   EFI_HII_IIBT_IMAGE_8BIT_BASE Bitmap;
601 } EFI_HII_IIBT_IMAGE_8BIT_TRAN_BLOCK;
602 
603 typedef struct _EFI_HII_IIBT_DUPLICATE_BLOCK {
604   EFI_HII_IMAGE_BLOCK          Header;
605   EFI_IMAGE_ID                 ImageId;
606 } EFI_HII_IIBT_DUPLICATE_BLOCK;
607 
608 typedef struct _EFI_HII_IIBT_JPEG_BLOCK {
609   EFI_HII_IMAGE_BLOCK          Header;
610   UINT32                       Size;
611   UINT8                        Data[1];
612 } EFI_HII_IIBT_JPEG_BLOCK;
613 
614 typedef struct _EFI_HII_IIBT_PNG_BLOCK {
615   EFI_HII_IMAGE_BLOCK          Header;
616   UINT32                       Size;
617   UINT8                        Data[1];
618 } EFI_HII_IIBT_PNG_BLOCK;
619 
620 typedef struct _EFI_HII_IIBT_SKIP1_BLOCK {
621   EFI_HII_IMAGE_BLOCK          Header;
622   UINT8                        SkipCount;
623 } EFI_HII_IIBT_SKIP1_BLOCK;
624 
625 typedef struct _EFI_HII_IIBT_SKIP2_BLOCK {
626   EFI_HII_IMAGE_BLOCK          Header;
627   UINT16                       SkipCount;
628 } EFI_HII_IIBT_SKIP2_BLOCK;
629 
630 //
631 // Definitions for Palette Information
632 //
633 
634 typedef struct _EFI_HII_IMAGE_PALETTE_INFO_HEADER {
635   UINT16                       PaletteCount;
636 } EFI_HII_IMAGE_PALETTE_INFO_HEADER;
637 
638 typedef struct _EFI_HII_IMAGE_PALETTE_INFO {
639   UINT16                       PaletteSize;
640   EFI_HII_RGB_PIXEL            PaletteValue[1];
641 } EFI_HII_IMAGE_PALETTE_INFO;
642 
643 //
644 // Definitions for Forms Package
645 // Section 27.3.8
646 //
647 
648 ///
649 /// The Form package is used to carry form-based encoding data.
650 ///
651 typedef struct _EFI_HII_FORM_PACKAGE_HDR {
652   EFI_HII_PACKAGE_HEADER       Header;
653   // EFI_IFR_OP_HEADER         OpCodeHeader;
654   // More op-codes follow
655 } EFI_HII_FORM_PACKAGE_HDR;
656 
657 typedef struct {
658   UINT8 Hour;
659   UINT8 Minute;
660   UINT8 Second;
661 } EFI_HII_TIME;
662 
663 typedef struct {
664   UINT16 Year;
665   UINT8  Month;
666   UINT8  Day;
667 } EFI_HII_DATE;
668 
669 typedef struct {
670   EFI_QUESTION_ID QuestionId;
671   EFI_FORM_ID     FormId;
672   EFI_GUID        FormSetGuid;
673   EFI_STRING_ID   DevicePath;
674 } EFI_HII_REF;
675 
676 typedef union {
677   UINT8           u8;
678   UINT16          u16;
679   UINT32          u32;
680   UINT64          u64;
681   BOOLEAN         b;
682   EFI_HII_TIME    time;
683   EFI_HII_DATE    date;
684   EFI_STRING_ID   string; ///< EFI_IFR_TYPE_STRING, EFI_IFR_TYPE_ACTION
685   EFI_HII_REF     ref;    ///< EFI_IFR_TYPE_REF
686   // UINT8 buffer[];      ///< EFI_IFR_TYPE_BUFFER
687 } EFI_IFR_TYPE_VALUE;
688 
689 //
690 // IFR Opcodes
691 //
692 #define EFI_IFR_FORM_OP                0x01
693 #define EFI_IFR_SUBTITLE_OP            0x02
694 #define EFI_IFR_TEXT_OP                0x03
695 #define EFI_IFR_IMAGE_OP               0x04
696 #define EFI_IFR_ONE_OF_OP              0x05
697 #define EFI_IFR_CHECKBOX_OP            0x06
698 #define EFI_IFR_NUMERIC_OP             0x07
699 #define EFI_IFR_PASSWORD_OP            0x08
700 #define EFI_IFR_ONE_OF_OPTION_OP       0x09
701 #define EFI_IFR_SUPPRESS_IF_OP         0x0A
702 #define EFI_IFR_LOCKED_OP              0x0B
703 #define EFI_IFR_ACTION_OP              0x0C
704 #define EFI_IFR_RESET_BUTTON_OP        0x0D
705 #define EFI_IFR_FORM_SET_OP            0x0E
706 #define EFI_IFR_REF_OP                 0x0F
707 #define EFI_IFR_NO_SUBMIT_IF_OP        0x10
708 #define EFI_IFR_INCONSISTENT_IF_OP     0x11
709 #define EFI_IFR_EQ_ID_VAL_OP           0x12
710 #define EFI_IFR_EQ_ID_ID_OP            0x13
711 #define EFI_IFR_EQ_ID_VAL_LIST_OP      0x14
712 #define EFI_IFR_AND_OP                 0x15
713 #define EFI_IFR_OR_OP                  0x16
714 #define EFI_IFR_NOT_OP                 0x17
715 #define EFI_IFR_RULE_OP                0x18
716 #define EFI_IFR_GRAY_OUT_IF_OP         0x19
717 #define EFI_IFR_DATE_OP                0x1A
718 #define EFI_IFR_TIME_OP                0x1B
719 #define EFI_IFR_STRING_OP              0x1C
720 #define EFI_IFR_REFRESH_OP             0x1D
721 #define EFI_IFR_DISABLE_IF_OP          0x1E
722 #define EFI_IFR_ANIMATION_OP           0x1F
723 #define EFI_IFR_TO_LOWER_OP            0x20
724 #define EFI_IFR_TO_UPPER_OP            0x21
725 #define EFI_IFR_MAP_OP                 0x22
726 #define EFI_IFR_ORDERED_LIST_OP        0x23
727 #define EFI_IFR_VARSTORE_OP            0x24
728 #define EFI_IFR_VARSTORE_NAME_VALUE_OP 0x25
729 #define EFI_IFR_VARSTORE_EFI_OP        0x26
730 #define EFI_IFR_VARSTORE_DEVICE_OP     0x27
731 #define EFI_IFR_VERSION_OP             0x28
732 #define EFI_IFR_END_OP                 0x29
733 #define EFI_IFR_MATCH_OP               0x2A
734 #define EFI_IFR_GET_OP                 0x2B
735 #define EFI_IFR_SET_OP                 0x2C
736 #define EFI_IFR_READ_OP                0x2D
737 #define EFI_IFR_WRITE_OP               0x2E
738 #define EFI_IFR_EQUAL_OP               0x2F
739 #define EFI_IFR_NOT_EQUAL_OP           0x30
740 #define EFI_IFR_GREATER_THAN_OP        0x31
741 #define EFI_IFR_GREATER_EQUAL_OP       0x32
742 #define EFI_IFR_LESS_THAN_OP           0x33
743 #define EFI_IFR_LESS_EQUAL_OP          0x34
744 #define EFI_IFR_BITWISE_AND_OP         0x35
745 #define EFI_IFR_BITWISE_OR_OP          0x36
746 #define EFI_IFR_BITWISE_NOT_OP         0x37
747 #define EFI_IFR_SHIFT_LEFT_OP          0x38
748 #define EFI_IFR_SHIFT_RIGHT_OP         0x39
749 #define EFI_IFR_ADD_OP                 0x3A
750 #define EFI_IFR_SUBTRACT_OP            0x3B
751 #define EFI_IFR_MULTIPLY_OP            0x3C
752 #define EFI_IFR_DIVIDE_OP              0x3D
753 #define EFI_IFR_MODULO_OP              0x3E
754 #define EFI_IFR_RULE_REF_OP            0x3F
755 #define EFI_IFR_QUESTION_REF1_OP       0x40
756 #define EFI_IFR_QUESTION_REF2_OP       0x41
757 #define EFI_IFR_UINT8_OP               0x42
758 #define EFI_IFR_UINT16_OP              0x43
759 #define EFI_IFR_UINT32_OP              0x44
760 #define EFI_IFR_UINT64_OP              0x45
761 #define EFI_IFR_TRUE_OP                0x46
762 #define EFI_IFR_FALSE_OP               0x47
763 #define EFI_IFR_TO_UINT_OP             0x48
764 #define EFI_IFR_TO_STRING_OP           0x49
765 #define EFI_IFR_TO_BOOLEAN_OP          0x4A
766 #define EFI_IFR_MID_OP                 0x4B
767 #define EFI_IFR_FIND_OP                0x4C
768 #define EFI_IFR_TOKEN_OP               0x4D
769 #define EFI_IFR_STRING_REF1_OP         0x4E
770 #define EFI_IFR_STRING_REF2_OP         0x4F
771 #define EFI_IFR_CONDITIONAL_OP         0x50
772 #define EFI_IFR_QUESTION_REF3_OP       0x51
773 #define EFI_IFR_ZERO_OP                0x52
774 #define EFI_IFR_ONE_OP                 0x53
775 #define EFI_IFR_ONES_OP                0x54
776 #define EFI_IFR_UNDEFINED_OP           0x55
777 #define EFI_IFR_LENGTH_OP              0x56
778 #define EFI_IFR_DUP_OP                 0x57
779 #define EFI_IFR_THIS_OP                0x58
780 #define EFI_IFR_SPAN_OP                0x59
781 #define EFI_IFR_VALUE_OP               0x5A
782 #define EFI_IFR_DEFAULT_OP             0x5B
783 #define EFI_IFR_DEFAULTSTORE_OP        0x5C
784 #define EFI_IFR_FORM_MAP_OP            0x5D
785 #define EFI_IFR_CATENATE_OP            0x5E
786 #define EFI_IFR_GUID_OP                0x5F
787 #define EFI_IFR_SECURITY_OP            0x60
788 #define EFI_IFR_MODAL_TAG_OP           0x61
789 #define EFI_IFR_REFRESH_ID_OP          0x62
790 #define EFI_IFR_WARNING_IF_OP          0x63
791 #define EFI_IFR_MATCH2_OP              0x64
792 
793 //
794 // Definitions of IFR Standard Headers
795 // Section 27.3.8.2
796 //
797 
798 typedef struct _EFI_IFR_OP_HEADER {
799   UINT8                    OpCode;
800   UINT8                    Length:7;
801   UINT8                    Scope:1;
802 } EFI_IFR_OP_HEADER;
803 
804 typedef struct _EFI_IFR_STATEMENT_HEADER {
805   EFI_STRING_ID            Prompt;
806   EFI_STRING_ID            Help;
807 } EFI_IFR_STATEMENT_HEADER;
808 
809 typedef struct _EFI_IFR_QUESTION_HEADER {
810   EFI_IFR_STATEMENT_HEADER Header;
811   EFI_QUESTION_ID          QuestionId;
812   EFI_VARSTORE_ID          VarStoreId;
813   union {
814     EFI_STRING_ID          VarName;
815     UINT16                 VarOffset;
816   }                        VarStoreInfo;
817   UINT8                    Flags;
818 } EFI_IFR_QUESTION_HEADER;
819 
820 //
821 // Flag values of EFI_IFR_QUESTION_HEADER
822 //
823 #define EFI_IFR_FLAG_READ_ONLY          0x01
824 #define EFI_IFR_FLAG_CALLBACK           0x04
825 #define EFI_IFR_FLAG_RESET_REQUIRED     0x10
826 #define EFI_IFR_FLAG_REST_STYLE         0x20
827 #define EFI_IFR_FLAG_RECONNECT_REQUIRED 0x40
828 #define EFI_IFR_FLAG_OPTIONS_ONLY       0x80
829 
830 //
831 // Definition for Opcode Reference
832 // Section 27.3.8.3
833 //
834 typedef struct _EFI_IFR_DEFAULTSTORE {
835   EFI_IFR_OP_HEADER        Header;
836   EFI_STRING_ID            DefaultName;
837   UINT16                   DefaultId;
838 } EFI_IFR_DEFAULTSTORE;
839 
840 //
841 // Default Identifier of default store
842 //
843 #define EFI_HII_DEFAULT_CLASS_STANDARD       0x0000
844 #define EFI_HII_DEFAULT_CLASS_MANUFACTURING  0x0001
845 #define EFI_HII_DEFAULT_CLASS_SAFE           0x0002
846 #define EFI_HII_DEFAULT_CLASS_PLATFORM_BEGIN 0x4000
847 #define EFI_HII_DEFAULT_CLASS_PLATFORM_END   0x7fff
848 #define EFI_HII_DEFAULT_CLASS_HARDWARE_BEGIN 0x8000
849 #define EFI_HII_DEFAULT_CLASS_HARDWARE_END   0xbfff
850 #define EFI_HII_DEFAULT_CLASS_FIRMWARE_BEGIN 0xc000
851 #define EFI_HII_DEFAULT_CLASS_FIRMWARE_END   0xffff
852 
853 typedef struct _EFI_IFR_VARSTORE {
854   EFI_IFR_OP_HEADER        Header;
855   EFI_GUID                 Guid;
856   EFI_VARSTORE_ID          VarStoreId;
857   UINT16                   Size;
858   UINT8                    Name[1];
859 } EFI_IFR_VARSTORE;
860 
861 typedef struct _EFI_IFR_VARSTORE_EFI {
862   EFI_IFR_OP_HEADER        Header;
863   EFI_VARSTORE_ID          VarStoreId;
864   EFI_GUID                 Guid;
865   UINT32                   Attributes;
866   UINT16                   Size;
867   UINT8                    Name[1];
868 } EFI_IFR_VARSTORE_EFI;
869 
870 typedef struct _EFI_IFR_VARSTORE_NAME_VALUE {
871   EFI_IFR_OP_HEADER        Header;
872   EFI_VARSTORE_ID          VarStoreId;
873   EFI_GUID                 Guid;
874 } EFI_IFR_VARSTORE_NAME_VALUE;
875 
876 typedef struct _EFI_IFR_FORM_SET {
877   EFI_IFR_OP_HEADER        Header;
878   EFI_GUID                 Guid;
879   EFI_STRING_ID            FormSetTitle;
880   EFI_STRING_ID            Help;
881   UINT8                    Flags;
882   // EFI_GUID              ClassGuid[];
883 } EFI_IFR_FORM_SET;
884 
885 typedef struct _EFI_IFR_END {
886   EFI_IFR_OP_HEADER        Header;
887 } EFI_IFR_END;
888 
889 typedef struct _EFI_IFR_FORM {
890   EFI_IFR_OP_HEADER        Header;
891   UINT16                   FormId;
892   EFI_STRING_ID            FormTitle;
893 } EFI_IFR_FORM;
894 
895 typedef struct _EFI_IFR_IMAGE {
896   EFI_IFR_OP_HEADER        Header;
897   EFI_IMAGE_ID             Id;
898 } EFI_IFR_IMAGE;
899 
900 typedef struct _EFI_IFR_MODAL_TAG {
901   EFI_IFR_OP_HEADER        Header;
902 } EFI_IFR_MODAL_TAG;
903 
904 typedef struct _EFI_IFR_LOCKED {
905   EFI_IFR_OP_HEADER        Header;
906 } EFI_IFR_LOCKED;
907 
908 typedef struct _EFI_IFR_RULE {
909   EFI_IFR_OP_HEADER        Header;
910   UINT8                    RuleId;
911 } EFI_IFR_RULE;
912 
913 typedef struct _EFI_IFR_DEFAULT {
914   EFI_IFR_OP_HEADER        Header;
915   UINT16                   DefaultId;
916   UINT8                    Type;
917   EFI_IFR_TYPE_VALUE       Value;
918 } EFI_IFR_DEFAULT;
919 
920 typedef struct _EFI_IFR_DEFAULT_2 {
921   EFI_IFR_OP_HEADER        Header;
922   UINT16                   DefaultId;
923   UINT8                    Type;
924 } EFI_IFR_DEFAULT_2;
925 
926 typedef struct _EFI_IFR_VALUE {
927   EFI_IFR_OP_HEADER        Header;
928 } EFI_IFR_VALUE;
929 
930 typedef struct _EFI_IFR_SUBTITLE {
931   EFI_IFR_OP_HEADER        Header;
932   EFI_IFR_STATEMENT_HEADER Statement;
933   UINT8                    Flags;
934 } EFI_IFR_SUBTITLE;
935 
936 #define EFI_IFR_FLAGS_HORIZONTAL       0x01
937 
938 typedef struct _EFI_IFR_CHECKBOX {
939   EFI_IFR_OP_HEADER        Header;
940   EFI_IFR_QUESTION_HEADER  Question;
941   UINT8                    Flags;
942 } EFI_IFR_CHECKBOX;
943 
944 #define EFI_IFR_CHECKBOX_DEFAULT       0x01
945 #define EFI_IFR_CHECKBOX_DEFAULT_MFG   0x02
946 
947 typedef struct _EFI_IFR_TEXT {
948   EFI_IFR_OP_HEADER        Header;
949   EFI_IFR_STATEMENT_HEADER Statement;
950   EFI_STRING_ID            TextTwo;
951 } EFI_IFR_TEXT;
952 
953 typedef struct _EFI_IFR_REF {
954   EFI_IFR_OP_HEADER        Header;
955   EFI_IFR_QUESTION_HEADER  Question;
956   EFI_FORM_ID              FormId;
957 } EFI_IFR_REF;
958 
959 typedef struct _EFI_IFR_REF2 {
960   EFI_IFR_OP_HEADER        Header;
961   EFI_IFR_QUESTION_HEADER  Question;
962   EFI_FORM_ID              FormId;
963   EFI_QUESTION_ID          QuestionId;
964 } EFI_IFR_REF2;
965 
966 typedef struct _EFI_IFR_REF3 {
967   EFI_IFR_OP_HEADER        Header;
968   EFI_IFR_QUESTION_HEADER  Question;
969   EFI_FORM_ID              FormId;
970   EFI_QUESTION_ID          QuestionId;
971   EFI_GUID                 FormSetId;
972 } EFI_IFR_REF3;
973 
974 typedef struct _EFI_IFR_REF4 {
975   EFI_IFR_OP_HEADER        Header;
976   EFI_IFR_QUESTION_HEADER  Question;
977   EFI_FORM_ID              FormId;
978   EFI_QUESTION_ID          QuestionId;
979   EFI_GUID                 FormSetId;
980   EFI_STRING_ID            DevicePath;
981 } EFI_IFR_REF4;
982 
983 typedef struct _EFI_IFR_REF5 {
984   EFI_IFR_OP_HEADER Header;
985   EFI_IFR_QUESTION_HEADER Question;
986 } EFI_IFR_REF5;
987 
988 typedef struct _EFI_IFR_RESET_BUTTON {
989   EFI_IFR_OP_HEADER        Header;
990   EFI_IFR_STATEMENT_HEADER Statement;
991   EFI_DEFAULT_ID           DefaultId;
992 } EFI_IFR_RESET_BUTTON;
993 
994 typedef struct _EFI_IFR_ACTION {
995   EFI_IFR_OP_HEADER        Header;
996   EFI_IFR_QUESTION_HEADER  Question;
997   EFI_STRING_ID            QuestionConfig;
998 } EFI_IFR_ACTION;
999 
1000 typedef struct _EFI_IFR_ACTION_1 {
1001   EFI_IFR_OP_HEADER        Header;
1002   EFI_IFR_QUESTION_HEADER  Question;
1003 } EFI_IFR_ACTION_1;
1004 
1005 typedef struct _EFI_IFR_DATE {
1006   EFI_IFR_OP_HEADER        Header;
1007   EFI_IFR_QUESTION_HEADER  Question;
1008   UINT8                    Flags;
1009 } EFI_IFR_DATE;
1010 
1011 //
1012 // Flags that describe the behavior of the question.
1013 //
1014 #define EFI_QF_DATE_YEAR_SUPPRESS      0x01
1015 #define EFI_QF_DATE_MONTH_SUPPRESS     0x02
1016 #define EFI_QF_DATE_DAY_SUPPRESS       0x04
1017 
1018 #define EFI_QF_DATE_STORAGE            0x30
1019 #define     QF_DATE_STORAGE_NORMAL     0x00
1020 #define     QF_DATE_STORAGE_TIME       0x10
1021 #define     QF_DATE_STORAGE_WAKEUP     0x20
1022 
1023 typedef union {
1024   struct {
1025     UINT8 MinValue;
1026     UINT8 MaxValue;
1027     UINT8 Step;
1028   } u8;
1029   struct {
1030     UINT16 MinValue;
1031     UINT16 MaxValue;
1032     UINT16 Step;
1033   } u16;
1034   struct {
1035     UINT32 MinValue;
1036     UINT32 MaxValue;
1037     UINT32 Step;
1038   } u32;
1039   struct {
1040     UINT64 MinValue;
1041     UINT64 MaxValue;
1042     UINT64 Step;
1043   } u64;
1044 } MINMAXSTEP_DATA;
1045 
1046 typedef struct _EFI_IFR_NUMERIC {
1047   EFI_IFR_OP_HEADER        Header;
1048   EFI_IFR_QUESTION_HEADER  Question;
1049   UINT8                    Flags;
1050   MINMAXSTEP_DATA          data;
1051 } EFI_IFR_NUMERIC;
1052 
1053 //
1054 // Flags related to the numeric question
1055 //
1056 #define EFI_IFR_NUMERIC_SIZE           0x03
1057 #define   EFI_IFR_NUMERIC_SIZE_1       0x00
1058 #define   EFI_IFR_NUMERIC_SIZE_2       0x01
1059 #define   EFI_IFR_NUMERIC_SIZE_4       0x02
1060 #define   EFI_IFR_NUMERIC_SIZE_8       0x03
1061 
1062 #define EFI_IFR_DISPLAY                0x30
1063 #define   EFI_IFR_DISPLAY_INT_DEC      0x00
1064 #define   EFI_IFR_DISPLAY_UINT_DEC     0x10
1065 #define   EFI_IFR_DISPLAY_UINT_HEX     0x20
1066 
1067 typedef struct _EFI_IFR_ONE_OF {
1068   EFI_IFR_OP_HEADER        Header;
1069   EFI_IFR_QUESTION_HEADER  Question;
1070   UINT8                    Flags;
1071   MINMAXSTEP_DATA          data;
1072 } EFI_IFR_ONE_OF;
1073 
1074 typedef struct _EFI_IFR_STRING {
1075   EFI_IFR_OP_HEADER        Header;
1076   EFI_IFR_QUESTION_HEADER  Question;
1077   UINT8                    MinSize;
1078   UINT8                    MaxSize;
1079   UINT8                    Flags;
1080 } EFI_IFR_STRING;
1081 
1082 #define EFI_IFR_STRING_MULTI_LINE      0x01
1083 
1084 typedef struct _EFI_IFR_PASSWORD {
1085   EFI_IFR_OP_HEADER        Header;
1086   EFI_IFR_QUESTION_HEADER  Question;
1087   UINT16                   MinSize;
1088   UINT16                   MaxSize;
1089 } EFI_IFR_PASSWORD;
1090 
1091 typedef struct _EFI_IFR_ORDERED_LIST {
1092   EFI_IFR_OP_HEADER        Header;
1093   EFI_IFR_QUESTION_HEADER  Question;
1094   UINT8                    MaxContainers;
1095   UINT8                    Flags;
1096 } EFI_IFR_ORDERED_LIST;
1097 
1098 #define EFI_IFR_UNIQUE_SET             0x01
1099 #define EFI_IFR_NO_EMPTY_SET           0x02
1100 
1101 typedef struct _EFI_IFR_TIME {
1102   EFI_IFR_OP_HEADER        Header;
1103   EFI_IFR_QUESTION_HEADER  Question;
1104   UINT8                    Flags;
1105 } EFI_IFR_TIME;
1106 
1107 //
1108 // A bit-mask that determines which unique settings are active for this opcode.
1109 //
1110 #define QF_TIME_HOUR_SUPPRESS          0x01
1111 #define QF_TIME_MINUTE_SUPPRESS        0x02
1112 #define QF_TIME_SECOND_SUPPRESS        0x04
1113 
1114 #define QF_TIME_STORAGE                0x30
1115 #define   QF_TIME_STORAGE_NORMAL       0x00
1116 #define   QF_TIME_STORAGE_TIME         0x10
1117 #define   QF_TIME_STORAGE_WAKEUP       0x20
1118 
1119 typedef struct _EFI_IFR_DISABLE_IF {
1120   EFI_IFR_OP_HEADER        Header;
1121 } EFI_IFR_DISABLE_IF;
1122 
1123 typedef struct _EFI_IFR_SUPPRESS_IF {
1124   EFI_IFR_OP_HEADER        Header;
1125 } EFI_IFR_SUPPRESS_IF;
1126 
1127 typedef struct _EFI_IFR_GRAY_OUT_IF {
1128   EFI_IFR_OP_HEADER        Header;
1129 } EFI_IFR_GRAY_OUT_IF;
1130 
1131 typedef struct _EFI_IFR_INCONSISTENT_IF {
1132   EFI_IFR_OP_HEADER        Header;
1133   EFI_STRING_ID            Error;
1134 } EFI_IFR_INCONSISTENT_IF;
1135 
1136 typedef struct _EFI_IFR_NO_SUBMIT_IF {
1137   EFI_IFR_OP_HEADER        Header;
1138   EFI_STRING_ID            Error;
1139 } EFI_IFR_NO_SUBMIT_IF;
1140 
1141 typedef struct _EFI_IFR_WARNING_IF {
1142   EFI_IFR_OP_HEADER        Header;
1143   EFI_STRING_ID            Warning;
1144   UINT8                    TimeOut;
1145 } EFI_IFR_WARNING_IF;
1146 
1147 typedef struct _EFI_IFR_REFRESH {
1148   EFI_IFR_OP_HEADER        Header;
1149   UINT8                    RefreshInterval;
1150 } EFI_IFR_REFRESH;
1151 
1152 typedef struct _EFI_IFR_VARSTORE_DEVICE {
1153   EFI_IFR_OP_HEADER        Header;
1154   EFI_STRING_ID            DevicePath;
1155 } EFI_IFR_VARSTORE_DEVICE;
1156 
1157 typedef struct _EFI_IFR_ONE_OF_OPTION {
1158   EFI_IFR_OP_HEADER        Header;
1159   EFI_STRING_ID            Option;
1160   UINT8                    Flags;
1161   UINT8                    Type;
1162   EFI_IFR_TYPE_VALUE       Value;
1163 } EFI_IFR_ONE_OF_OPTION;
1164 
1165 //
1166 // Types of the option's value.
1167 //
1168 #define EFI_IFR_TYPE_NUM_SIZE_8        0x00
1169 #define EFI_IFR_TYPE_NUM_SIZE_16       0x01
1170 #define EFI_IFR_TYPE_NUM_SIZE_32       0x02
1171 #define EFI_IFR_TYPE_NUM_SIZE_64       0x03
1172 #define EFI_IFR_TYPE_BOOLEAN           0x04
1173 #define EFI_IFR_TYPE_TIME              0x05
1174 #define EFI_IFR_TYPE_DATE              0x06
1175 #define EFI_IFR_TYPE_STRING            0x07
1176 #define EFI_IFR_TYPE_OTHER             0x08
1177 #define EFI_IFR_TYPE_UNDEFINED         0x09
1178 #define EFI_IFR_TYPE_ACTION            0x0A
1179 #define EFI_IFR_TYPE_BUFFER            0x0B
1180 #define EFI_IFR_TYPE_REF               0x0C
1181 
1182 #define EFI_IFR_OPTION_DEFAULT         0x10
1183 #define EFI_IFR_OPTION_DEFAULT_MFG     0x20
1184 
1185 typedef struct _EFI_IFR_GUID {
1186   EFI_IFR_OP_HEADER        Header;
1187   EFI_GUID                 Guid;
1188   //Optional Data Follows
1189 } EFI_IFR_GUID;
1190 
1191 typedef struct _EFI_IFR_REFRESH_ID {
1192   EFI_IFR_OP_HEADER Header;
1193   EFI_GUID          RefreshEventGroupId;
1194 } EFI_IFR_REFRESH_ID;
1195 
1196 typedef struct _EFI_IFR_DUP {
1197   EFI_IFR_OP_HEADER        Header;
1198 } EFI_IFR_DUP;
1199 
1200 typedef struct _EFI_IFR_EQ_ID_ID {
1201   EFI_IFR_OP_HEADER        Header;
1202   EFI_QUESTION_ID          QuestionId1;
1203   EFI_QUESTION_ID          QuestionId2;
1204 } EFI_IFR_EQ_ID_ID;
1205 
1206 typedef struct _EFI_IFR_EQ_ID_VAL {
1207   EFI_IFR_OP_HEADER        Header;
1208   EFI_QUESTION_ID          QuestionId;
1209   UINT16                   Value;
1210 } EFI_IFR_EQ_ID_VAL;
1211 
1212 typedef struct _EFI_IFR_EQ_ID_VAL_LIST {
1213   EFI_IFR_OP_HEADER        Header;
1214   EFI_QUESTION_ID          QuestionId;
1215   UINT16                   ListLength;
1216   UINT16                   ValueList[1];
1217 } EFI_IFR_EQ_ID_VAL_LIST;
1218 
1219 typedef struct _EFI_IFR_UINT8 {
1220   EFI_IFR_OP_HEADER        Header;
1221   UINT8 Value;
1222 } EFI_IFR_UINT8;
1223 
1224 typedef struct _EFI_IFR_UINT16 {
1225   EFI_IFR_OP_HEADER        Header;
1226   UINT16                   Value;
1227 } EFI_IFR_UINT16;
1228 
1229 typedef struct _EFI_IFR_UINT32 {
1230   EFI_IFR_OP_HEADER        Header;
1231   UINT32                   Value;
1232 } EFI_IFR_UINT32;
1233 
1234 typedef struct _EFI_IFR_UINT64 {
1235   EFI_IFR_OP_HEADER        Header;
1236   UINT64 Value;
1237 } EFI_IFR_UINT64;
1238 
1239 typedef struct _EFI_IFR_QUESTION_REF1 {
1240   EFI_IFR_OP_HEADER        Header;
1241   EFI_QUESTION_ID          QuestionId;
1242 } EFI_IFR_QUESTION_REF1;
1243 
1244 typedef struct _EFI_IFR_QUESTION_REF2 {
1245   EFI_IFR_OP_HEADER        Header;
1246 } EFI_IFR_QUESTION_REF2;
1247 
1248 typedef struct _EFI_IFR_QUESTION_REF3 {
1249   EFI_IFR_OP_HEADER        Header;
1250 } EFI_IFR_QUESTION_REF3;
1251 
1252 typedef struct _EFI_IFR_QUESTION_REF3_2 {
1253   EFI_IFR_OP_HEADER        Header;
1254   EFI_STRING_ID            DevicePath;
1255 } EFI_IFR_QUESTION_REF3_2;
1256 
1257 typedef struct _EFI_IFR_QUESTION_REF3_3 {
1258   EFI_IFR_OP_HEADER        Header;
1259   EFI_STRING_ID            DevicePath;
1260   EFI_GUID                 Guid;
1261 } EFI_IFR_QUESTION_REF3_3;
1262 
1263 typedef struct _EFI_IFR_RULE_REF {
1264   EFI_IFR_OP_HEADER        Header;
1265   UINT8                    RuleId;
1266 } EFI_IFR_RULE_REF;
1267 
1268 typedef struct _EFI_IFR_STRING_REF1 {
1269   EFI_IFR_OP_HEADER        Header;
1270   EFI_STRING_ID            StringId;
1271 } EFI_IFR_STRING_REF1;
1272 
1273 typedef struct _EFI_IFR_STRING_REF2 {
1274   EFI_IFR_OP_HEADER        Header;
1275 } EFI_IFR_STRING_REF2;
1276 
1277 typedef struct _EFI_IFR_THIS {
1278   EFI_IFR_OP_HEADER        Header;
1279 } EFI_IFR_THIS;
1280 
1281 typedef struct _EFI_IFR_TRUE {
1282   EFI_IFR_OP_HEADER        Header;
1283 } EFI_IFR_TRUE;
1284 
1285 typedef struct _EFI_IFR_FALSE {
1286   EFI_IFR_OP_HEADER        Header;
1287 } EFI_IFR_FALSE;
1288 
1289 typedef struct _EFI_IFR_ONE {
1290   EFI_IFR_OP_HEADER        Header;
1291 } EFI_IFR_ONE;
1292 
1293 typedef struct _EFI_IFR_ONES {
1294   EFI_IFR_OP_HEADER        Header;
1295 } EFI_IFR_ONES;
1296 
1297 typedef struct _EFI_IFR_ZERO {
1298   EFI_IFR_OP_HEADER        Header;
1299 } EFI_IFR_ZERO;
1300 
1301 typedef struct _EFI_IFR_UNDEFINED {
1302   EFI_IFR_OP_HEADER        Header;
1303 } EFI_IFR_UNDEFINED;
1304 
1305 typedef struct _EFI_IFR_VERSION {
1306   EFI_IFR_OP_HEADER        Header;
1307 } EFI_IFR_VERSION;
1308 
1309 typedef struct _EFI_IFR_LENGTH {
1310   EFI_IFR_OP_HEADER        Header;
1311 } EFI_IFR_LENGTH;
1312 
1313 typedef struct _EFI_IFR_NOT {
1314   EFI_IFR_OP_HEADER        Header;
1315 } EFI_IFR_NOT;
1316 
1317 typedef struct _EFI_IFR_BITWISE_NOT {
1318   EFI_IFR_OP_HEADER        Header;
1319 } EFI_IFR_BITWISE_NOT;
1320 
1321 typedef struct _EFI_IFR_TO_BOOLEAN {
1322   EFI_IFR_OP_HEADER        Header;
1323 } EFI_IFR_TO_BOOLEAN;
1324 
1325 ///
1326 /// For EFI_IFR_TO_STRING, when converting from
1327 /// unsigned integers, these flags control the format:
1328 /// 0 = unsigned decimal.
1329 /// 1 = signed decimal.
1330 /// 2 = hexadecimal (lower-case alpha).
1331 /// 3 = hexadecimal (upper-case alpha).
1332 ///@{
1333 #define EFI_IFR_STRING_UNSIGNED_DEC      0
1334 #define EFI_IFR_STRING_SIGNED_DEC        1
1335 #define EFI_IFR_STRING_LOWERCASE_HEX     2
1336 #define EFI_IFR_STRING_UPPERCASE_HEX     3
1337 ///@}
1338 
1339 ///
1340 /// When converting from a buffer, these flags control the format:
1341 /// 0 = ASCII.
1342 /// 8 = Unicode.
1343 ///@{
1344 #define EFI_IFR_STRING_ASCII             0
1345 #define EFI_IFR_STRING_UNICODE           8
1346 ///@}
1347 
1348 typedef struct _EFI_IFR_TO_STRING {
1349   EFI_IFR_OP_HEADER        Header;
1350   UINT8                    Format;
1351 } EFI_IFR_TO_STRING;
1352 
1353 typedef struct _EFI_IFR_TO_UINT {
1354   EFI_IFR_OP_HEADER        Header;
1355 } EFI_IFR_TO_UINT;
1356 
1357 typedef struct _EFI_IFR_TO_UPPER {
1358   EFI_IFR_OP_HEADER        Header;
1359 } EFI_IFR_TO_UPPER;
1360 
1361 typedef struct _EFI_IFR_TO_LOWER {
1362   EFI_IFR_OP_HEADER        Header;
1363 } EFI_IFR_TO_LOWER;
1364 
1365 typedef struct _EFI_IFR_ADD {
1366   EFI_IFR_OP_HEADER        Header;
1367 } EFI_IFR_ADD;
1368 
1369 typedef struct _EFI_IFR_AND {
1370   EFI_IFR_OP_HEADER        Header;
1371 } EFI_IFR_AND;
1372 
1373 typedef struct _EFI_IFR_BITWISE_AND {
1374   EFI_IFR_OP_HEADER        Header;
1375 } EFI_IFR_BITWISE_AND;
1376 
1377 typedef struct _EFI_IFR_BITWISE_OR {
1378   EFI_IFR_OP_HEADER        Header;
1379 } EFI_IFR_BITWISE_OR;
1380 
1381 typedef struct _EFI_IFR_CATENATE {
1382   EFI_IFR_OP_HEADER        Header;
1383 } EFI_IFR_CATENATE;
1384 
1385 typedef struct _EFI_IFR_DIVIDE {
1386   EFI_IFR_OP_HEADER        Header;
1387 } EFI_IFR_DIVIDE;
1388 
1389 typedef struct _EFI_IFR_EQUAL {
1390   EFI_IFR_OP_HEADER        Header;
1391 } EFI_IFR_EQUAL;
1392 
1393 typedef struct _EFI_IFR_GREATER_EQUAL {
1394   EFI_IFR_OP_HEADER        Header;
1395 } EFI_IFR_GREATER_EQUAL;
1396 
1397 typedef struct _EFI_IFR_GREATER_THAN {
1398   EFI_IFR_OP_HEADER        Header;
1399 } EFI_IFR_GREATER_THAN;
1400 
1401 typedef struct _EFI_IFR_LESS_EQUAL {
1402   EFI_IFR_OP_HEADER        Header;
1403 } EFI_IFR_LESS_EQUAL;
1404 
1405 typedef struct _EFI_IFR_LESS_THAN {
1406   EFI_IFR_OP_HEADER        Header;
1407 } EFI_IFR_LESS_THAN;
1408 
1409 typedef struct _EFI_IFR_MATCH {
1410   EFI_IFR_OP_HEADER        Header;
1411 } EFI_IFR_MATCH;
1412 
1413 typedef struct _EFI_IFR_MATCH2 {
1414   EFI_IFR_OP_HEADER        Header;
1415   EFI_GUID                 SyntaxType;
1416 } EFI_IFR_MATCH2;
1417 
1418 typedef struct _EFI_IFR_MULTIPLY {
1419   EFI_IFR_OP_HEADER        Header;
1420 } EFI_IFR_MULTIPLY;
1421 
1422 typedef struct _EFI_IFR_MODULO {
1423   EFI_IFR_OP_HEADER        Header;
1424 } EFI_IFR_MODULO;
1425 
1426 typedef struct _EFI_IFR_NOT_EQUAL {
1427   EFI_IFR_OP_HEADER        Header;
1428 } EFI_IFR_NOT_EQUAL;
1429 
1430 typedef struct _EFI_IFR_OR {
1431   EFI_IFR_OP_HEADER        Header;
1432 } EFI_IFR_OR;
1433 
1434 typedef struct _EFI_IFR_SHIFT_LEFT {
1435   EFI_IFR_OP_HEADER        Header;
1436 } EFI_IFR_SHIFT_LEFT;
1437 
1438 typedef struct _EFI_IFR_SHIFT_RIGHT {
1439   EFI_IFR_OP_HEADER        Header;
1440 } EFI_IFR_SHIFT_RIGHT;
1441 
1442 typedef struct _EFI_IFR_SUBTRACT {
1443   EFI_IFR_OP_HEADER        Header;
1444 } EFI_IFR_SUBTRACT;
1445 
1446 typedef struct _EFI_IFR_CONDITIONAL {
1447   EFI_IFR_OP_HEADER        Header;
1448 } EFI_IFR_CONDITIONAL;
1449 
1450 //
1451 // Flags governing the matching criteria of EFI_IFR_FIND
1452 //
1453 #define EFI_IFR_FF_CASE_SENSITIVE    0x00
1454 #define EFI_IFR_FF_CASE_INSENSITIVE  0x01
1455 
1456 typedef struct _EFI_IFR_FIND {
1457   EFI_IFR_OP_HEADER        Header;
1458   UINT8                    Format;
1459 } EFI_IFR_FIND;
1460 
1461 typedef struct _EFI_IFR_MID {
1462   EFI_IFR_OP_HEADER        Header;
1463 } EFI_IFR_MID;
1464 
1465 typedef struct _EFI_IFR_TOKEN {
1466   EFI_IFR_OP_HEADER        Header;
1467 } EFI_IFR_TOKEN;
1468 
1469 //
1470 // Flags specifying whether to find the first matching string
1471 // or the first non-matching string.
1472 //
1473 #define EFI_IFR_FLAGS_FIRST_MATCHING     0x00
1474 #define EFI_IFR_FLAGS_FIRST_NON_MATCHING 0x01
1475 
1476 typedef struct _EFI_IFR_SPAN {
1477   EFI_IFR_OP_HEADER        Header;
1478   UINT8                    Flags;
1479 } EFI_IFR_SPAN;
1480 
1481 typedef struct _EFI_IFR_SECURITY {
1482   ///
1483   /// Standard opcode header, where Header.Op = EFI_IFR_SECURITY_OP.
1484   ///
1485   EFI_IFR_OP_HEADER        Header;
1486   ///
1487   /// Security permission level.
1488   ///
1489   EFI_GUID                 Permissions;
1490 } EFI_IFR_SECURITY;
1491 
1492 typedef struct _EFI_IFR_FORM_MAP_METHOD {
1493   ///
1494   /// The string identifier which provides the human-readable name of
1495   /// the configuration method for this standards map form.
1496   ///
1497   EFI_STRING_ID            MethodTitle;
1498   ///
1499   /// Identifier which uniquely specifies the configuration methods
1500   /// associated with this standards map form.
1501   ///
1502   EFI_GUID                 MethodIdentifier;
1503 } EFI_IFR_FORM_MAP_METHOD;
1504 
1505 typedef struct _EFI_IFR_FORM_MAP {
1506   ///
1507   /// The sequence that defines the type of opcode as well as the length
1508   /// of the opcode being defined. Header.OpCode = EFI_IFR_FORM_MAP_OP.
1509   ///
1510   EFI_IFR_OP_HEADER        Header;
1511   ///
1512   /// The unique identifier for this particular form.
1513   ///
1514   EFI_FORM_ID              FormId;
1515   ///
1516   /// One or more configuration method's name and unique identifier.
1517   ///
1518   // EFI_IFR_FORM_MAP_METHOD  Methods[];
1519 } EFI_IFR_FORM_MAP;
1520 
1521 typedef struct _EFI_IFR_SET {
1522   ///
1523   /// The sequence that defines the type of opcode as well as the length
1524   /// of the opcode being defined. Header.OpCode = EFI_IFR_SET_OP.
1525   ///
1526   EFI_IFR_OP_HEADER  Header;
1527   ///
1528   /// Specifies the identifier of a previously declared variable store to
1529   /// use when storing the question's value.
1530   ///
1531   EFI_VARSTORE_ID    VarStoreId;
1532   union {
1533     ///
1534     /// A 16-bit Buffer Storage offset.
1535     ///
1536     EFI_STRING_ID    VarName;
1537     ///
1538     /// A Name Value or EFI Variable name (VarName).
1539     ///
1540     UINT16           VarOffset;
1541   }                  VarStoreInfo;
1542   ///
1543   /// Specifies the type used for storage.
1544   ///
1545   UINT8              VarStoreType;
1546 } EFI_IFR_SET;
1547 
1548 typedef struct _EFI_IFR_GET {
1549   ///
1550   /// The sequence that defines the type of opcode as well as the length
1551   /// of the opcode being defined. Header.OpCode = EFI_IFR_GET_OP.
1552   ///
1553   EFI_IFR_OP_HEADER  Header;
1554   ///
1555   /// Specifies the identifier of a previously declared variable store to
1556   /// use when retrieving the value.
1557   ///
1558   EFI_VARSTORE_ID    VarStoreId;
1559   union {
1560     ///
1561     /// A 16-bit Buffer Storage offset.
1562     ///
1563     EFI_STRING_ID    VarName;
1564     ///
1565     /// A Name Value or EFI Variable name (VarName).
1566     ///
1567     UINT16           VarOffset;
1568   }                  VarStoreInfo;
1569   ///
1570   /// Specifies the type used for storage.
1571   ///
1572   UINT8              VarStoreType;
1573 } EFI_IFR_GET;
1574 
1575 typedef struct _EFI_IFR_READ {
1576   EFI_IFR_OP_HEADER       Header;
1577 } EFI_IFR_READ;
1578 
1579 typedef struct _EFI_IFR_WRITE {
1580   EFI_IFR_OP_HEADER      Header;
1581 } EFI_IFR_WRITE;
1582 
1583 typedef struct _EFI_IFR_MAP {
1584   EFI_IFR_OP_HEADER      Header;
1585 } EFI_IFR_MAP;
1586 //
1587 // Definitions for Keyboard Package
1588 // Releated definitions are in Section of EFI_HII_DATABASE_PROTOCOL
1589 //
1590 
1591 ///
1592 /// Each enumeration values maps a physical key on a keyboard.
1593 ///
1594 typedef enum {
1595   EfiKeyLCtrl,
1596   EfiKeyA0,
1597   EfiKeyLAlt,
1598   EfiKeySpaceBar,
1599   EfiKeyA2,
1600   EfiKeyA3,
1601   EfiKeyA4,
1602   EfiKeyRCtrl,
1603   EfiKeyLeftArrow,
1604   EfiKeyDownArrow,
1605   EfiKeyRightArrow,
1606   EfiKeyZero,
1607   EfiKeyPeriod,
1608   EfiKeyEnter,
1609   EfiKeyLShift,
1610   EfiKeyB0,
1611   EfiKeyB1,
1612   EfiKeyB2,
1613   EfiKeyB3,
1614   EfiKeyB4,
1615   EfiKeyB5,
1616   EfiKeyB6,
1617   EfiKeyB7,
1618   EfiKeyB8,
1619   EfiKeyB9,
1620   EfiKeyB10,
1621   EfiKeyRShift,
1622   EfiKeyUpArrow,
1623   EfiKeyOne,
1624   EfiKeyTwo,
1625   EfiKeyThree,
1626   EfiKeyCapsLock,
1627   EfiKeyC1,
1628   EfiKeyC2,
1629   EfiKeyC3,
1630   EfiKeyC4,
1631   EfiKeyC5,
1632   EfiKeyC6,
1633   EfiKeyC7,
1634   EfiKeyC8,
1635   EfiKeyC9,
1636   EfiKeyC10,
1637   EfiKeyC11,
1638   EfiKeyC12,
1639   EfiKeyFour,
1640   EfiKeyFive,
1641   EfiKeySix,
1642   EfiKeyPlus,
1643   EfiKeyTab,
1644   EfiKeyD1,
1645   EfiKeyD2,
1646   EfiKeyD3,
1647   EfiKeyD4,
1648   EfiKeyD5,
1649   EfiKeyD6,
1650   EfiKeyD7,
1651   EfiKeyD8,
1652   EfiKeyD9,
1653   EfiKeyD10,
1654   EfiKeyD11,
1655   EfiKeyD12,
1656   EfiKeyD13,
1657   EfiKeyDel,
1658   EfiKeyEnd,
1659   EfiKeyPgDn,
1660   EfiKeySeven,
1661   EfiKeyEight,
1662   EfiKeyNine,
1663   EfiKeyE0,
1664   EfiKeyE1,
1665   EfiKeyE2,
1666   EfiKeyE3,
1667   EfiKeyE4,
1668   EfiKeyE5,
1669   EfiKeyE6,
1670   EfiKeyE7,
1671   EfiKeyE8,
1672   EfiKeyE9,
1673   EfiKeyE10,
1674   EfiKeyE11,
1675   EfiKeyE12,
1676   EfiKeyBackSpace,
1677   EfiKeyIns,
1678   EfiKeyHome,
1679   EfiKeyPgUp,
1680   EfiKeyNLck,
1681   EfiKeySlash,
1682   EfiKeyAsterisk,
1683   EfiKeyMinus,
1684   EfiKeyEsc,
1685   EfiKeyF1,
1686   EfiKeyF2,
1687   EfiKeyF3,
1688   EfiKeyF4,
1689   EfiKeyF5,
1690   EfiKeyF6,
1691   EfiKeyF7,
1692   EfiKeyF8,
1693   EfiKeyF9,
1694   EfiKeyF10,
1695   EfiKeyF11,
1696   EfiKeyF12,
1697   EfiKeyPrint,
1698   EfiKeySLck,
1699   EfiKeyPause
1700 } EFI_KEY;
1701 
1702 typedef struct {
1703   ///
1704   /// Used to describe a physical key on a keyboard.
1705   ///
1706   EFI_KEY                 Key;
1707   ///
1708   /// Unicode character code for the Key.
1709   ///
1710   CHAR16                  Unicode;
1711   ///
1712   /// Unicode character code for the key with the shift key being held down.
1713   ///
1714   CHAR16                  ShiftedUnicode;
1715   ///
1716   /// Unicode character code for the key with the Alt-GR being held down.
1717   ///
1718   CHAR16                  AltGrUnicode;
1719   ///
1720   /// Unicode character code for the key with the Alt-GR and shift keys being held down.
1721   ///
1722   CHAR16                  ShiftedAltGrUnicode;
1723   ///
1724   /// Modifier keys are defined to allow for special functionality that is not necessarily
1725   /// accomplished by a printable character. Many of these modifier keys are flags to toggle
1726   /// certain state bits on and off inside of a keyboard driver.
1727   ///
1728   UINT16                  Modifier;
1729   UINT16                  AffectedAttribute;
1730 } EFI_KEY_DESCRIPTOR;
1731 
1732 ///
1733 /// A key which is affected by all the standard shift modifiers.
1734 /// Most keys would be expected to have this bit active.
1735 ///
1736 #define EFI_AFFECTED_BY_STANDARD_SHIFT       0x0001
1737 
1738 ///
1739 /// This key is affected by the caps lock so that if a keyboard driver
1740 /// would need to disambiguate between a key which had a "1" defined
1741 /// versus an "a" character.  Having this bit turned on would tell
1742 /// the keyboard driver to use the appropriate shifted state or not.
1743 ///
1744 #define EFI_AFFECTED_BY_CAPS_LOCK            0x0002
1745 
1746 ///
1747 /// Similar to the case of CAPS lock, if this bit is active, the key
1748 /// is affected by the num lock being turned on.
1749 ///
1750 #define EFI_AFFECTED_BY_NUM_LOCK             0x0004
1751 
1752 typedef struct {
1753   UINT16                  LayoutLength;
1754   EFI_GUID                Guid;
1755   UINT32                  LayoutDescriptorStringOffset;
1756   UINT8                   DescriptorCount;
1757   // EFI_KEY_DESCRIPTOR    Descriptors[];
1758 } EFI_HII_KEYBOARD_LAYOUT;
1759 
1760 typedef struct {
1761   EFI_HII_PACKAGE_HEADER  Header;
1762   UINT16                  LayoutCount;
1763   // EFI_HII_KEYBOARD_LAYOUT Layout[];
1764 } EFI_HII_KEYBOARD_PACKAGE_HDR;
1765 
1766 //
1767 // Modifier values
1768 //
1769 #define EFI_NULL_MODIFIER                0x0000
1770 #define EFI_LEFT_CONTROL_MODIFIER        0x0001
1771 #define EFI_RIGHT_CONTROL_MODIFIER       0x0002
1772 #define EFI_LEFT_ALT_MODIFIER            0x0003
1773 #define EFI_RIGHT_ALT_MODIFIER           0x0004
1774 #define EFI_ALT_GR_MODIFIER              0x0005
1775 #define EFI_INSERT_MODIFIER              0x0006
1776 #define EFI_DELETE_MODIFIER              0x0007
1777 #define EFI_PAGE_DOWN_MODIFIER           0x0008
1778 #define EFI_PAGE_UP_MODIFIER             0x0009
1779 #define EFI_HOME_MODIFIER                0x000A
1780 #define EFI_END_MODIFIER                 0x000B
1781 #define EFI_LEFT_SHIFT_MODIFIER          0x000C
1782 #define EFI_RIGHT_SHIFT_MODIFIER         0x000D
1783 #define EFI_CAPS_LOCK_MODIFIER           0x000E
1784 #define EFI_NUM_LOCK_MODIFIER            0x000F
1785 #define EFI_LEFT_ARROW_MODIFIER          0x0010
1786 #define EFI_RIGHT_ARROW_MODIFIER         0x0011
1787 #define EFI_DOWN_ARROW_MODIFIER          0x0012
1788 #define EFI_UP_ARROW_MODIFIER            0x0013
1789 #define EFI_NS_KEY_MODIFIER              0x0014
1790 #define EFI_NS_KEY_DEPENDENCY_MODIFIER   0x0015
1791 #define EFI_FUNCTION_KEY_ONE_MODIFIER    0x0016
1792 #define EFI_FUNCTION_KEY_TWO_MODIFIER    0x0017
1793 #define EFI_FUNCTION_KEY_THREE_MODIFIER  0x0018
1794 #define EFI_FUNCTION_KEY_FOUR_MODIFIER   0x0019
1795 #define EFI_FUNCTION_KEY_FIVE_MODIFIER   0x001A
1796 #define EFI_FUNCTION_KEY_SIX_MODIFIER    0x001B
1797 #define EFI_FUNCTION_KEY_SEVEN_MODIFIER  0x001C
1798 #define EFI_FUNCTION_KEY_EIGHT_MODIFIER  0x001D
1799 #define EFI_FUNCTION_KEY_NINE_MODIFIER   0x001E
1800 #define EFI_FUNCTION_KEY_TEN_MODIFIER    0x001F
1801 #define EFI_FUNCTION_KEY_ELEVEN_MODIFIER 0x0020
1802 #define EFI_FUNCTION_KEY_TWELVE_MODIFIER 0x0021
1803 
1804 //
1805 // Keys that have multiple control functions based on modifier
1806 // settings are handled in the keyboard driver implementation.
1807 // For instance, PRINT_KEY might have a modifier held down and
1808 // is still a nonprinting character, but might have an alternate
1809 // control function like SYSREQUEST
1810 //
1811 #define EFI_PRINT_MODIFIER               0x0022
1812 #define EFI_SYS_REQUEST_MODIFIER         0x0023
1813 #define EFI_SCROLL_LOCK_MODIFIER         0x0024
1814 #define EFI_PAUSE_MODIFIER               0x0025
1815 #define EFI_BREAK_MODIFIER               0x0026
1816 
1817 #define EFI_LEFT_LOGO_MODIFIER           0x0027
1818 #define EFI_RIGHT_LOGO_MODIFIER          0x0028
1819 #define EFI_MENU_MODIFIER                0x0029
1820 
1821 ///
1822 /// Animation IFR opcode
1823 ///
1824 typedef struct _EFI_IFR_ANIMATION {
1825   ///
1826   /// Standard opcode header, where Header.OpCode is
1827   /// EFI_IFR_ANIMATION_OP.
1828   ///
1829   EFI_IFR_OP_HEADER        Header;
1830   ///
1831   /// Animation identifier in the HII database.
1832   ///
1833   EFI_ANIMATION_ID         Id;
1834 } EFI_IFR_ANIMATION;
1835 
1836 ///
1837 /// HII animation package header.
1838 ///
1839 typedef struct _EFI_HII_ANIMATION_PACKAGE_HDR {
1840   ///
1841   /// Standard package header, where Header.Type = EFI_HII_PACKAGE_ANIMATIONS.
1842   ///
1843   EFI_HII_PACKAGE_HEADER  Header;
1844   ///
1845   /// Offset, relative to this header, of the animation information. If
1846   /// this is zero, then there are no animation sequences in the package.
1847   ///
1848   UINT32                  AnimationInfoOffset;
1849 } EFI_HII_ANIMATION_PACKAGE_HDR;
1850 
1851 ///
1852 /// Animation information is encoded as a series of blocks,
1853 /// with each block prefixed by a single byte header EFI_HII_ANIMATION_BLOCK.
1854 ///
1855 typedef struct _EFI_HII_ANIMATION_BLOCK {
1856   UINT8  BlockType;
1857   //UINT8  BlockBody[];
1858 } EFI_HII_ANIMATION_BLOCK;
1859 
1860 ///
1861 /// Animation block types.
1862 ///
1863 #define EFI_HII_AIBT_END                 0x00
1864 #define EFI_HII_AIBT_OVERLAY_IMAGES      0x10
1865 #define EFI_HII_AIBT_CLEAR_IMAGES        0x11
1866 #define EFI_HII_AIBT_RESTORE_SCRN        0x12
1867 #define EFI_HII_AIBT_OVERLAY_IMAGES_LOOP 0x18
1868 #define EFI_HII_AIBT_CLEAR_IMAGES_LOOP   0x19
1869 #define EFI_HII_AIBT_RESTORE_SCRN_LOOP   0x1A
1870 #define EFI_HII_AIBT_DUPLICATE           0x20
1871 #define EFI_HII_AIBT_SKIP2               0x21
1872 #define EFI_HII_AIBT_SKIP1               0x22
1873 #define EFI_HII_AIBT_EXT1                0x30
1874 #define EFI_HII_AIBT_EXT2                0x31
1875 #define EFI_HII_AIBT_EXT4                0x32
1876 
1877 ///
1878 /// Extended block headers used for variable sized animation records
1879 /// which need an explicit length.
1880 ///
1881 
1882 typedef struct _EFI_HII_AIBT_EXT1_BLOCK  {
1883   ///
1884   /// Standard animation header, where Header.BlockType = EFI_HII_AIBT_EXT1.
1885   ///
1886   EFI_HII_ANIMATION_BLOCK  Header;
1887   ///
1888   /// The block type.
1889   ///
1890   UINT8                    BlockType2;
1891   ///
1892   /// Size of the animation block, in bytes, including the animation block header.
1893   ///
1894   UINT8                    Length;
1895 } EFI_HII_AIBT_EXT1_BLOCK;
1896 
1897 typedef struct _EFI_HII_AIBT_EXT2_BLOCK {
1898   ///
1899   /// Standard animation header, where Header.BlockType = EFI_HII_AIBT_EXT2.
1900   ///
1901   EFI_HII_ANIMATION_BLOCK  Header;
1902   ///
1903   /// The block type
1904   ///
1905   UINT8                    BlockType2;
1906   ///
1907   /// Size of the animation block, in bytes, including the animation block header.
1908   ///
1909   UINT16                   Length;
1910 } EFI_HII_AIBT_EXT2_BLOCK;
1911 
1912 typedef struct _EFI_HII_AIBT_EXT4_BLOCK {
1913   ///
1914   /// Standard animation header, where Header.BlockType = EFI_HII_AIBT_EXT4.
1915   ///
1916   EFI_HII_ANIMATION_BLOCK  Header;
1917   ///
1918   /// The block type
1919   ///
1920   UINT8                    BlockType2;
1921   ///
1922   /// Size of the animation block, in bytes, including the animation block header.
1923   ///
1924   UINT32                   Length;
1925 } EFI_HII_AIBT_EXT4_BLOCK;
1926 
1927 typedef struct _EFI_HII_ANIMATION_CELL {
1928   ///
1929   /// The X offset from the upper left hand corner of the logical
1930   /// window to position the indexed image.
1931   ///
1932   UINT16                    OffsetX;
1933   ///
1934   /// The Y offset from the upper left hand corner of the logical
1935   /// window to position the indexed image.
1936   ///
1937   UINT16                    OffsetY;
1938   ///
1939   /// The image to display at the specified offset from the upper left
1940   /// hand corner of the logical window.
1941   ///
1942   EFI_IMAGE_ID              ImageId;
1943   ///
1944   /// The number of milliseconds to delay after displaying the indexed
1945   /// image and before continuing on to the next linked image.  If value
1946   /// is zero, no delay.
1947   ///
1948   UINT16                    Delay;
1949 } EFI_HII_ANIMATION_CELL;
1950 
1951 ///
1952 /// An animation block to describe an animation sequence that does not cycle, and
1953 /// where one image is simply displayed over the previous image.
1954 ///
1955 typedef struct _EFI_HII_AIBT_OVERLAY_IMAGES_BLOCK {
1956   ///
1957   /// This is image that is to be reference by the image protocols, if the
1958   /// animation function is not supported or disabled. This image can
1959   /// be one particular image from the animation sequence (if any one
1960   /// of the animation frames has a complete image) or an alternate
1961   /// image that can be displayed alone. If the value is zero, no image
1962   /// is displayed.
1963   ///
1964   EFI_IMAGE_ID            DftImageId;
1965   ///
1966   /// The overall width of the set of images (logical window width).
1967   ///
1968   UINT16                  Width;
1969   ///
1970   /// The overall height of the set of images (logical window height).
1971   ///
1972   UINT16                  Height;
1973   ///
1974   /// The number of EFI_HII_ANIMATION_CELL contained in the
1975   /// animation sequence.
1976   ///
1977   UINT16                  CellCount;
1978   ///
1979   /// An array of CellCount animation cells.
1980   ///
1981   EFI_HII_ANIMATION_CELL  AnimationCell[1];
1982 } EFI_HII_AIBT_OVERLAY_IMAGES_BLOCK;
1983 
1984 ///
1985 /// An animation block to describe an animation sequence that does not cycle,
1986 /// and where the logical window is cleared to the specified color before
1987 /// the next image is displayed.
1988 ///
1989 typedef struct _EFI_HII_AIBT_CLEAR_IMAGES_BLOCK {
1990   ///
1991   /// This is image that is to be reference by the image protocols, if the
1992   /// animation function is not supported or disabled. This image can
1993   /// be one particular image from the animation sequence (if any one
1994   /// of the animation frames has a complete image) or an alternate
1995   /// image that can be displayed alone. If the value is zero, no image
1996   /// is displayed.
1997   ///
1998   EFI_IMAGE_ID       DftImageId;
1999   ///
2000   /// The overall width of the set of images (logical window width).
2001   ///
2002   UINT16             Width;
2003   ///
2004   /// The overall height of the set of images (logical window height).
2005   ///
2006   UINT16             Height;
2007   ///
2008   /// The number of EFI_HII_ANIMATION_CELL contained in the
2009   /// animation sequence.
2010   ///
2011   UINT16             CellCount;
2012   ///
2013   /// The color to clear the logical window to before displaying the
2014   /// indexed image.
2015   ///
2016   EFI_HII_RGB_PIXEL  BackgndColor;
2017   ///
2018   /// An array of CellCount animation cells.
2019   ///
2020   EFI_HII_ANIMATION_CELL AnimationCell[1];
2021 } EFI_HII_AIBT_CLEAR_IMAGES_BLOCK;
2022 
2023 ///
2024 /// An animation block to describe an animation sequence that does not cycle,
2025 /// and where the screen is restored to the original state before the next
2026 /// image is displayed.
2027 ///
2028 typedef struct _EFI_HII_AIBT_RESTORE_SCRN_BLOCK {
2029   ///
2030   /// This is image that is to be reference by the image protocols, if the
2031   /// animation function is not supported or disabled. This image can
2032   /// be one particular image from the animation sequence (if any one
2033   /// of the animation frames has a complete image) or an alternate
2034   /// image that can be displayed alone. If the value is zero, no image
2035   /// is displayed.
2036   ///
2037   EFI_IMAGE_ID            DftImageId;
2038   ///
2039   /// The overall width of the set of images (logical window width).
2040   ///
2041   UINT16                  Width;
2042   ///
2043   /// The overall height of the set of images (logical window height).
2044   ///
2045   UINT16                  Height;
2046   ///
2047   /// The number of EFI_HII_ANIMATION_CELL contained in the
2048   /// animation sequence.
2049   ///
2050   UINT16                  CellCount;
2051   ///
2052   /// An array of CellCount animation cells.
2053   ///
2054   EFI_HII_ANIMATION_CELL  AnimationCell[1];
2055 } EFI_HII_AIBT_RESTORE_SCRN_BLOCK;
2056 
2057 ///
2058 /// An animation block to describe an animation sequence that continuously cycles,
2059 /// and where one image is simply displayed over the previous image.
2060 ///
2061 typedef EFI_HII_AIBT_OVERLAY_IMAGES_BLOCK  EFI_HII_AIBT_OVERLAY_IMAGES_LOOP_BLOCK;
2062 
2063 ///
2064 /// An animation block to describe an animation sequence that continuously cycles,
2065 /// and where the logical window is cleared to the specified color before
2066 /// the next image is displayed.
2067 ///
2068 typedef EFI_HII_AIBT_CLEAR_IMAGES_BLOCK    EFI_HII_AIBT_CLEAR_IMAGES_LOOP_BLOCK;
2069 
2070 ///
2071 /// An animation block to describe an animation sequence that continuously cycles,
2072 /// and where the screen is restored to the original state before
2073 /// the next image is displayed.
2074 ///
2075 typedef EFI_HII_AIBT_RESTORE_SCRN_BLOCK    EFI_HII_AIBT_RESTORE_SCRN_LOOP_BLOCK;
2076 
2077 ///
2078 /// Assigns a new character value to a previously defined animation sequence.
2079 ///
2080 typedef struct _EFI_HII_AIBT_DUPLICATE_BLOCK {
2081   ///
2082   /// The previously defined animation ID with the exact same
2083   /// animation information.
2084   ///
2085   EFI_ANIMATION_ID  AnimationId;
2086 } EFI_HII_AIBT_DUPLICATE_BLOCK;
2087 
2088 ///
2089 /// Skips animation IDs.
2090 ///
2091 typedef struct _EFI_HII_AIBT_SKIP1_BLOCK {
2092   ///
2093   /// The unsigned 8-bit value to add to AnimationIdCurrent.
2094   ///
2095   UINT8  SkipCount;
2096 } EFI_HII_AIBT_SKIP1_BLOCK;
2097 
2098 ///
2099 /// Skips animation IDs.
2100 ///
2101 typedef struct _EFI_HII_AIBT_SKIP2_BLOCK {
2102   ///
2103   /// The unsigned 16-bit value to add to AnimationIdCurrent.
2104   ///
2105   UINT16  SkipCount;
2106 } EFI_HII_AIBT_SKIP2_BLOCK;
2107 
2108 #pragma pack()
2109 
2110 ///
2111 /// References to string tokens must use this macro to enable scanning for
2112 /// token usages.
2113 ///
2114 ///
2115 /// STRING_TOKEN is not defined in UEFI specification. But it is placed
2116 /// here for the easy access by C files and VFR source files.
2117 ///
2118 #define STRING_TOKEN(t) t
2119 
2120 ///
2121 /// IMAGE_TOKEN is not defined in UEFI specification. But it is placed
2122 /// here for the easy access by C files and VFR source files.
2123 ///
2124 #define IMAGE_TOKEN(t) t
2125 
2126 #endif
2127