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