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