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