1 /*++ 2 3 Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 Module Name: 13 14 UefiIfrOpCodeCreation.c 15 16 Abstract: 17 18 Library Routines to create IFR independent of string data - assume tokens already exist 19 Primarily to be used for exporting op-codes at a label in pre-defined forms. 20 21 Revision History: 22 23 --*/ 24 25 #include "UefiIfrLibrary.h" 26 27 EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID; 28 29 STATIC 30 BOOLEAN 31 IsValidQuestionFlags ( 32 IN UINT8 Flags 33 ) 34 { 35 return (BOOLEAN)((Flags & (~QUESTION_FLAGS)) ? FALSE : TRUE); 36 } 37 38 STATIC 39 BOOLEAN 40 IsValidValueType ( 41 IN UINT8 Type 42 ) 43 { 44 return (BOOLEAN)((Type <= EFI_IFR_TYPE_OTHER) ? TRUE : FALSE); 45 } 46 47 STATIC 48 BOOLEAN 49 IsValidNumricFlags ( 50 IN UINT8 Flags 51 ) 52 { 53 if (Flags & ~(EFI_IFR_NUMERIC_SIZE | EFI_IFR_DISPLAY)) { 54 return FALSE; 55 } 56 57 if ((Flags & EFI_IFR_DISPLAY) > EFI_IFR_DISPLAY_UINT_HEX) { 58 return FALSE; 59 } 60 61 return TRUE; 62 } 63 64 STATIC 65 BOOLEAN 66 IsValidCheckboxFlags ( 67 IN UINT8 Flags 68 ) 69 { 70 return (BOOLEAN)((Flags <= EFI_IFR_CHECKBOX_DEFAULT_MFG) ? TRUE : FALSE); 71 } 72 73 EFI_STATUS 74 CreateEndOpCode ( 75 IN OUT EFI_HII_UPDATE_DATA *Data 76 ) 77 { 78 EFI_IFR_END End; 79 UINT8 *LocalBuffer; 80 81 ASSERT (Data != NULL && Data->Data != NULL); 82 83 if (Data->Offset + sizeof (EFI_IFR_END) > Data->BufferSize) { 84 return EFI_BUFFER_TOO_SMALL; 85 } 86 87 End.Header.Length = (UINT8) sizeof (EFI_IFR_END); 88 End.Header.OpCode = EFI_IFR_END_OP; 89 End.Header.Scope = 0; 90 91 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 92 EfiCopyMem (LocalBuffer, &End, sizeof (EFI_IFR_END)); 93 Data->Offset += sizeof (EFI_IFR_END); 94 95 return EFI_SUCCESS; 96 } 97 98 EFI_STATUS 99 CreateDefaultOpCode ( 100 IN EFI_IFR_TYPE_VALUE *Value, 101 IN UINT8 Type, 102 IN OUT EFI_HII_UPDATE_DATA *Data 103 ) 104 { 105 EFI_IFR_DEFAULT Default; 106 UINT8 *LocalBuffer; 107 108 ASSERT (Data != NULL && Data->Data != NULL); 109 110 if ((Value == NULL) || !IsValidValueType (Type)) { 111 return EFI_INVALID_PARAMETER; 112 } 113 114 if (Data->Offset + sizeof (EFI_IFR_DEFAULT) > Data->BufferSize) { 115 return EFI_BUFFER_TOO_SMALL; 116 } 117 118 Default.Header.OpCode = EFI_IFR_DEFAULT_OP; 119 Default.Header.Length = (UINT8) sizeof (EFI_IFR_DEFAULT); 120 Default.Header.Scope = 0; 121 Default.Type = Type; 122 Default.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; 123 EfiCopyMem (&Default.Value, Value, sizeof(EFI_IFR_TYPE_VALUE)); 124 125 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 126 EfiCopyMem (LocalBuffer, &Default, sizeof (EFI_IFR_DEFAULT)); 127 Data->Offset += sizeof (EFI_IFR_DEFAULT); 128 129 return EFI_SUCCESS; 130 } 131 132 EFI_STATUS 133 CreateActionOpCode ( 134 IN EFI_QUESTION_ID QuestionId, 135 IN EFI_STRING_ID Prompt, 136 IN EFI_STRING_ID Help, 137 IN UINT8 QuestionFlags, 138 IN EFI_STRING_ID QuestionConfig, 139 IN OUT EFI_HII_UPDATE_DATA *Data 140 ) 141 { 142 EFI_IFR_ACTION Action; 143 UINT8 *LocalBuffer; 144 145 ASSERT (Data != NULL && Data->Data != NULL); 146 147 if (!IsValidQuestionFlags (QuestionFlags)) { 148 return EFI_INVALID_PARAMETER; 149 } 150 151 if (Data->Offset + sizeof (EFI_IFR_ACTION) > Data->BufferSize) { 152 return EFI_BUFFER_TOO_SMALL; 153 } 154 155 Action.Header.OpCode = EFI_IFR_ACTION_OP; 156 Action.Header.Length = (UINT8) sizeof (EFI_IFR_ACTION); 157 Action.Header.Scope = 0; 158 Action.Question.QuestionId = QuestionId; 159 Action.Question.Header.Prompt = Prompt; 160 Action.Question.Header.Help = Help; 161 Action.Question.VarStoreId = INVALID_VARSTORE_ID; 162 Action.Question.Flags = QuestionFlags; 163 Action.QuestionConfig = QuestionConfig; 164 165 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 166 EfiCopyMem (LocalBuffer, &Action, sizeof (EFI_IFR_ACTION)); 167 Data->Offset += sizeof (EFI_IFR_ACTION); 168 169 return EFI_SUCCESS; 170 } 171 172 EFI_STATUS 173 CreateSubTitleOpCode ( 174 IN EFI_STRING_ID Prompt, 175 IN EFI_STRING_ID Help, 176 IN UINT8 Flags, 177 IN UINT8 Scope, 178 IN OUT EFI_HII_UPDATE_DATA *Data 179 ) 180 { 181 EFI_IFR_SUBTITLE Subtitle; 182 UINT8 *LocalBuffer; 183 184 ASSERT (Data != NULL && Data->Data != NULL); 185 186 if (Data->Offset + sizeof (EFI_IFR_SUBTITLE) > Data->BufferSize) { 187 return EFI_BUFFER_TOO_SMALL; 188 } 189 190 Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP; 191 Subtitle.Header.Length = (UINT8) sizeof (EFI_IFR_SUBTITLE); 192 Subtitle.Header.Scope = Scope; 193 Subtitle.Statement.Prompt = Prompt; 194 Subtitle.Statement.Help = Help; 195 Subtitle.Flags = Flags; 196 197 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 198 EfiCopyMem (LocalBuffer, &Subtitle, sizeof (EFI_IFR_SUBTITLE)); 199 Data->Offset += sizeof (EFI_IFR_SUBTITLE); 200 201 return EFI_SUCCESS; 202 } 203 204 205 EFI_STATUS 206 CreateTextOpCode ( 207 IN EFI_STRING_ID Prompt, 208 IN EFI_STRING_ID Help, 209 IN EFI_STRING_ID TextTwo, 210 IN OUT EFI_HII_UPDATE_DATA *Data 211 ) 212 { 213 EFI_IFR_TEXT Text; 214 UINT8 *LocalBuffer; 215 216 ASSERT (Data != NULL && Data->Data != NULL); 217 218 if (Data->Offset + sizeof (EFI_IFR_TEXT) > Data->BufferSize) { 219 return EFI_BUFFER_TOO_SMALL; 220 } 221 222 Text.Header.OpCode = EFI_IFR_TEXT_OP; 223 Text.Header.Length = (UINT8) sizeof (EFI_IFR_TEXT); 224 Text.Header.Scope = 0; 225 Text.Statement.Prompt = Prompt; 226 Text.Statement.Help = Help; 227 Text.TextTwo = TextTwo; 228 229 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 230 EfiCopyMem (LocalBuffer, &Text, sizeof (EFI_IFR_TEXT)); 231 Data->Offset += sizeof (EFI_IFR_TEXT); 232 233 return EFI_SUCCESS; 234 } 235 236 EFI_STATUS 237 CreateGotoOpCode ( 238 IN EFI_FORM_ID FormId, 239 IN EFI_STRING_ID Prompt, 240 IN EFI_STRING_ID Help, 241 IN UINT8 QuestionFlags, 242 IN EFI_QUESTION_ID QuestionId, 243 IN OUT EFI_HII_UPDATE_DATA *Data 244 ) 245 { 246 EFI_IFR_REF Goto; 247 UINT8 *LocalBuffer; 248 249 ASSERT (Data != NULL && Data->Data != NULL); 250 251 if (!IsValidQuestionFlags (QuestionFlags)) { 252 return EFI_INVALID_PARAMETER; 253 } 254 255 if (Data->Offset + sizeof (EFI_IFR_REF) > Data->BufferSize) { 256 return EFI_BUFFER_TOO_SMALL; 257 } 258 259 Goto.Header.OpCode = EFI_IFR_REF_OP; 260 Goto.Header.Length = (UINT8) sizeof (EFI_IFR_REF); 261 Goto.Header.Scope = 0; 262 Goto.Question.Header.Prompt = Prompt; 263 Goto.Question.Header.Help = Help; 264 Goto.Question.VarStoreId = INVALID_VARSTORE_ID; 265 Goto.Question.QuestionId = QuestionId; 266 Goto.Question.Flags = QuestionFlags; 267 Goto.FormId = FormId; 268 269 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 270 EfiCopyMem (LocalBuffer, &Goto, sizeof (EFI_IFR_REF)); 271 Data->Offset += sizeof (EFI_IFR_REF); 272 273 return EFI_SUCCESS; 274 } 275 276 EFI_STATUS 277 CreateOneOfOptionOpCode ( 278 IN UINTN OptionCount, 279 IN IFR_OPTION *OptionsList, 280 IN UINT8 Type, 281 IN OUT EFI_HII_UPDATE_DATA *Data 282 ) 283 { 284 UINTN Index; 285 UINT8 *LocalBuffer; 286 EFI_IFR_ONE_OF_OPTION OneOfOption; 287 288 ASSERT (Data != NULL && Data->Data != NULL); 289 290 if ((OptionCount != 0) && (OptionsList == NULL)) { 291 return EFI_INVALID_PARAMETER; 292 } 293 294 if (Data->Offset + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) > Data->BufferSize) { 295 return EFI_BUFFER_TOO_SMALL; 296 } 297 298 for (Index = 0; Index < OptionCount; Index++) { 299 OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; 300 OneOfOption.Header.Length = (UINT8) sizeof (EFI_IFR_ONE_OF_OPTION); 301 OneOfOption.Header.Scope = 0; 302 303 OneOfOption.Option = OptionsList[Index].StringToken; 304 OneOfOption.Value = OptionsList[Index].Value; 305 OneOfOption.Flags = (UINT8)(OptionsList[Index].Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)); 306 OneOfOption.Type = Type; 307 308 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 309 EfiCopyMem (LocalBuffer, &OneOfOption, sizeof (EFI_IFR_ONE_OF_OPTION)); 310 Data->Offset += sizeof (EFI_IFR_ONE_OF_OPTION); 311 } 312 313 return EFI_SUCCESS; 314 } 315 316 EFI_STATUS 317 CreateOneOfOpCode ( 318 IN EFI_QUESTION_ID QuestionId, 319 IN EFI_VARSTORE_ID VarStoreId, 320 IN UINT16 VarOffset, 321 IN EFI_STRING_ID Prompt, 322 IN EFI_STRING_ID Help, 323 IN UINT8 QuestionFlags, 324 IN UINT8 OneOfFlags, 325 IN IFR_OPTION *OptionsList, 326 IN UINTN OptionCount, 327 IN OUT EFI_HII_UPDATE_DATA *Data 328 ) 329 { 330 UINTN Length; 331 EFI_IFR_ONE_OF OneOf; 332 UINT8 *LocalBuffer; 333 334 ASSERT (Data != NULL && Data->Data != NULL); 335 336 if (!IsValidNumricFlags (OneOfFlags) || 337 !IsValidQuestionFlags (QuestionFlags) || 338 ((OptionCount != 0) && (OptionsList == NULL))) { 339 return EFI_INVALID_PARAMETER; 340 } 341 342 Length = sizeof (EFI_IFR_ONE_OF) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END); 343 if (Data->Offset + Length > Data->BufferSize) { 344 return EFI_BUFFER_TOO_SMALL; 345 } 346 347 OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP; 348 OneOf.Header.Length = (UINT8) sizeof (EFI_IFR_ONE_OF); 349 OneOf.Header.Scope = 1; 350 OneOf.Question.Header.Prompt = Prompt; 351 OneOf.Question.Header.Help = Help; 352 OneOf.Question.QuestionId = QuestionId; 353 OneOf.Question.VarStoreId = VarStoreId; 354 OneOf.Question.VarStoreInfo.VarOffset = VarOffset; 355 OneOf.Question.Flags = QuestionFlags; 356 OneOf.Flags = OneOfFlags; 357 EfiZeroMem ((VOID *) &OneOf.data, sizeof (MINMAXSTEP_DATA)); 358 359 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 360 EfiCopyMem (LocalBuffer, &OneOf, sizeof (EFI_IFR_ONE_OF)); 361 Data->Offset += sizeof (EFI_IFR_ONE_OF); 362 363 CreateOneOfOptionOpCode (OptionCount, OptionsList, (UINT8)(OneOfFlags & EFI_IFR_NUMERIC_SIZE), Data); 364 365 CreateEndOpCode (Data); 366 367 return EFI_SUCCESS; 368 } 369 370 EFI_STATUS 371 CreateOrderedListOpCode ( 372 IN EFI_QUESTION_ID QuestionId, 373 IN EFI_VARSTORE_ID VarStoreId, 374 IN UINT16 VarOffset, 375 IN EFI_STRING_ID Prompt, 376 IN EFI_STRING_ID Help, 377 IN UINT8 QuestionFlags, 378 IN UINT8 OrderedListFlags, 379 IN UINT8 DataType, 380 IN UINT8 MaxContainers, 381 IN IFR_OPTION *OptionsList, 382 IN UINTN OptionCount, 383 IN OUT EFI_HII_UPDATE_DATA *Data 384 ) 385 { 386 UINTN Length; 387 EFI_IFR_ORDERED_LIST OrderedList; 388 UINT8 *LocalBuffer; 389 390 ASSERT (Data != NULL && Data->Data != NULL); 391 392 if (!IsValidQuestionFlags (QuestionFlags) || 393 ((OptionCount != 0) && (OptionsList == NULL))) { 394 return EFI_INVALID_PARAMETER; 395 } 396 397 if ((OrderedListFlags & (~(EFI_IFR_UNIQUE_SET | EFI_IFR_NO_EMPTY_SET))) != 0) { 398 return EFI_INVALID_PARAMETER; 399 } 400 401 Length = sizeof (EFI_IFR_ORDERED_LIST) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END); 402 if (Data->Offset + Length > Data->BufferSize) { 403 return EFI_BUFFER_TOO_SMALL; 404 } 405 406 OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP; 407 OrderedList.Header.Length = (UINT8) sizeof (EFI_IFR_ORDERED_LIST); 408 OrderedList.Header.Scope = 1; 409 OrderedList.Question.Header.Prompt = Prompt; 410 OrderedList.Question.Header.Help = Help; 411 OrderedList.Question.QuestionId = QuestionId; 412 OrderedList.Question.VarStoreId = VarStoreId; 413 OrderedList.Question.VarStoreInfo.VarOffset = VarOffset; 414 OrderedList.Question.Flags = QuestionFlags; 415 OrderedList.MaxContainers = MaxContainers; 416 OrderedList.Flags = OrderedListFlags; 417 418 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 419 EfiCopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST)); 420 Data->Offset += sizeof (EFI_IFR_ORDERED_LIST); 421 422 CreateOneOfOptionOpCode (OptionCount, OptionsList, DataType, Data); 423 424 CreateEndOpCode (Data); 425 426 return EFI_SUCCESS; 427 } 428 429 EFI_STATUS 430 CreateCheckBoxOpCode ( 431 IN EFI_QUESTION_ID QuestionId, 432 IN EFI_VARSTORE_ID VarStoreId, 433 IN UINT16 VarOffset, 434 IN EFI_STRING_ID Prompt, 435 IN EFI_STRING_ID Help, 436 IN UINT8 QuestionFlags, 437 IN UINT8 CheckBoxFlags, 438 IN OUT EFI_HII_UPDATE_DATA *Data 439 ) 440 { 441 EFI_IFR_CHECKBOX CheckBox; 442 UINT8 *LocalBuffer; 443 444 ASSERT (Data != NULL && Data->Data != NULL); 445 446 if (!IsValidQuestionFlags (QuestionFlags) || !IsValidCheckboxFlags (CheckBoxFlags)) { 447 return EFI_INVALID_PARAMETER; 448 } 449 450 if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) { 451 return EFI_BUFFER_TOO_SMALL; 452 } 453 454 CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP; 455 CheckBox.Header.Length = (UINT8) sizeof (EFI_IFR_CHECKBOX); 456 CheckBox.Header.Scope = 0; 457 CheckBox.Question.QuestionId = QuestionId; 458 CheckBox.Question.VarStoreId = VarStoreId; 459 CheckBox.Question.VarStoreInfo.VarOffset = VarOffset; 460 CheckBox.Question.Header.Prompt = Prompt; 461 CheckBox.Question.Header.Help = Help; 462 CheckBox.Question.Flags = QuestionFlags; 463 CheckBox.Flags = CheckBoxFlags; 464 465 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 466 EfiCopyMem (LocalBuffer, &CheckBox, sizeof (EFI_IFR_CHECKBOX)); 467 Data->Offset += sizeof (EFI_IFR_CHECKBOX); 468 469 return EFI_SUCCESS; 470 } 471 472 EFI_STATUS 473 CreateNumericOpCode ( 474 IN EFI_QUESTION_ID QuestionId, 475 IN EFI_VARSTORE_ID VarStoreId, 476 IN UINT16 VarOffset, 477 IN EFI_STRING_ID Prompt, 478 IN EFI_STRING_ID Help, 479 IN UINT8 QuestionFlags, 480 IN UINT8 NumericFlags, 481 IN UINT64 Minimum, 482 IN UINT64 Maximum, 483 IN UINT64 Step, 484 IN UINT64 Default, 485 IN OUT EFI_HII_UPDATE_DATA *Data 486 ) 487 { 488 EFI_STATUS Status; 489 EFI_IFR_NUMERIC Numeric; 490 MINMAXSTEP_DATA MinMaxStep; 491 EFI_IFR_TYPE_VALUE DefaultValue; 492 UINT8 *LocalBuffer; 493 494 ASSERT (Data != NULL && Data->Data != NULL); 495 496 if (!IsValidQuestionFlags (QuestionFlags) || !IsValidNumricFlags (NumericFlags)) { 497 return EFI_INVALID_PARAMETER; 498 } 499 500 if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) { 501 return EFI_BUFFER_TOO_SMALL; 502 } 503 504 Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP; 505 Numeric.Header.Length = (UINT8) sizeof (EFI_IFR_NUMERIC); 506 Numeric.Header.Scope = 1; 507 Numeric.Question.QuestionId = QuestionId; 508 Numeric.Question.VarStoreId = VarStoreId; 509 Numeric.Question.VarStoreInfo.VarOffset = VarOffset; 510 Numeric.Question.Header.Prompt = Prompt; 511 Numeric.Question.Header.Help = Help; 512 Numeric.Question.Flags = QuestionFlags; 513 Numeric.Flags = NumericFlags; 514 515 switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) { 516 case EFI_IFR_NUMERIC_SIZE_1: 517 MinMaxStep.u8.MinValue = (UINT8) Minimum; 518 MinMaxStep.u8.MaxValue = (UINT8) Maximum; 519 MinMaxStep.u8.Step = (UINT8) Step; 520 break; 521 522 case EFI_IFR_NUMERIC_SIZE_2: 523 MinMaxStep.u16.MinValue = (UINT16) Minimum; 524 MinMaxStep.u16.MaxValue = (UINT16) Maximum; 525 MinMaxStep.u16.Step = (UINT16) Step; 526 break; 527 528 case EFI_IFR_NUMERIC_SIZE_4: 529 MinMaxStep.u32.MinValue = (UINT32) Minimum; 530 MinMaxStep.u32.MaxValue = (UINT32) Maximum; 531 MinMaxStep.u32.Step = (UINT32) Step; 532 break; 533 534 case EFI_IFR_NUMERIC_SIZE_8: 535 MinMaxStep.u64.MinValue = Minimum; 536 MinMaxStep.u64.MaxValue = Maximum; 537 MinMaxStep.u64.Step = Step; 538 break; 539 } 540 541 EfiCopyMem (&Numeric.data, &MinMaxStep, sizeof (MINMAXSTEP_DATA)); 542 543 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 544 EfiCopyMem (LocalBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC)); 545 Data->Offset += sizeof (EFI_IFR_NUMERIC); 546 547 DefaultValue.u64 = Default; 548 Status = CreateDefaultOpCode (&DefaultValue, (UINT8)(NumericFlags & EFI_IFR_NUMERIC_SIZE), Data); 549 if (EFI_ERROR(Status)) { 550 return Status; 551 } 552 553 CreateEndOpCode (Data); 554 555 return EFI_SUCCESS; 556 } 557 558 EFI_STATUS 559 CreateStringOpCode ( 560 IN EFI_QUESTION_ID QuestionId, 561 IN EFI_VARSTORE_ID VarStoreId, 562 IN UINT16 VarOffset, 563 IN EFI_STRING_ID Prompt, 564 IN EFI_STRING_ID Help, 565 IN UINT8 QuestionFlags, 566 IN UINT8 StringFlags, 567 IN UINT8 MinSize, 568 IN UINT8 MaxSize, 569 IN OUT EFI_HII_UPDATE_DATA *Data 570 ) 571 { 572 EFI_IFR_STRING String; 573 UINT8 *LocalBuffer; 574 575 ASSERT (Data != NULL && Data->Data != NULL); 576 577 if (!IsValidQuestionFlags (QuestionFlags) || (StringFlags & (~EFI_IFR_STRING_MULTI_LINE))) { 578 return EFI_INVALID_PARAMETER; 579 } 580 581 if (Data->Offset + sizeof (EFI_IFR_STRING) > Data->BufferSize) { 582 return EFI_BUFFER_TOO_SMALL; 583 } 584 585 String.Header.OpCode = EFI_IFR_STRING_OP; 586 String.Header.Length = (UINT8) sizeof (EFI_IFR_STRING); 587 String.Header.Scope = 0; 588 String.Question.Header.Prompt = Prompt; 589 String.Question.Header.Help = Help; 590 String.Question.QuestionId = QuestionId; 591 String.Question.VarStoreId = VarStoreId; 592 String.Question.VarStoreInfo.VarOffset = VarOffset; 593 String.Question.Flags = QuestionFlags; 594 String.MinSize = MinSize; 595 String.MaxSize = MaxSize; 596 String.Flags = StringFlags; 597 598 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 599 EfiCopyMem (LocalBuffer, &String, sizeof (EFI_IFR_STRING)); 600 Data->Offset += sizeof (EFI_IFR_STRING); 601 602 return EFI_SUCCESS; 603 } 604 605 EFI_STATUS 606 CreateBannerOpCode ( 607 IN EFI_STRING_ID Title, 608 IN UINT16 LineNumber, 609 IN UINT8 Alignment, 610 IN OUT EFI_HII_UPDATE_DATA *Data 611 ) 612 { 613 EFI_IFR_GUID_BANNER Banner; 614 UINT8 *LocalBuffer; 615 616 ASSERT (Data != NULL && Data->Data != NULL); 617 618 if (Data->Offset + sizeof (EFI_IFR_GUID_BANNER) > Data->BufferSize) { 619 return EFI_BUFFER_TOO_SMALL; 620 } 621 622 Banner.Header.OpCode = EFI_IFR_GUID_OP; 623 Banner.Header.Length = (UINT8) sizeof (EFI_IFR_GUID_BANNER); 624 Banner.Header.Scope = 0; 625 EfiCopyMem (&Banner.Guid, &mIfrVendorGuid, sizeof (EFI_IFR_GUID)); 626 Banner.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER; 627 Banner.Title = Title; 628 Banner.LineNumber = LineNumber; 629 Banner.Alignment = Alignment; 630 631 LocalBuffer = (UINT8 *) Data->Data + Data->Offset; 632 EfiCopyMem (LocalBuffer, &Banner, sizeof (EFI_IFR_GUID_BANNER)); 633 Data->Offset += sizeof (EFI_IFR_GUID_BANNER); 634 635 return EFI_SUCCESS; 636 } 637