1 /** @file 2 This driver is a configuration tool for adding, deleting or modifying user 3 profiles, including gathering the necessary information to ascertain their 4 identity in the future, updating user access policy and identification 5 policy, etc. 6 7 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR> 8 This program and the accompanying materials 9 are licensed and made available under the terms and conditions of the BSD License 10 which accompanies this distribution. The full text of the license may be found at 11 http://opensource.org/licenses/bsd-license.php 12 13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 15 16 **/ 17 18 #include "UserProfileManager.h" 19 20 EFI_USER_MANAGER_PROTOCOL *mUserManager = NULL; 21 CREDENTIAL_PROVIDER_INFO *mProviderInfo = NULL; 22 UINT8 mProviderChoice; 23 UINT8 mConncetLogical; 24 USER_INFO_ACCESS mAccessInfo; 25 USER_INFO mUserInfo; 26 USER_PROFILE_MANAGER_CALLBACK_INFO *mCallbackInfo; 27 HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = { 28 { 29 { 30 HARDWARE_DEVICE_PATH, 31 HW_VENDOR_DP, 32 { 33 (UINT8) (sizeof (VENDOR_DEVICE_PATH)), 34 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) 35 } 36 }, 37 USER_PROFILE_MANAGER_GUID 38 }, 39 { 40 END_DEVICE_PATH_TYPE, 41 END_ENTIRE_DEVICE_PATH_SUBTYPE, 42 { 43 (UINT8) (END_DEVICE_PATH_LENGTH), 44 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) 45 } 46 } 47 }; 48 49 50 /** 51 Get string by string id from HII Interface. 52 53 54 @param[in] Id String ID to get the string from. 55 56 @retval CHAR16 * String from ID. 57 @retval NULL If error occurs. 58 59 **/ 60 CHAR16 * 61 GetStringById ( 62 IN EFI_STRING_ID Id 63 ) 64 { 65 // 66 // Get the current string for the current Language. 67 // 68 return HiiGetString (mCallbackInfo->HiiHandle, Id, NULL); 69 } 70 71 72 /** 73 This function gets all the credential providers in the system and saved them 74 to mProviderInfo. 75 76 @retval EFI_SUCESS Init credential provider database successfully. 77 @retval Others Fail to init credential provider database. 78 79 **/ 80 EFI_STATUS 81 InitProviderInfo ( 82 VOID 83 ) 84 { 85 EFI_STATUS Status; 86 UINTN HandleCount; 87 EFI_HANDLE *HandleBuf; 88 UINTN Index; 89 90 // 91 // Try to find all the user credential provider driver. 92 // 93 HandleCount = 0; 94 HandleBuf = NULL; 95 Status = gBS->LocateHandleBuffer ( 96 ByProtocol, 97 &gEfiUserCredential2ProtocolGuid, 98 NULL, 99 &HandleCount, 100 &HandleBuf 101 ); 102 if (EFI_ERROR (Status)) { 103 return Status; 104 } 105 106 // 107 // Get provider infomation. 108 // 109 if (mProviderInfo != NULL) { 110 FreePool (mProviderInfo); 111 } 112 mProviderInfo = AllocateZeroPool ( 113 sizeof (CREDENTIAL_PROVIDER_INFO) - 114 sizeof (EFI_USER_CREDENTIAL2_PROTOCOL *) + 115 HandleCount * sizeof (EFI_USER_CREDENTIAL2_PROTOCOL *) 116 ); 117 if (mProviderInfo == NULL) { 118 FreePool (HandleBuf); 119 return EFI_OUT_OF_RESOURCES; 120 } 121 122 mProviderInfo->Count = HandleCount; 123 for (Index = 0; Index < HandleCount; Index++) { 124 Status = gBS->HandleProtocol ( 125 HandleBuf[Index], 126 &gEfiUserCredential2ProtocolGuid, 127 (VOID **) &mProviderInfo->Provider[Index] 128 ); 129 if (EFI_ERROR (Status)) { 130 FreePool (HandleBuf); 131 FreePool (mProviderInfo); 132 mProviderInfo = NULL; 133 return Status; 134 } 135 } 136 137 FreePool (HandleBuf); 138 return EFI_SUCCESS; 139 } 140 141 142 /** 143 This function processes changes in user profile configuration. 144 145 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. 146 @param Action Specifies the type of action taken by the browser. 147 @param QuestionId A unique value which is sent to the original 148 exporting driver so that it can identify the type 149 of data to expect. 150 @param Type The type of value for the question. 151 @param Value A pointer to the data being sent to the original 152 exporting driver. 153 @param ActionRequest On return, points to the action requested by the 154 callback function. 155 156 @retval EFI_SUCCESS The callback successfully handled the action. 157 @retval Others Fail to handle the action. 158 159 **/ 160 EFI_STATUS 161 EFIAPI 162 UserProfileManagerCallback ( 163 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, 164 IN EFI_BROWSER_ACTION Action, 165 IN EFI_QUESTION_ID QuestionId, 166 IN UINT8 Type, 167 IN EFI_IFR_TYPE_VALUE *Value, 168 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest 169 ) 170 { 171 EFI_STATUS Status; 172 EFI_INPUT_KEY Key; 173 UINT32 CurrentAccessRight; 174 CHAR16 *QuestionStr; 175 CHAR16 *PromptStr; 176 VOID *StartOpCodeHandle; 177 VOID *EndOpCodeHandle; 178 EFI_IFR_GUID_LABEL *StartLabel; 179 EFI_IFR_GUID_LABEL *EndLabel; 180 EFI_USER_PROFILE_HANDLE CurrentUser; 181 182 Status = EFI_SUCCESS; 183 184 switch (Action) { 185 case EFI_BROWSER_ACTION_FORM_OPEN: 186 { 187 // 188 // Update user manage Form when user manage Form is opened. 189 // This will be done only in FORM_OPEN CallBack of question with QUESTIONID_USER_MANAGE from user manage Form. 190 // 191 if (QuestionId != QUESTIONID_USER_MANAGE) { 192 return EFI_SUCCESS; 193 } 194 195 // 196 // Get current user 197 // 198 CurrentUser = NULL; 199 mUserManager->Current (mUserManager, &CurrentUser); 200 if (CurrentUser == NULL) { 201 DEBUG ((DEBUG_ERROR, "Error: current user does not exist!\n")); 202 return EFI_NOT_READY; 203 } 204 205 // 206 // Get current user's right information. 207 // 208 Status = GetAccessRight (&CurrentAccessRight); 209 if (EFI_ERROR (Status)) { 210 CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF; 211 } 212 213 // 214 // Init credential provider information. 215 // 216 Status = InitProviderInfo (); 217 if (EFI_ERROR (Status)) { 218 return Status; 219 } 220 221 // 222 // Initialize the container for dynamic opcodes. 223 // 224 StartOpCodeHandle = HiiAllocateOpCodeHandle (); 225 ASSERT (StartOpCodeHandle != NULL); 226 227 EndOpCodeHandle = HiiAllocateOpCodeHandle (); 228 ASSERT (EndOpCodeHandle != NULL); 229 230 // 231 // Create Hii Extend Label OpCode. 232 // 233 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( 234 StartOpCodeHandle, 235 &gEfiIfrTianoGuid, 236 NULL, 237 sizeof (EFI_IFR_GUID_LABEL) 238 ); 239 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; 240 StartLabel->Number = LABEL_USER_MANAGE_FUNC; 241 242 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( 243 EndOpCodeHandle, 244 &gEfiIfrTianoGuid, 245 NULL, 246 sizeof (EFI_IFR_GUID_LABEL) 247 ); 248 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; 249 EndLabel->Number = LABEL_END; 250 251 // 252 // Add user profile option. 253 // 254 if ((CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) || 255 (CurrentAccessRight == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) 256 ) { 257 HiiCreateActionOpCode ( 258 StartOpCodeHandle, // Container for dynamic created opcodes 259 KEY_ADD_USER, // Question ID 260 STRING_TOKEN (STR_ADD_USER_TITLE), // Prompt text 261 STRING_TOKEN (STR_ADD_USER_HELP), // Help text 262 EFI_IFR_FLAG_CALLBACK, // Question flag 263 0 // Action String ID 264 ); 265 } 266 267 // 268 // Add modify user profile option. 269 // 270 HiiCreateGotoOpCode ( 271 StartOpCodeHandle, // Container for dynamic created opcodes 272 FORMID_MODIFY_USER, // Target Form ID 273 STRING_TOKEN (STR_MODIFY_USER_TITLE), // Prompt text 274 STRING_TOKEN (STR_MODIFY_USER_HELP), // Help text 275 EFI_IFR_FLAG_CALLBACK, // Question flag 276 KEY_MODIFY_USER // Question ID 277 ); 278 279 // 280 // Add delete user profile option 281 // 282 if (CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) { 283 HiiCreateGotoOpCode ( 284 StartOpCodeHandle, // Container for dynamic created opcodes 285 FORMID_DEL_USER, // Target Form ID 286 STRING_TOKEN (STR_DELETE_USER_TITLE), // Prompt text 287 STRING_TOKEN (STR_DELETE_USER_HELP), // Help text 288 EFI_IFR_FLAG_CALLBACK, // Question flag 289 KEY_DEL_USER // Question ID 290 ); 291 } 292 293 HiiUpdateForm ( 294 mCallbackInfo->HiiHandle, // HII handle 295 &gUserProfileManagerGuid, // Formset GUID 296 FORMID_USER_MANAGE, // Form ID 297 StartOpCodeHandle, // Label for where to insert opcodes 298 EndOpCodeHandle // Replace data 299 ); 300 301 HiiFreeOpCodeHandle (StartOpCodeHandle); 302 HiiFreeOpCodeHandle (EndOpCodeHandle); 303 304 return EFI_SUCCESS; 305 } 306 break; 307 308 case EFI_BROWSER_ACTION_FORM_CLOSE: 309 Status = EFI_SUCCESS; 310 break; 311 312 case EFI_BROWSER_ACTION_CHANGED: 313 { 314 // 315 // Handle the request from form. 316 // 317 if ((Value == NULL) || (ActionRequest == NULL)) { 318 return EFI_INVALID_PARAMETER; 319 } 320 321 // 322 // Judge first 2 bits. 323 // 324 switch (QuestionId & KEY_FIRST_FORM_MASK) { 325 // 326 // Add user profile operation. 327 // 328 case KEY_ADD_USER: 329 CallAddUser (); 330 break; 331 332 // 333 // Delete user profile operation. 334 // 335 case KEY_DEL_USER: 336 // 337 // Judge next 2 bits. 338 // 339 switch (QuestionId & KEY_SECOND_FORM_MASK) { 340 // 341 // Delete specified user profile. 342 // 343 case KEY_SELECT_USER: 344 DeleteUser ((UINT8) QuestionId); 345 // 346 // Update select user form after delete a user. 347 // 348 SelectUserToDelete (); 349 break; 350 351 default: 352 break; 353 } 354 break; 355 356 // 357 // Modify user profile operation. 358 // 359 case KEY_MODIFY_USER: 360 // 361 // Judge next 2 bits. 362 // 363 switch (QuestionId & KEY_SECOND_FORM_MASK) { 364 // 365 // Enter user profile information form. 366 // 367 case KEY_SELECT_USER: 368 // 369 // Judge next 3 bits. 370 // 371 switch (QuestionId & KEY_MODIFY_INFO_MASK) { 372 // 373 // Modify user name. 374 // 375 case KEY_MODIFY_NAME: 376 ModifyUserName (); 377 // 378 // Update username in parent form. 379 // 380 SelectUserToModify (); 381 break; 382 383 // 384 // Modify identity policy. 385 // 386 case KEY_MODIFY_IP: 387 // 388 // Judge next 3 bits 389 // 390 switch (QuestionId & KEY_MODIFY_IP_MASK) { 391 // 392 // Change credential provider option. 393 // 394 case KEY_MODIFY_PROV: 395 mProviderChoice = Value->u8; 396 break; 397 398 // 399 // Change logical connector. 400 // 401 case KEY_MODIFY_CONN: 402 mConncetLogical = Value->u8; 403 break; 404 405 // 406 // Save option. 407 // 408 case KEY_ADD_IP_OP: 409 AddIdentityPolicyItem (); 410 break; 411 412 // 413 // Return to user profile information form. 414 // 415 case KEY_IP_RETURN_UIF: 416 SaveIdentityPolicy (); 417 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; 418 break; 419 420 default: 421 break; 422 } 423 break; 424 425 // 426 // Modify access policy. 427 // 428 case KEY_MODIFY_AP: 429 // 430 // Judge next 3 bits. 431 // 432 switch (QuestionId & KEY_MODIFY_AP_MASK) { 433 // 434 // Change access right choice. 435 // 436 case KEY_MODIFY_RIGHT: 437 mAccessInfo.AccessRight = Value->u8; 438 break; 439 440 // 441 // Change setup choice. 442 // 443 case KEY_MODIFY_SETUP: 444 mAccessInfo.AccessSetup= Value->u8; 445 break; 446 447 // 448 // Change boot order choice. 449 // 450 case KEY_MODIFY_BOOT: 451 mAccessInfo.AccessBootOrder = Value->u32; 452 break; 453 454 // 455 // Return to user profile information form. 456 // 457 case KEY_AP_RETURN_UIF: 458 SaveAccessPolicy (); 459 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; 460 break; 461 462 default: 463 break; 464 } 465 break; 466 467 default: 468 break; 469 } 470 break; 471 472 // 473 // Access policy device path modified. 474 // 475 case KEY_MODIFY_AP_DP: 476 // 477 // Judge next 2 bits. 478 // 479 switch (QuestionId & KEY_MODIFY_DP_MASK) { 480 // 481 // Load permit device path modified. 482 // 483 case KEY_LOAD_PERMIT_MODIFY: 484 QuestionStr = GetStringById (STRING_TOKEN (STR_MOVE_TO_FORBID_LIST)); 485 PromptStr = GetStringById (STRING_TOKEN (STR_PRESS_KEY_CONTINUE)); 486 CreatePopUp ( 487 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, 488 &Key, 489 QuestionStr, 490 L"", 491 PromptStr, 492 NULL 493 ); 494 FreePool (QuestionStr); 495 FreePool (PromptStr); 496 if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) { 497 break; 498 } 499 500 AddToForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK - 1))); 501 DisplayLoadPermit (); 502 break; 503 504 // 505 // Load forbid device path modified. 506 // 507 case KEY_LOAD_FORBID_MODIFY: 508 QuestionStr = GetStringById (STRING_TOKEN (STR_MOVE_TO_PERMIT_LIST)); 509 PromptStr = GetStringById (STRING_TOKEN (STR_PRESS_KEY_CONTINUE)); 510 CreatePopUp ( 511 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, 512 &Key, 513 QuestionStr, 514 L"", 515 PromptStr, 516 NULL 517 ); 518 FreePool (QuestionStr); 519 FreePool (PromptStr); 520 if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) { 521 break; 522 } 523 524 DeleteFromForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK - 1))); 525 DisplayLoadForbid (); 526 break; 527 528 // 529 // Connect permit device path modified. 530 // 531 case KEY_CONNECT_PERMIT_MODIFY: 532 break; 533 534 // 535 // Connect forbid device path modified. 536 // 537 case KEY_CONNECT_FORBID_MODIFY: 538 break; 539 540 default: 541 break; 542 } 543 break; 544 545 default: 546 break; 547 } 548 break; 549 550 default: 551 break; 552 } 553 } 554 break; 555 556 557 case EFI_BROWSER_ACTION_CHANGING: 558 { 559 // 560 // Handle the request from form. 561 // 562 if (Value == NULL) { 563 return EFI_INVALID_PARAMETER; 564 } 565 566 // 567 // Judge first 2 bits. 568 // 569 switch (QuestionId & KEY_FIRST_FORM_MASK) { 570 // 571 // Delete user profile operation. 572 // 573 case KEY_DEL_USER: 574 // 575 // Judge next 2 bits. 576 // 577 switch (QuestionId & KEY_SECOND_FORM_MASK) { 578 // 579 // Enter delete user profile form. 580 // 581 case KEY_ENTER_NEXT_FORM: 582 SelectUserToDelete (); 583 break; 584 585 default: 586 break; 587 } 588 break; 589 590 // 591 // Modify user profile operation. 592 // 593 case KEY_MODIFY_USER: 594 // 595 // Judge next 2 bits. 596 // 597 switch (QuestionId & KEY_SECOND_FORM_MASK) { 598 // 599 // Enter modify user profile form. 600 // 601 case KEY_ENTER_NEXT_FORM: 602 SelectUserToModify (); 603 break; 604 605 // 606 // Enter user profile information form. 607 // 608 case KEY_SELECT_USER: 609 // 610 // Judge next 3 bits. 611 // 612 switch (QuestionId & KEY_MODIFY_INFO_MASK) { 613 // 614 // Display user information form. 615 // 616 case KEY_ENTER_NEXT_FORM: 617 ModifyUserInfo ((UINT8) QuestionId); 618 break; 619 620 // 621 // Modify identity policy. 622 // 623 case KEY_MODIFY_IP: 624 // 625 // Judge next 3 bits 626 // 627 switch (QuestionId & KEY_MODIFY_IP_MASK) { 628 // 629 // Display identity policy modify form. 630 // 631 case KEY_ENTER_NEXT_FORM: 632 ModifyIdentityPolicy (); 633 break; 634 635 default: 636 break; 637 } 638 break; 639 640 // 641 // Modify access policy. 642 // 643 case KEY_MODIFY_AP: 644 // 645 // Judge next 3 bits. 646 // 647 switch (QuestionId & KEY_MODIFY_AP_MASK) { 648 // 649 // Display access policy modify form. 650 // 651 case KEY_ENTER_NEXT_FORM: 652 ModidyAccessPolicy (); 653 break; 654 // 655 // Load device path form. 656 // 657 case KEY_MODIFY_LOAD: 658 // 659 // Judge next 2 bits. 660 // 661 switch (QuestionId & KEY_DISPLAY_DP_MASK) { 662 // 663 // Permit load device path. 664 // 665 case KEY_PERMIT_MODIFY: 666 DisplayLoadPermit (); 667 break; 668 669 // 670 // Forbid load device path. 671 // 672 case KEY_FORBID_MODIFY: 673 DisplayLoadForbid (); 674 break; 675 676 default: 677 break; 678 } 679 break; 680 681 // 682 // Connect device path form. 683 // 684 case KEY_MODIFY_CONNECT: 685 // 686 // Judge next 2 bits. 687 // 688 switch (QuestionId & KEY_DISPLAY_DP_MASK) { 689 // 690 // Permit connect device path. 691 // 692 case KEY_PERMIT_MODIFY: 693 DisplayConnectPermit (); 694 break; 695 696 // 697 // Forbid connect device path. 698 // 699 case KEY_FORBID_MODIFY: 700 DisplayConnectForbid (); 701 break; 702 703 default: 704 break; 705 } 706 break; 707 708 default: 709 break; 710 } 711 break; 712 713 default: 714 break; 715 } 716 break; 717 718 default: 719 break; 720 } 721 break; 722 723 default: 724 break; 725 } 726 } 727 break; 728 729 default: 730 // 731 // All other action return unsupported. 732 // 733 Status = EFI_UNSUPPORTED; 734 break; 735 } 736 737 738 return Status; 739 } 740 741 742 /** 743 This function allows a caller to extract the current configuration for one 744 or more named elements from the target driver. 745 746 747 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. 748 @param Request A null-terminated Unicode string in <ConfigRequest> format. 749 @param Progress On return, points to a character in the Request string. 750 Points to the string's null terminator if request was successful. 751 Points to the most recent '&' before the first failing name/value 752 pair (or the beginning of the string if the failure is in the 753 first name/value pair) if the request was not successful. 754 @param Results A null-terminated Unicode string in <ConfigAltResp> format which 755 has all values filled in for the names in the Request string. 756 String to be allocated by the called function. 757 758 @retval EFI_SUCCESS The Results is filled with the requested values. 759 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results. 760 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name. 761 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver. 762 763 **/ 764 EFI_STATUS 765 EFIAPI 766 FakeExtractConfig ( 767 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, 768 IN CONST EFI_STRING Request, 769 OUT EFI_STRING *Progress, 770 OUT EFI_STRING *Results 771 ) 772 { 773 if (Progress == NULL || Results == NULL) { 774 return EFI_INVALID_PARAMETER; 775 } 776 *Progress = Request; 777 return EFI_NOT_FOUND; 778 } 779 780 /** 781 This function processes the results of changes in configuration. 782 783 784 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. 785 @param Configuration A null-terminated Unicode string in <ConfigResp> format. 786 @param Progress A pointer to a string filled in with the offset of the most 787 recent '&' before the first failing name/value pair (or the 788 beginning of the string if the failure is in the first 789 name/value pair) or the terminating NULL if all was successful. 790 791 @retval EFI_SUCCESS The Results is processed successfully. 792 @retval EFI_INVALID_PARAMETER Configuration is NULL. 793 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver. 794 795 **/ 796 EFI_STATUS 797 EFIAPI 798 FakeRouteConfig ( 799 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, 800 IN CONST EFI_STRING Configuration, 801 OUT EFI_STRING *Progress 802 ) 803 { 804 if (Configuration == NULL || Progress == NULL) { 805 return EFI_INVALID_PARAMETER; 806 } 807 808 return EFI_NOT_FOUND; 809 } 810 811 812 /** 813 Main entry for this driver. 814 815 @param ImageHandle Image handle this driver. 816 @param SystemTable Pointer to SystemTable. 817 818 @retval EFI_SUCESS This function always complete successfully. 819 820 **/ 821 EFI_STATUS 822 EFIAPI 823 UserProfileManagerInit ( 824 IN EFI_HANDLE ImageHandle, 825 IN EFI_SYSTEM_TABLE *SystemTable 826 ) 827 { 828 EFI_STATUS Status; 829 USER_PROFILE_MANAGER_CALLBACK_INFO *CallbackInfo; 830 831 Status = gBS->LocateProtocol ( 832 &gEfiUserManagerProtocolGuid, 833 NULL, 834 (VOID **) &mUserManager 835 ); 836 if (EFI_ERROR (Status)) { 837 return EFI_SUCCESS; 838 } 839 840 // 841 // Initialize driver private data. 842 // 843 ZeroMem (&mUserInfo, sizeof (mUserInfo)); 844 ZeroMem (&mAccessInfo, sizeof (mAccessInfo)); 845 846 CallbackInfo = AllocateZeroPool (sizeof (USER_PROFILE_MANAGER_CALLBACK_INFO)); 847 ASSERT (CallbackInfo != NULL); 848 849 CallbackInfo->Signature = USER_PROFILE_MANAGER_SIGNATURE; 850 CallbackInfo->ConfigAccess.ExtractConfig = FakeExtractConfig; 851 CallbackInfo->ConfigAccess.RouteConfig = FakeRouteConfig; 852 CallbackInfo->ConfigAccess.Callback = UserProfileManagerCallback; 853 CallbackInfo->DriverHandle = NULL; 854 855 // 856 // Install Device Path Protocol and Config Access protocol to driver handle. 857 // 858 Status = gBS->InstallMultipleProtocolInterfaces ( 859 &CallbackInfo->DriverHandle, 860 &gEfiDevicePathProtocolGuid, 861 &mHiiVendorDevicePath, 862 &gEfiHiiConfigAccessProtocolGuid, 863 &CallbackInfo->ConfigAccess, 864 NULL 865 ); 866 ASSERT_EFI_ERROR (Status); 867 868 // 869 // Publish HII data. 870 // 871 CallbackInfo->HiiHandle = HiiAddPackages ( 872 &gUserProfileManagerGuid, 873 CallbackInfo->DriverHandle, 874 UserProfileManagerStrings, 875 UserProfileManagerVfrBin, 876 NULL 877 ); 878 ASSERT (CallbackInfo->HiiHandle != NULL); 879 mCallbackInfo = CallbackInfo; 880 881 return Status; 882 } 883 884 885