]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/ConfigAccess.c
Pass correct device path to uninstall the handle on which default config access proto...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / ConfigAccess.c
index 6be0496c61240a25e2517c20ce0d095ef43e1694..117d6ea636ebd000f05920020a05e410061294de 100644 (file)
@@ -19,6 +19,32 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 BOOLEAN            mHiiPackageListUpdated = FALSE;\r
 \r
+HII_VENDOR_DEVICE_PATH  mUefiHiiVendorDevicePath = {\r
+  {\r
+    {\r
+      {\r
+        HARDWARE_DEVICE_PATH,\r
+        HW_VENDOR_DP,\r
+        {\r
+          (UINT8) (sizeof (HII_VENDOR_DEVICE_PATH_NODE)),\r
+          (UINT8) ((sizeof (HII_VENDOR_DEVICE_PATH_NODE)) >> 8)\r
+        }\r
+      },\r
+      EFI_CALLER_ID_GUID\r
+    },\r
+    0,\r
+    0\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL)),\r
+      (UINT8) ((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
 CONFIG_ACCESS_PRIVATE gConfigAccessPrivateTempate = {\r
   CONFIG_ACCESS_PRIVATE_SIGNATURE,\r
   {\r
@@ -195,20 +221,32 @@ InstallDefaultConfigAccessProtocol (
 {\r
   EFI_STATUS                                  Status;\r
   CONFIG_ACCESS_PRIVATE                       *ConfigAccessInstance;\r
+  HII_VENDOR_DEVICE_PATH                      *HiiVendorPath;\r
 \r
   ASSERT (ThunkContext->IfrPackageCount != 0);\r
 \r
-  Status = HiiLibCreateHiiDriverHandle (&ThunkContext->UefiHiiDriverHandle);\r
-  ASSERT_EFI_ERROR (Status);\r
-  \r
   ConfigAccessInstance = AllocateCopyPool (\r
                            sizeof (CONFIG_ACCESS_PRIVATE), \r
                            &gConfigAccessPrivateTempate\r
                            );\r
   ASSERT (ConfigAccessInstance != NULL);\r
-  \r
+\r
+  //\r
+  // Use memory address as unique ID to distinguish from different device paths\r
+  // This function may be called multi times by the framework HII driver.\r
+  //\r
+  HiiVendorPath = AllocateCopyPool (\r
+                           sizeof (HII_VENDOR_DEVICE_PATH), \r
+                           &mUefiHiiVendorDevicePath\r
+                           );\r
+  ASSERT (HiiVendorPath != NULL);\r
+\r
+  HiiVendorPath->Node.UniqueId = (UINT64) ((UINTN) HiiVendorPath);\r
+\r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
           &ThunkContext->UefiHiiDriverHandle,\r
+          &gEfiDevicePathProtocolGuid,          \r
+          HiiVendorPath,\r
           &gEfiHiiConfigAccessProtocolGuid,\r
           &ConfigAccessInstance->ConfigAccessProtocol,\r
           NULL\r
@@ -236,8 +274,7 @@ UninstallDefaultConfigAccessProtocol (
 {\r
   EFI_STATUS                      Status;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
-  \r
-  HiiLibDestroyHiiDriverHandle (ThunkContext->UefiHiiDriverHandle);\r
+  HII_VENDOR_DEVICE_PATH          *HiiVendorPath;\r
 \r
   Status = gBS->HandleProtocol (\r
                   ThunkContext->UefiHiiDriverHandle,\r
@@ -246,10 +283,20 @@ UninstallDefaultConfigAccessProtocol (
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = gBS->UninstallProtocolInterface (\r
+  Status = gBS->HandleProtocol (\r
+                  ThunkContext->UefiHiiDriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID **) &HiiVendorPath\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->UninstallMultipleProtocolInterfaces (\r
                   ThunkContext->UefiHiiDriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  HiiVendorPath,\r
                   &gEfiHiiConfigAccessProtocolGuid,\r
-                  ConfigAccess\r
+                  ConfigAccess,\r
+                  NULL\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r