ArmPkg/ArmMmuLib ARM: fix thinko in second level page table handling
[mirror_edk2.git] / SecurityPkg / UserIdentification / UserProfileManagerDxe / UserProfileManager.c
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
7 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
8 (C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
9 This program and the accompanying materials\r
10 are licensed and made available under the terms and conditions of the BSD License\r
11 which accompanies this distribution.  The full text of the license may be found at\r
12 http://opensource.org/licenses/bsd-license.php\r
13 \r
14 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
15 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
16 \r
17 **/\r
18 \r
19 #include "UserProfileManager.h"\r
20 \r
21 EFI_USER_MANAGER_PROTOCOL *mUserManager           = NULL;\r
22 CREDENTIAL_PROVIDER_INFO  *mProviderInfo          = NULL;\r
23 UINT8                     mProviderChoice;\r
24 UINT8                     mConncetLogical;\r
25 USER_INFO_ACCESS          mAccessInfo;\r
26 USER_INFO                 mUserInfo;\r
27 USER_PROFILE_MANAGER_CALLBACK_INFO  *mCallbackInfo;\r
28 HII_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     USER_PROFILE_MANAGER_GUID\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
61 CHAR16 *\r
62 GetStringById (\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
81 EFI_STATUS\r
82 InitProviderInfo (\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                   &gEfiUserCredential2ProtocolGuid,\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_CREDENTIAL2_PROTOCOL *) +\r
116                     HandleCount * sizeof (EFI_USER_CREDENTIAL2_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                     &gEfiUserCredential2ProtocolGuid,\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
161 EFI_STATUS\r
162 EFIAPI\r
163 UserProfileManagerCallback (\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         &gUserProfileManagerGuid,               // 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_CHANGED:\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       // Delete specified user profile.\r
343       //\r
344       case KEY_SELECT_USER:\r
345         DeleteUser ((UINT8) QuestionId);\r
346         //\r
347         // Update select user form after delete a user.\r
348         //\r
349         SelectUserToDelete ();\r
350         break;\r
351 \r
352       default:\r
353         break;\r
354       }\r
355       break;\r
356 \r
357     //\r
358     // Modify user profile operation.\r
359     //\r
360     case KEY_MODIFY_USER:\r
361       //\r
362       // Judge next 2 bits.\r
363       //\r
364       switch (QuestionId & KEY_SECOND_FORM_MASK) {\r
365       //\r
366       // Enter user profile information form.\r
367       //\r
368       case KEY_SELECT_USER:\r
369         //\r
370         // Judge next 3 bits.\r
371         //\r
372         switch (QuestionId & KEY_MODIFY_INFO_MASK) {\r
373         //\r
374         // Modify user name.\r
375         //\r
376         case KEY_MODIFY_NAME:\r
377           ModifyUserName ();\r
378           //\r
379           // Update username in parent form.\r
380           //\r
381           SelectUserToModify ();\r
382           break;\r
383 \r
384         //\r
385         // Modify identity policy.\r
386         //\r
387         case KEY_MODIFY_IP:\r
388           //\r
389           // Judge next 3 bits\r
390           //\r
391           switch (QuestionId & KEY_MODIFY_IP_MASK) {\r
392           //\r
393           // Change credential provider option.\r
394           //\r
395           case KEY_MODIFY_PROV:\r
396             mProviderChoice = Value->u8;\r
397             break;\r
398 \r
399           //\r
400           // Change logical connector.\r
401           //\r
402           case KEY_MODIFY_CONN:\r
403             mConncetLogical = Value->u8;\r
404             break;\r
405 \r
406           //\r
407           // Save option.\r
408           //\r
409           case KEY_ADD_IP_OP:\r
410             AddIdentityPolicyItem ();\r
411             break;\r
412 \r
413           //\r
414           // Return to user profile information form.\r
415           //\r
416           case KEY_IP_RETURN_UIF:\r
417             SaveIdentityPolicy ();\r
418             *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
419             break;\r
420 \r
421           default:\r
422             break;\r
423           }\r
424           break;\r
425 \r
426         //\r
427         // Modify access policy.\r
428         //\r
429         case KEY_MODIFY_AP:\r
430           //\r
431           // Judge next 3 bits.\r
432           //\r
433           switch (QuestionId & KEY_MODIFY_AP_MASK) {\r
434           //\r
435           // Change access right choice.\r
436           //\r
437           case KEY_MODIFY_RIGHT:\r
438             mAccessInfo.AccessRight = Value->u8;\r
439             break;\r
440 \r
441           //\r
442           // Change setup choice.\r
443           //\r
444           case KEY_MODIFY_SETUP:\r
445             mAccessInfo.AccessSetup= Value->u8;\r
446             break;\r
447 \r
448           //\r
449           // Change boot order choice.\r
450           //\r
451           case KEY_MODIFY_BOOT:\r
452             mAccessInfo.AccessBootOrder = Value->u32;\r
453             break;\r
454 \r
455           //\r
456           // Return to user profile information form.\r
457           //\r
458           case KEY_AP_RETURN_UIF:\r
459             SaveAccessPolicy ();\r
460             *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
461             break;\r
462 \r
463           default:\r
464             break;\r
465           }\r
466           break;\r
467 \r
468         default:\r
469           break;\r
470         }\r
471         break;\r
472 \r
473       //\r
474       // Access policy device path modified.\r
475       //\r
476       case KEY_MODIFY_AP_DP:\r
477         //\r
478         // Judge next 2 bits.\r
479         //\r
480         switch (QuestionId & KEY_MODIFY_DP_MASK) {\r
481         //\r
482         // Load permit device path modified.\r
483         //\r
484         case KEY_LOAD_PERMIT_MODIFY:\r
485           QuestionStr = GetStringById (STRING_TOKEN (STR_MOVE_TO_FORBID_LIST));\r
486           PromptStr   = GetStringById (STRING_TOKEN (STR_PRESS_KEY_CONTINUE));\r
487           CreatePopUp (\r
488             EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
489             &Key,\r
490             QuestionStr,\r
491             L"",\r
492             PromptStr,\r
493             NULL\r
494             );\r
495           FreePool (QuestionStr);\r
496           FreePool (PromptStr);\r
497           if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) {\r
498             break;\r
499           }\r
500 \r
501           AddToForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK - 1)));\r
502           DisplayLoadPermit ();\r
503           break;\r
504 \r
505         //\r
506         // Load forbid device path modified.\r
507         //\r
508         case KEY_LOAD_FORBID_MODIFY:\r
509           QuestionStr = GetStringById (STRING_TOKEN (STR_MOVE_TO_PERMIT_LIST));\r
510           PromptStr   = GetStringById (STRING_TOKEN (STR_PRESS_KEY_CONTINUE));\r
511           CreatePopUp (\r
512             EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
513             &Key,\r
514             QuestionStr,\r
515             L"",\r
516             PromptStr,\r
517             NULL\r
518             );\r
519           FreePool (QuestionStr);\r
520           FreePool (PromptStr);\r
521           if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) {\r
522             break;\r
523           }\r
524 \r
525           DeleteFromForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK - 1)));\r
526           DisplayLoadForbid ();\r
527           break;\r
528 \r
529         //\r
530         // Connect permit device path modified.\r
531         //\r
532         case KEY_CONNECT_PERMIT_MODIFY:\r
533           break;\r
534 \r
535         //\r
536         // Connect forbid device path modified.\r
537         //\r
538         case KEY_CONNECT_FORBID_MODIFY:\r
539           break;\r
540 \r
541         default:\r
542           break;\r
543         }\r
544         break;\r
545 \r
546       default:\r
547         break;\r
548       }\r
549       break;\r
550 \r
551     default:\r
552       break;\r
553     }\r
554   }\r
555   break;\r
556 \r
557 \r
558   case EFI_BROWSER_ACTION_CHANGING:\r
559   {\r
560     //\r
561     // Handle the request from form.\r
562     //\r
563     if (Value == NULL) {\r
564       return EFI_INVALID_PARAMETER;\r
565     }\r
566 \r
567     //\r
568     // Judge first 2 bits.\r
569     //\r
570     switch (QuestionId & KEY_FIRST_FORM_MASK) {\r
571     //\r
572     // Delete user profile operation.\r
573     //\r
574     case KEY_DEL_USER:\r
575       //\r
576       // Judge next 2 bits.\r
577       //\r
578       switch (QuestionId & KEY_SECOND_FORM_MASK) {\r
579       //\r
580       // Enter delete user profile form.\r
581       //\r
582       case KEY_ENTER_NEXT_FORM:\r
583         SelectUserToDelete ();\r
584         break;\r
585 \r
586       default:\r
587         break;\r
588       }\r
589       break;\r
590 \r
591     //\r
592     // Modify user profile operation.\r
593     //\r
594     case KEY_MODIFY_USER:\r
595       //\r
596       // Judge next 2 bits.\r
597       //\r
598       switch (QuestionId & KEY_SECOND_FORM_MASK) {\r
599       //\r
600       // Enter modify user profile form.\r
601       //\r
602       case KEY_ENTER_NEXT_FORM:\r
603         SelectUserToModify ();\r
604         break;\r
605 \r
606       //\r
607       // Enter user profile information form.\r
608       //\r
609       case KEY_SELECT_USER:\r
610         //\r
611         // Judge next 3 bits.\r
612         //\r
613         switch (QuestionId & KEY_MODIFY_INFO_MASK) {\r
614         //\r
615         // Display user information form.\r
616         //\r
617         case KEY_ENTER_NEXT_FORM:\r
618           ModifyUserInfo ((UINT8) QuestionId);\r
619           break;\r
620 \r
621         //\r
622         // Modify identity policy.\r
623         //\r
624         case KEY_MODIFY_IP:\r
625           //\r
626           // Judge next 3 bits\r
627           //\r
628           switch (QuestionId & KEY_MODIFY_IP_MASK) {\r
629           //\r
630           // Display identity policy modify form.\r
631           //\r
632           case KEY_ENTER_NEXT_FORM:\r
633             ModifyIdentityPolicy ();\r
634             break;\r
635 \r
636           default:\r
637             break;\r
638           }\r
639           break;\r
640 \r
641         //\r
642         // Modify access policy.\r
643         //\r
644         case KEY_MODIFY_AP:\r
645           //\r
646           // Judge next 3 bits.\r
647           //\r
648           switch (QuestionId & KEY_MODIFY_AP_MASK) {\r
649           //\r
650           // Display access policy modify form.\r
651           //\r
652           case KEY_ENTER_NEXT_FORM:\r
653             ModidyAccessPolicy ();\r
654             break;\r
655           //\r
656           // Load device path form.\r
657           //\r
658           case KEY_MODIFY_LOAD:\r
659             //\r
660             // Judge next 2 bits.\r
661             //\r
662             switch (QuestionId & KEY_DISPLAY_DP_MASK) {\r
663             //\r
664             // Permit load device path.\r
665             //\r
666             case KEY_PERMIT_MODIFY:\r
667               DisplayLoadPermit ();\r
668               break;\r
669 \r
670             //\r
671             // Forbid load device path.\r
672             //\r
673             case KEY_FORBID_MODIFY:\r
674               DisplayLoadForbid ();\r
675               break;\r
676 \r
677             default:\r
678               break;\r
679             }\r
680             break;\r
681 \r
682           //\r
683           // Connect device path form.\r
684           //\r
685           case KEY_MODIFY_CONNECT:\r
686             //\r
687             // Judge next 2 bits.\r
688             //\r
689             switch (QuestionId & KEY_DISPLAY_DP_MASK) {\r
690             //\r
691             // Permit connect device path.\r
692             //\r
693             case KEY_PERMIT_MODIFY:\r
694               DisplayConnectPermit ();\r
695               break;\r
696 \r
697             //\r
698             // Forbid connect device path.\r
699             //\r
700             case KEY_FORBID_MODIFY:\r
701               DisplayConnectForbid ();\r
702               break;\r
703 \r
704             default:\r
705               break;\r
706             }\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
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
765 EFI_STATUS\r
766 EFIAPI\r
767 FakeExtractConfig (\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
797 EFI_STATUS\r
798 EFIAPI\r
799 FakeRouteConfig (\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   *Progress = Configuration;\r
810 \r
811   return EFI_NOT_FOUND;\r
812 }\r
813 \r
814 \r
815 /**\r
816   Main entry for this driver.\r
817 \r
818   @param ImageHandle     Image handle this driver.\r
819   @param SystemTable     Pointer to SystemTable.\r
820 \r
821   @retval EFI_SUCESS     This function always complete successfully.\r
822 \r
823 **/\r
824 EFI_STATUS\r
825 EFIAPI\r
826 UserProfileManagerInit (\r
827   IN EFI_HANDLE                       ImageHandle,\r
828   IN EFI_SYSTEM_TABLE                 *SystemTable\r
829   )\r
830 {\r
831   EFI_STATUS                          Status;\r
832   USER_PROFILE_MANAGER_CALLBACK_INFO  *CallbackInfo;\r
833 \r
834   Status = gBS->LocateProtocol (\r
835                   &gEfiUserManagerProtocolGuid,\r
836                   NULL,\r
837                   (VOID **) &mUserManager\r
838                   );\r
839   if (EFI_ERROR (Status)) {\r
840     return EFI_SUCCESS;\r
841   }\r
842 \r
843   //\r
844   // Initialize driver private data.\r
845   //\r
846   ZeroMem (&mUserInfo, sizeof (mUserInfo));\r
847   ZeroMem (&mAccessInfo, sizeof (mAccessInfo));\r
848 \r
849   CallbackInfo = AllocateZeroPool (sizeof (USER_PROFILE_MANAGER_CALLBACK_INFO));\r
850   ASSERT (CallbackInfo != NULL);\r
851 \r
852   CallbackInfo->Signature                   = USER_PROFILE_MANAGER_SIGNATURE;\r
853   CallbackInfo->ConfigAccess.ExtractConfig  = FakeExtractConfig;\r
854   CallbackInfo->ConfigAccess.RouteConfig    = FakeRouteConfig;\r
855   CallbackInfo->ConfigAccess.Callback       = UserProfileManagerCallback;\r
856   CallbackInfo->DriverHandle                = NULL;\r
857 \r
858   //\r
859   // Install Device Path Protocol and Config Access protocol to driver handle.\r
860   //\r
861   Status = gBS->InstallMultipleProtocolInterfaces (\r
862                   &CallbackInfo->DriverHandle,\r
863                   &gEfiDevicePathProtocolGuid,\r
864                   &mHiiVendorDevicePath,\r
865                   &gEfiHiiConfigAccessProtocolGuid,\r
866                   &CallbackInfo->ConfigAccess,\r
867                   NULL\r
868                   );\r
869   ASSERT_EFI_ERROR (Status);\r
870 \r
871   //\r
872   // Publish HII data.\r
873   //\r
874   CallbackInfo->HiiHandle = HiiAddPackages (\r
875                               &gUserProfileManagerGuid,\r
876                               CallbackInfo->DriverHandle,\r
877                               UserProfileManagerStrings,\r
878                               UserProfileManagerVfrBin,\r
879                               NULL\r
880                               );\r
881   ASSERT (CallbackInfo->HiiHandle != NULL);\r
882   mCallbackInfo = CallbackInfo;\r
883 \r
884   return Status;\r
885 }\r
886 \r
887 \r