]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
Add ASSERT() check for StringInfo pointer.
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
index 64805ff83df10dc4b7880ceba95288d9487cdd0a..8351a3279c19e5e79d41a921be6dc21593a8dc8e 100644 (file)
@@ -16,13 +16,66 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "DriverSample.h"\r
 \r
-#define DISPLAY_ONLY_MY_ITEM  0x0002\r
+#define DISPLAY_ONLY_MY_ITEM  0x0000\r
 \r
 EFI_GUID   mFormSetGuid = FORMSET_GUID;\r
 EFI_GUID   mInventoryGuid = INVENTORY_GUID;\r
 \r
 CHAR16     VariableName[] = L"MyIfrNVData";\r
 \r
+EFI_HANDLE                      DriverHandle[2] = {NULL, NULL};\r
+DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData = NULL;\r
+\r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath0 = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    //\r
+    // {C153B68D-EBFC-488e-B110-662867745B87}\r
+    //\r
+    { 0xc153b68d, 0xebfc, 0x488e, { 0xb1, 0x10, 0x66, 0x28, 0x67, 0x74, 0x5b, 0x87 } }\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath1 = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    //\r
+    // {06F37F07-0C48-40e9-8436-0A08A0BB76B0}\r
+    //\r
+    { 0x6f37f07, 0xc48, 0x40e9, { 0x84, 0x36, 0xa, 0x8, 0xa0, 0xbb, 0x76, 0xb0 } }\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
 /**\r
   Encode the password using a simple algorithm.\r
   \r
@@ -33,7 +86,7 @@ CHAR16     VariableName[] = L"MyIfrNVData";
 VOID\r
 EncodePassword (\r
   IN  CHAR16                      *Password,\r
-  IN  UINT8                       MaxSize\r
+  IN  UINTN                       MaxSize\r
   )\r
 {\r
   UINTN   Index;\r
@@ -167,6 +220,7 @@ SetPassword (
   EFI_STATUS                      Status;\r
   UINTN                           BufferSize;\r
   CHAR16                          *Password;\r
+  UINTN                           PasswordSize;\r
   DRIVER_SAMPLE_CONFIGURATION     *Configuration;\r
 \r
   //\r
@@ -188,7 +242,9 @@ SetPassword (
   // Get user input password\r
   //\r
   Password = &PrivateData->Configuration.WhatIsThePassword2[0];\r
-  ZeroMem (Password, 20 * sizeof (CHAR16));\r
+  PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2);\r
+  \r
+  ZeroMem (Password, PasswordSize);\r
   Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -205,7 +261,7 @@ SetPassword (
     //\r
     // Update password's clear text in the screen\r
     //\r
-    CopyMem (Configuration->PasswordClearText, Password, 20 * sizeof (CHAR16));\r
+    CopyMem (Configuration->PasswordClearText, Password, PasswordSize);\r
 \r
     //\r
     // Update uncommitted data of Browser\r
@@ -224,7 +280,7 @@ SetPassword (
   //\r
   // Set password\r
   //\r
-  EncodePassword (Password, 20 * sizeof (CHAR16));\r
+  EncodePassword (Password, PasswordSize);\r
   Status = gRT->SetVariable(\r
                   VariableName,\r
                   &mFormSetGuid,\r
@@ -686,8 +742,6 @@ DriverSampleInit (
   EFI_STATUS                      SavedStatus;\r
   EFI_HII_PACKAGE_LIST_HEADER     *PackageList;\r
   EFI_HII_HANDLE                  HiiHandle[2];\r
-  EFI_HANDLE                      DriverHandle[2];\r
-  DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData;\r
   EFI_SCREEN_DESCRIPTOR           Screen;\r
   EFI_HII_DATABASE_PROTOCOL       *HiiDatabase;\r
   EFI_HII_STRING_PROTOCOL         *HiiString;\r
@@ -763,23 +817,18 @@ DriverSampleInit (
   }\r
   PrivateData->HiiConfigRouting = HiiConfigRouting;\r
 \r
-  //\r
-  // Install Config Access protocol\r
-  //\r
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle[0]);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  PrivateData->DriverHandle[0] = DriverHandle[0];\r
-\r
-  Status = gBS->InstallProtocolInterface (\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &DriverHandle[0],\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mHiiVendorDevicePath0,\r
                   &gEfiHiiConfigAccessProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &PrivateData->ConfigAccess\r
+                  &PrivateData->ConfigAccess,\r
+                  NULL\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  PrivateData->DriverHandle[0] = DriverHandle[0];\r
+\r
   //\r
   // Publish our HII data\r
   //\r
@@ -808,10 +857,14 @@ DriverSampleInit (
   //\r
   // Publish another Fromset\r
   //\r
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle[1]);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &DriverHandle[1],\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mHiiVendorDevicePath1,\r
+                  NULL\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   PrivateData->DriverHandle[1] = DriverHandle[1];\r
 \r
   PackageList = HiiLibPreparePackageList (\r
@@ -885,40 +938,68 @@ DriverSampleInit (
   //\r
   // Example of how to display only the item we sent to HII\r
   //\r
-  if (DISPLAY_ONLY_MY_ITEM == 0x0001) {\r
-    //\r
-    // Have the browser pull out our copy of the data, and only display our data\r
-    //\r
-    //    Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);\r
-    //\r
-    Status = FormBrowser2->SendForm (\r
-                             FormBrowser2,\r
-                             HiiHandle,\r
-                             1,\r
-                             NULL,\r
-                             0,\r
-                             NULL,\r
-                             NULL\r
-                             );\r
-    SavedStatus = Status;\r
-\r
-    Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
+  //\r
+  // Have the browser pull out our copy of the data, and only display our data\r
+  //\r
+  Status = FormBrowser2->SendForm (\r
+                           FormBrowser2,\r
+                           &(HiiHandle[DISPLAY_ONLY_MY_ITEM]),\r
+                           1,\r
+                           NULL,\r
+                           0,\r
+                           NULL,\r
+                           NULL\r
+                           );\r
+  SavedStatus = Status;\r
 \r
-    Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
+  Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
 \r
-    return SavedStatus;\r
-  } else {\r
-    //\r
-    // Have the browser pull out all the data in the HII Database and display it.\r
-    //\r
-    //    Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);\r
-    //\r
+  Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  return SavedStatus;\r
+}\r
+\r
+/**\r
+  Unloads the application and its installed protocol.\r
+\r
+  @param[in]  ImageHandle       Handle that identifies the image to be unloaded.\r
+\r
+  @retval EFI_SUCCESS           The image has been unloaded.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DriverSampleUnload (\r
+  IN EFI_HANDLE  ImageHandle\r
+  )\r
+{\r
+  if (DriverHandle[0] != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+            DriverHandle[0],\r
+            &gEfiDevicePathProtocolGuid,\r
+            &mHiiVendorDevicePath0,\r
+            &gEfiHiiConfigAccessProtocolGuid,\r
+            &PrivateData->ConfigAccess,\r
+            NULL\r
+           );\r
+  }\r
+\r
+  if (DriverHandle[1] != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+            DriverHandle[1],\r
+            &gEfiDevicePathProtocolGuid,\r
+            &mHiiVendorDevicePath1,\r
+            NULL\r
+           );\r
+  }\r
+\r
+  if (PrivateData != NULL) {\r
+    FreePool (PrivateData);\r
   }\r
 \r
   return EFI_SUCCESS;\r