From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (NAM12-BN8-obe.outbound.protection.outlook.com [40.92.21.82]) by mx.groups.io with SMTP id smtpd.web11.1473.1596784577312995554 for ; Fri, 07 Aug 2020 00:16:17 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@outlook.com header.s=selector1 header.b=AqvcTBhv; spf=pass (domain: outlook.com, ip: 40.92.21.82, mailfrom: michael.kubacki@outlook.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=A+WUyOxiGZkz8qsRGSSLSoIARI0qisWpO8fcDGoAB0k+8EOR7defKcpij0zjmACB6+IWDPSxuzgzgQwU93OjQAVHouU2FU56cM9W8vkxIbubpUEttS1a83YRsm2cwFLqVEXms6qefrkMIv4uJUaMwV+q+3YJm4DkIDkIWTUgkQEXdKfUqOHZfLQtgxwzPik/+UqbC3DHpvibcbNcAw6KMH943TwOcKbcZzY84gZGqTFa/wwc4G4QvRpYpQ9SSrmPxcq/rirwYyZNEwCS+I30tBrs5Vy0hhTZ7uzM1kKuSDK0DSGupjZdZ+2HjEl/4M634tmh+BjvclZ31eiBwA5i+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=w3uG1j9HY1gZUXSVfZpelWJPoLMnKO7cjaaooVMygsI=; b=XazHSA5QTslw+0GGHYLh5OQDeLPrOJm4ffhSCOuPigcplCZsWBuwNp8ASqIPtsLv34HQ1Loftm095yz2QgQSaYRwn4NtnTQS0fHgEMkiA/XuELQVry14pzGo5LED6tGHBREMcyVBE+kWAYLnvV3imW1HGYW7TGlX4vjK0GQgcqscVpHUqZlNFobgGyJVoqtXxL5tCDPZ7RZF6CnaUNazA9LScEVHPvlZ4vQfqKngNKX+C+bLA/b/ccPSHMSOUBAQqi9iIkN7fKMhn+/wRWfDU3qhvASlRLkr+jfEMk4KMYGlnZ9kkrIFCIf8PlUo/ZUQo0ZWzZYPHN51MeBc141bSQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=w3uG1j9HY1gZUXSVfZpelWJPoLMnKO7cjaaooVMygsI=; b=AqvcTBhvW0SEF/0IoBUS/0iUrM53x3sepvHxkxsC/LQ/R6o26c9wwPT9522yDE0qxEoZeV07lSI7zApJIihTgjONp4t0A+fJESaTcUisVynkJmQxFgzUDL2N43fAdvVqqnrhAuAjC0tMfOkrAY7GI+vmxf1XV7FM+ZGfvfkVnF4btIoY7CfjYULNMR1T2g8SS3b22t7aV3Pqh+iFTcBeCKG29VLFTIDZ9BEsusqMOMzeuZCY7YNLHCcuLEnn6TZ0/Tjsofw5TB7tU0SZ1k7I5Y6pd/IJ3BnpvYt71dTv2fdrAKi1e2/aElbZvLBEbthXccwb0RCeMDUNz9n9/se7mQ== Received: from BN8NAM12FT047.eop-nam12.prod.protection.outlook.com (2a01:111:e400:fc66::45) by BN8NAM12HT105.eop-nam12.prod.protection.outlook.com (2a01:111:e400:fc66::215) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.10; Fri, 7 Aug 2020 07:16:16 +0000 Received: from MWHPR07MB3440.namprd07.prod.outlook.com (2a01:111:e400:fc66::49) by BN8NAM12FT047.mail.protection.outlook.com (2a01:111:e400:fc66::318) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.10 via Frontend Transport; Fri, 7 Aug 2020 07:16:16 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:06FC9B57682BE67013255CAB68914E0E1931D89CCF969BB7B45F05AD3BF2F5E2;UpperCasedChecksum:6BD569A5E593F4BBF8B07C7667E3D291CD6864D63D42266BD953E43D37A56761;SizeAsReceived:7808;Count:49 Received: from MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::9856:570e:1735:974e]) by MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::9856:570e:1735:974e%7]) with mapi id 15.20.3261.019; Fri, 7 Aug 2020 07:16:16 +0000 From: "Michael Kubacki" To: devel@edk2.groups.io CC: Liming Gao , Michael D Kinney , Guomin Jiang , Wei6 Xu Subject: [PATCH v1 7/7] FmpDevicePkg/FmpDeviceLib: Add Last Attempt Status to Check/Set API Date: Fri, 7 Aug 2020 00:15:26 -0700 Message-ID: X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20200807071526.1837-1-michael.kubacki@outlook.com> References: <20200807071526.1837-1-michael.kubacki@outlook.com> X-ClientProxiedBy: MWHPR15CA0042.namprd15.prod.outlook.com (2603:10b6:300:ad::28) To MWHPR07MB3440.namprd07.prod.outlook.com (2603:10b6:301:69::28) Return-Path: michael.kubacki@outlook.com X-Microsoft-Original-Message-ID: <20200807071526.1837-8-michael.kubacki@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (2001:4898:80e8:a:adbb:8e69:1fd3:409e) by MWHPR15CA0042.namprd15.prod.outlook.com (2603:10b6:300:ad::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3261.19 via Frontend Transport; Fri, 7 Aug 2020 07:16:15 +0000 X-Mailer: git-send-email 2.28.0.windows.1 X-Microsoft-Original-Message-ID: <20200807071526.1837-8-michael.kubacki@outlook.com> X-TMN: [Ixw2Z5iv32v6ZwUI2TdE2NKB9Q1o4Secc/VCWmLnQ0ebg0jaaAy7NBtMGGqkxhyF] X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 49 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 6f1b9d8c-1f0f-492c-220d-08d83aa1c5ef X-MS-TrafficTypeDiagnostic: BN8NAM12HT105: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: cb89UxsZGIYYRp1ZdYprli/K0JhU3HmqTuljAe96YxzUADD7ZmLla8a2RC2gDRRnLu3h6T/V5qLiE0D/HiplyXjcGlhK308wdd9D+7Nkaz2UYEgF6+8uXg1Hom4LDJ/7r7wMeGpqOEsT67/3QOtGs8Y+kVB8led0zqO9m0vOOrqENx6c9+DBx7HcNU7n2O1x5ZZPRB0XxCMU5+0k11h2gw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:0;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR07MB3440.namprd07.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:;DIR:OUT;SFP:1901; X-MS-Exchange-AntiSpam-MessageData: jVE5D/cBwzzj0ufORwnlgOl2phHQOe8UrljEu7xaFBkuOYsUXUaheM1OVTSDbeifEudu8NJCno386vTxK3bb1+tqAGDDgUxJ+l8e8bmCaD+em/y6RaX0UCOrqvhEy3zRPRqYi5yUuqttY5bypO6kGSPAbZ61pURQwD4sZW/1wSl8cy73YOY1FGi78PHhpcQyp+0XQAQebNnuALwGFXJ/BA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6f1b9d8c-1f0f-492c-220d-08d83aa1c5ef X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Aug 2020 07:16:15.9823 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: BN8NAM12FT047.eop-nam12.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN8NAM12HT105 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain From: Michael Kubacki Provides the ability for a given FMP device library instance to return a Last Attempt Status code during FmpDeviceCheckImage() and FmpDeviceSetImage(). Cc: Liming Gao Cc: Michael D Kinney Cc: Guomin Jiang Cc: Wei6 Xu Signed-off-by: Michael Kubacki --- FmpDevicePkg/FmpDxe/FmpDxe.c | 36 +++++++++++++++- FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c | 42 ++++++++++++----= --- FmpDevicePkg/Include/LastAttemptStatus.h | 6 ++- FmpDevicePkg/Include/Library/FmpDeviceLib.h | 44 +++++++++++++---= ---- 4 files changed, 97 insertions(+), 31 deletions(-) diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c index 84a8e15cfc17..9f55e6ba5f5d 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxe.c +++ b/FmpDevicePkg/FmpDxe/FmpDxe.c @@ -1020,14 +1020,32 @@ CheckTheImageInternal ( } RawSize =3D ImageSize - AllHeaderSize; =20 + // + // Set LastAttemptStatus to successful prior to getting any potential er= ror codes from FmpDeviceLib + // + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_SUCCESS; + // // FmpDeviceLib CheckImage function to do any specific checks // - Status =3D FmpDeviceCheckImage ((((UINT8 *)Image) + AllHeaderSize), RawS= ize, ImageUpdatable); + Status =3D FmpDeviceCheckImage ((((UINT8 *)Image) + AllHeaderSize), RawS= ize, ImageUpdatable, LastAttemptStatus); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - FmpDeviceLib Check= Image failed. Status =3D %r\n", mImageIdName, Status)); } =20 + // + // LastAttemptStatus returned from the device library should either be a= generic UEFI Specification defined value or + // fall within the designated LAST_ATTEMPT_STATUS_LIBRARY_ERROR range + // + if ( + (*LastAttemptStatus < LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ERROR_CO= DE && + *LastAttemptStatus >=3D LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VEN= DOR_RANGE_MIN) || + (*LastAttemptStatus > LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ERROR_CO= DE)) { + DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - LastAttemptStatus = from FmpDeviceCheckImage is invalid.\n", mImageIdName)); + ASSERT (FALSE); + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; + } + cleanup: return Status; } @@ -1356,8 +1374,22 @@ SetTheImage ( VendorCode, FmpDxeProgress, IncomingFwVersion, - AbortReason + AbortReason, + &LastAttemptStatus ); + // + // LastAttemptStatus returned from the device library should either be a= generic UEFI Specification defined value or + // fall within the designated LAST_ATTEMPT_STATUS_LIBRARY_ERROR range + // + if ( + (LastAttemptStatus < LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ERROR_COD= E && + LastAttemptStatus >=3D LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VEND= OR_RANGE_MIN) || + (LastAttemptStatus > LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ERROR_COD= E)) { + DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() - LastAttemptStatus fr= om FmpDeviceSetImage is invalid.\n", mImageIdName)); + ASSERT (FALSE); + LastAttemptStatus =3D LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; + } + if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): SetTheImage() SetImage from FmpDevic= eLib failed. Status =3D %r.\n", mImageIdName, Status)); goto cleanup; diff --git a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c b/FmpDevi= cePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c index 316de12e910c..d08b5b82d42f 100644 --- a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c +++ b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c @@ -2,7 +2,7 @@ Provides firmware device specific services to support updates of a firmw= are image stored in a firmware device. =20 - Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation.
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent @@ -380,17 +380,22 @@ FmpDeviceGetImage ( function allows firmware update operation to validate the firmware image before FmpDeviceSetImage() is called. =20 - @param[in] Image Points to a new firmware image. - @param[in] ImageSize Size, in bytes, of a new firmware image. - @param[out] ImageUpdatable Indicates if a new firmware image is valid f= or - a firmware update to the firmware device. T= he - following values from the Firmware Managemen= t - Protocol are supported: - IMAGE_UPDATABLE_VALID - IMAGE_UPDATABLE_INVALID - IMAGE_UPDATABLE_INVALID_TYPE - IMAGE_UPDATABLE_INVALID_OLD - IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is val= id for + a firmware update to the firmware device= . The + following values from the Firmware Manag= ement + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the las= t attempt + status to report back to the ESRT table = in case + of error. The return status code must fa= ll in the range of + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ER= ROR_CODE to + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ER= ROR_CODE. =20 @retval EFI_SUCCESS The image was successfully checked. Addi= tional status information is returned in @@ -404,7 +409,8 @@ EFIAPI FmpDeviceCheckImage ( IN CONST VOID *Image, IN UINTN ImageSize, - OUT UINT32 *ImageUpdatable + OUT UINT32 *ImageUpdatable, + OUT UINT32 *LastAttemptStatus ) { return EFI_SUCCESS; @@ -453,6 +459,13 @@ FmpDeviceCheckImage ( EFI_BOOT_SERVICES.AllocatePool(). It is t= he caller's responsibility to free this buffe= r with EFI_BOOT_SERVICES.FreePool(). + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last = attempt + status to report back to the ESRT table in= case + of error. Will only be checked when this f= untions + returns error. Returned status code falls = outside of + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ERRO= R_CODE and + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ERRO= R_CODE + will be converted to LAST_ATTEMPT_STATUS_E= RROR_UNSUCCESSFUL =20 @retval EFI_SUCCESS The firmware device was successfully upda= ted with the new firmware image. @@ -470,7 +483,8 @@ FmpDeviceSetImage ( IN CONST VOID *VendorCode, OP= TIONAL IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, OP= TIONAL IN UINT32 CapsuleFwVersion, - OUT CHAR16 **AbortReason + OUT CHAR16 **AbortReason, + OUT UINT32 *LastAttemptStatus ) { return EFI_UNSUPPORTED; diff --git a/FmpDevicePkg/Include/LastAttemptStatus.h b/FmpDevicePkg/Includ= e/LastAttemptStatus.h index df9b60b2bbb0..01e96b23edad 100644 --- a/FmpDevicePkg/Include/LastAttemptStatus.h +++ b/FmpDevicePkg/Include/LastAttemptStatus.h @@ -36,6 +36,7 @@ // The following last attempt status code ranges are defined for the follo= wing corresponding component: // * LAST_ATTEMPT_STATUS_DRIVER - FMP driver // * LAST_ATTEMPT_STATUS_DEPENDENCY - FMP dependency functionality +// * LAST_ATTEMPT_STATUS_LIBRARY - FMP device library instances // enum LAST_ATTEMPT_STATUS_EXPANDED_ERROR_LIST { @@ -71,7 +72,10 @@ enum LAST_ATTEMPT_STATUS_EXPANDED_ERROR_LIST LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_FMP_NOT_FOUND , LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_PUSH_FAILURE , LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_POP_FAILURE , - LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_MAX_ERROR_CODE =3D LAST= _ATTEMPT_STATUS_DEPENDENCY_MAX_ERROR_CODE_VALUE + LAST_ATTEMPT_STATUS_DEPENDENCY_ERROR_MAX_ERROR_CODE =3D LAST= _ATTEMPT_STATUS_DEPENDENCY_MAX_ERROR_CODE_VALUE, + + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ERROR_CODE , + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ERROR_CODE =3D LAST= _ATTEMPT_STATUS_LIBRARY_MAX_ERROR_CODE_VALUE }; =20 #endif diff --git a/FmpDevicePkg/Include/Library/FmpDeviceLib.h b/FmpDevicePkg/Inc= lude/Library/FmpDeviceLib.h index 9a89f5c2eec5..163714654d60 100644 --- a/FmpDevicePkg/Include/Library/FmpDeviceLib.h +++ b/FmpDevicePkg/Include/Library/FmpDeviceLib.h @@ -2,7 +2,7 @@ Provides firmware device specific services to support updates of a firmw= are image stored in a firmware device. =20 - Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation.
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent @@ -12,6 +12,8 @@ #ifndef __FMP_DEVICE_LIB__ #define __FMP_DEVICE_LIB__ =20 +#include +#include #include =20 /** @@ -376,17 +378,22 @@ FmpDeviceGetImage ( function allows firmware update operation to validate the firmware image before FmpDeviceSetImage() is called. =20 - @param[in] Image Points to a new firmware image. - @param[in] ImageSize Size, in bytes, of a new firmware image. - @param[out] ImageUpdatable Indicates if a new firmware image is valid f= or - a firmware update to the firmware device. T= he - following values from the Firmware Managemen= t - Protocol are supported: - IMAGE_UPDATABLE_VALID - IMAGE_UPDATABLE_INVALID - IMAGE_UPDATABLE_INVALID_TYPE - IMAGE_UPDATABLE_INVALID_OLD - IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is val= id for + a firmware update to the firmware device= . The + following values from the Firmware Manag= ement + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the las= t attempt + status to report back to the ESRT table = in case + of error. The return status code must fa= ll in the range of + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ER= ROR_CODE to + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ER= ROR_CODE. =20 @retval EFI_SUCCESS The image was successfully checked. Addi= tional status information is returned in @@ -400,7 +407,8 @@ EFIAPI FmpDeviceCheckImage ( IN CONST VOID *Image, IN UINTN ImageSize, - OUT UINT32 *ImageUpdatable + OUT UINT32 *ImageUpdatable, + OUT UINT32 *LastAttemptStatus ); =20 /** @@ -446,6 +454,13 @@ FmpDeviceCheckImage ( EFI_BOOT_SERVICES.AllocatePool(). It is t= he caller's responsibility to free this buffe= r with EFI_BOOT_SERVICES.FreePool(). + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last = attempt + status to report back to the ESRT table in= case + of error. Will only be checked when this f= untions + returns error. Returned status code falls = outside of + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MIN_ERRO= R_CODE and + LAST_ATTEMPT_STATUS_LIBRARY_ERROR_MAX_ERRO= R_CODE + will be converted to LAST_ATTEMPT_STATUS_E= RROR_UNSUCCESSFUL =20 @retval EFI_SUCCESS The firmware device was successfully upda= ted with the new firmware image. @@ -463,7 +478,8 @@ FmpDeviceSetImage ( IN CONST VOID *VendorCode, OP= TIONAL IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, OP= TIONAL IN UINT32 CapsuleFwVersion, - OUT CHAR16 **AbortReason + OUT CHAR16 **AbortReason, + OUT UINT32 *LastAttemptStatus ); =20 /** --=20 2.28.0.windows.1