From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (NAM12-DM6-obe.outbound.protection.outlook.com [40.92.22.69]) by mx.groups.io with SMTP id smtpd.web10.1507.1596784565468662627 for ; Fri, 07 Aug 2020 00:16:05 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@outlook.com header.s=selector1 header.b=f7+wRB93; spf=pass (domain: outlook.com, ip: 40.92.22.69, mailfrom: michael.kubacki@outlook.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YQLUo4gly7fWgYVHiQ5N4K+sJpm09AfZ7OVMGM9vTjVfRc8pOYamQAecyiTCSFVRgQx33wdDeg5fAtXVk0IR1rlIcHIgP/1EGU0g1hCvnoO6NB+UDIEAaxfe3RfZo3yFQJ34uA6W5gBDe1lPYRy72ouPI5hRWK/FsOA5TmaBpTRVdC/f3G8NSKijBBdMd1OSWbmq/FKHmlIjO26x5I9rVvVqCkvc9ZvC/WcNNBqLGnEs4RwKmQ/yEyq4qQ2HFlE6R+Cgv0qpcalCEMhYxO52WzLXJPEJjbAu80/ujUulpmdUFGjS9RNccCu0P+eAhdoz9a0R199KPDhknsxvYMEpJw== 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=Sq7OhDZUbduBwRQlGFAbuqRadh60kiCGH1JFun5BXIk=; b=PMJZd6j5oqdCYqKlpeBbA/7TiNDP3jznxOXqVmkfUDi2Rdef60AdrMrS1Ub9FNMIxA4ATgdFJ8bL1XZHuzYO0tDMehTMkukdBkOP4aburZpys6BYW2Pa/dd6b67SuFVTZlXzr69zsgh8PdolJ5EKstYv9e6FnDmnNTeku7bObvOsYtPL9O7eB7pzDhTbXpxAnXCwv3IKR+6+nQM/AmcriBfllEZoYR3NomjZn8vE8lZDHc715qwiECeItM/LSEluKx01k+of/df8ngPS5L4N0qKd+KfF3qcs1hVbZ4FgozNfVQ6hKbEq+OF4kfVAaqv6XTmX9j/OeiAQ2CbwKhdkSQ== 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=Sq7OhDZUbduBwRQlGFAbuqRadh60kiCGH1JFun5BXIk=; b=f7+wRB93LVzILSJCY7/fynV5XZCBIMmUMGm2BWePmOTGKnTCkI5yruQr43gDfhqepquE4nRWN3rThtZ+KydRY19VWBNGBo6pXWyoa79VA5SNZ71vlLOeXj2GzJQkL/Rlg2XcytdhqxWx0oh/yn9rbNZ7mqVglgLkw+7+54pAVTII37/STntwSY0L95teXYbsJ3OQQXPJluaIB+0bo41N7pyK68dRluTFGU7hVlAiouz0fgi8E0O3qbyHTUSurN16rl7eSBFv4xCuARM1Tq/cEG2okCNXyr/AWb1t/f+/9GP3XT1ft1n6Ue/5jNb9Vlsi6xDvSQbk3/qvS61Z6GgIMg== Received: from BN8NAM12FT047.eop-nam12.prod.protection.outlook.com (2a01:111:e400:fc66::44) by BN8NAM12HT013.eop-nam12.prod.protection.outlook.com (2a01:111:e400:fc66::476) 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:04 +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:04 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:68F2AE7692AE60B0EA853510F26500962C72D97579E9FA5E8B4DF89ADD409EB3;UpperCasedChecksum:982A3BF3EC628791CC655BE73F8D46E2363B55D60443AC4DFB4791C07A5E1910;SizeAsReceived:7813;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:04 +0000 From: "Michael Kubacki" To: devel@edk2.groups.io CC: Liming Gao , Michael D Kinney , Guomin Jiang , Wei6 Xu Subject: [PATCH v1 3/7] FmpDevicePkg/FmpDxe: Add check image path Last Attempt Status capability Date: Fri, 7 Aug 2020 00:15:22 -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-4-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:03 +0000 X-Mailer: git-send-email 2.28.0.windows.1 X-Microsoft-Original-Message-ID: <20200807071526.1837-4-michael.kubacki@outlook.com> X-TMN: [7zCnxndInYvC2hpob5Fa2zbMe/cUG4Qe2T5bccp/ct25qd25C4NFvjgMcgZf82Tc] X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 49 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: b0db0a7c-a576-4063-a60f-08d83aa1bed5 X-MS-TrafficTypeDiagnostic: BN8NAM12HT013: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 9HpZ4DbBjYD/Wn4+3CJWrcGx6LyQGNHNgtTMqwQXMwfUncwpxoHFLNwDyizGPnQJAwLZxw69ceqjqPbm8h87yuMSe6e+LG8j6Quv4XL/ud9c6X5+rmHgACsrCybGF+HJoYcvixHQNlDthJdrSsSqjFZEsKHDd672yiTgCTuxRaP0op2bJvnNCjogontdQ+kPfvfTMsjqmbzFknSKqHKOcQ== 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: SuD2GDAnBm2TVBYbUJ6JGaNrszWBXKsly1M7x9r0Yimgg6Oo21L+5sdKfcnXVfVuzNvUhLEAr3WkPqUJBKVnel2kvPGahl/hV8fmsU9WDGj1JMJTtcJuYYBJsDGwqjQ8Eal4oLi3SLulgL9LClhhQx4XIyZLilWgUhw76aKuO/nuPt+rHDP9tOBLtc8IrPtk0vOCSmMOqdmMU+l0YLVyRA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b0db0a7c-a576-4063-a60f-08d83aa1bed5 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Aug 2020 07:16:04.0722 (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: BN8NAM12HT013 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain From: Michael Kubacki CheckTheImage() is used to provide the CheckImage() implementation for the EFI_FIRMWARE_MANAGEMENT_PROTOCOL instance produced by FmpDxe in addition to being called internally in the SetImage() path. Since CheckTheImage() plays a major role in determining the validity of a given firmware image, an internal version of the function is introduced - CheckTheImageInternal() that is capable of returning a Last Attempt Status code to internal callers such as SetTheImage(). The CheckImage() API as defined in the UEFI Specification for EFI_FIRMWARE_MANAGEMENT_PROTOCOL is not impacted by this change. CheckTheImageInternal() contains unique Last Attempt Status codes during error paths in the function so it is easier to identify the issue with a particular image through the Last Attempt Status code value. Cc: Liming Gao Cc: Michael D Kinney Cc: Guomin Jiang Cc: Wei6 Xu Signed-off-by: Michael Kubacki --- FmpDevicePkg/FmpDxe/FmpDxe.c | 102 +++++++++++++++++--- FmpDevicePkg/FmpDxe/FmpDxe.h | 1 + FmpDevicePkg/Include/LastAttemptStatus.h | 26 +++++ 3 files changed, 118 insertions(+), 11 deletions(-) diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c index 854feec0a162..dc714f7e9cd4 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxe.c +++ b/FmpDevicePkg/FmpDxe/FmpDxe.c @@ -721,6 +721,24 @@ GetAllHeaderSize ( @param[in] ImageSize Size of the new image in bytes. @param[out] ImageUpdatable Indicates if the new image is valid for u= pdate. It also provides, if available, additional information if t= he image is invalid. + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last= attempt + status to report back to the ESRT table i= n case + of error. + + This function will return error codes tha= t occur within this function + implementation within a driver range of l= ast attempt error codes from + LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VE= NDOR_RANGE_MIN + to LAST_ATTEMPT_STATUS_DRIVER_MAX_ERROR_C= ODE_VALUE. + + This function will return error codes tha= t occur within FMP dependency + related functionality used by this functi= on within a dependency range of + last attempt error codes from LAST_ATTEMP= T_STATUS_DRIVER_MAX_ERROR_CODE_VALUE + to LAST_ATTEMPT_STATUS_DEPENDENCY_MAX_ERR= OR_CODE_VALUE. + + This function will additionally return er= ror codes that are returned + from a device-specific CheckImage () impl= ementation in the range of + LAST_ATTEMPT_STATUS_DEPENDENCY_MAX_ERROR_= CODE_VALUE to + LAST_ATTEMPT_STATUS_LIBRARY_MAX_ERROR_COD= E_VALUE. =20 @retval EFI_SUCCESS The image was successfully checked. @retval EFI_ABORTED The operation is aborted. @@ -731,15 +749,17 @@ GetAllHeaderSize ( **/ EFI_STATUS EFIAPI -CheckTheImage ( +CheckTheImageInternal ( IN EFI_FIRMWARE_MANAGEMENT_PROTOCOL *This, IN UINT8 ImageIndex, IN CONST VOID *Image, IN UINTN ImageSize, - OUT UINT32 *ImageUpdatable + OUT UINT32 *ImageUpdatable, + OUT UINT32 *LastAttemptStatus ) { EFI_STATUS Status; + UINT32 LocalLastAttemptStatus; FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private; UINTN RawSize; VOID *FmpPayloadHeader; @@ -755,23 +775,31 @@ CheckTheImage ( EFI_FIRMWARE_IMAGE_DEP *Dependencies; UINT32 DependenciesSize; =20 - Status =3D EFI_SUCCESS; - RawSize =3D 0; - FmpPayloadHeader =3D NULL; - FmpPayloadSize =3D 0; - Version =3D 0; - FmpHeaderSize =3D 0; - AllHeaderSize =3D 0; - Dependencies =3D NULL; - DependenciesSize =3D 0; + Status =3D EFI_SUCCESS; + LocalLastAttemptStatus =3D LAST_ATTEMPT_STATUS_SUCCESS; + RawSize =3D 0; + FmpPayloadHeader =3D NULL; + FmpPayloadSize =3D 0; + Version =3D 0; + FmpHeaderSize =3D 0; + AllHeaderSize =3D 0; + Dependencies =3D NULL; + DependenciesSize =3D 0; =20 if (!FeaturePcdGet (PcdFmpDeviceStorageAccessEnable)) { return EFI_UNSUPPORTED; } =20 + if (LastAttemptStatus =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImageInternal() - LastAttemp= tStatus is NULL.\n", mImageIdName)); + Status =3D EFI_INVALID_PARAMETER; + goto cleanup; + } + if (This =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckImage() - This is NULL.\n", mIm= ageIdName)); Status =3D EFI_INVALID_PARAMETER; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_PROTOCOL_ARG_M= ISSING; goto cleanup; } =20 @@ -789,6 +817,7 @@ CheckTheImage ( if (ImageUpdatable =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckImage() - ImageUpdatable Pointe= r Parameter is NULL.\n", mImageIdName)); Status =3D EFI_INVALID_PARAMETER; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMAGE_NOT_UPDA= TABLE; goto cleanup; } =20 @@ -808,6 +837,7 @@ CheckTheImage ( // not sure if this is needed // *ImageUpdatable =3D IMAGE_UPDATABLE_INVALID; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMAGE_NOT_PROV= IDED; return EFI_INVALID_PARAMETER; } =20 @@ -817,6 +847,7 @@ CheckTheImage ( if (PublicKeyDataXdr =3D=3D NULL || (PublicKeyDataXdr =3D=3D PublicKeyDa= taXdrEnd)) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Invalid certificate, skipping it.\n"= , mImageIdName)); Status =3D EFI_ABORTED; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALID_CERTIF= ICATE; } else { // // Try each key from PcdFmpDevicePkcs7CertBufferXdr @@ -839,6 +870,7 @@ CheckTheImage ( // DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Certificate size extends beyond = end of PCD, skipping it.\n", mImageIdName)); Status =3D EFI_ABORTED; + LocalLastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALI= D_KEY_LENGTH_VALUE; break; } // @@ -855,6 +887,7 @@ CheckTheImage ( // DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Certificate extends beyond end o= f PCD, skipping it.\n", mImageIdName)); Status =3D EFI_ABORTED; + LocalLastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALI= D_KEY_LENGTH; break; } PublicKeyData =3D PublicKeyDataXdr; @@ -874,6 +907,11 @@ CheckTheImage ( =20 if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - Authentication Fai= led %r.\n", mImageIdName, Status)); + if (LocalLastAttemptStatus !=3D LAST_ATTEMPT_STATUS_SUCCESS) { + *LastAttemptStatus =3D LocalLastAttemptStatus; + } else { + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMAGE_AUTH_F= AILURE; + } goto cleanup; } =20 @@ -884,6 +922,7 @@ CheckTheImage ( DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckImage() - Image Index Invalid.\= n", mImageIdName)); *ImageUpdatable =3D IMAGE_UPDATABLE_INVALID_TYPE; Status =3D EFI_INVALID_PARAMETER; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALID_IMAGE_= INDEX; goto cleanup; } =20 @@ -899,6 +938,7 @@ CheckTheImage ( if (FmpPayloadHeader =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - GetFmpHeader faile= d.\n", mImageIdName)); Status =3D EFI_ABORTED; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER= ; goto cleanup; } Status =3D GetFmpPayloadHeaderVersion (FmpPayloadHeader, FmpPayloadSize,= &Version); @@ -906,6 +946,7 @@ CheckTheImage ( DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - GetFmpPayloadHeade= rVersion failed %r.\n", mImageIdName, Status)); *ImageUpdatable =3D IMAGE_UPDATABLE_INVALID; Status =3D EFI_SUCCESS; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER= _VERSION; goto cleanup; } =20 @@ -920,6 +961,7 @@ CheckTheImage ( ); *ImageUpdatable =3D IMAGE_UPDATABLE_INVALID_OLD; Status =3D EFI_SUCCESS; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_VERSION_TOO_LO= W; goto cleanup; } =20 @@ -942,6 +984,7 @@ CheckTheImage ( DEBUG ((DEBUG_ERROR, "FmpDxe: CheckTheImage() - GetFmpPayloadHeaderSiz= e failed %r.\n", Status)); *ImageUpdatable =3D IMAGE_UPDATABLE_INVALID; Status =3D EFI_SUCCESS; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER= _SIZE; goto cleanup; } =20 @@ -953,6 +996,7 @@ CheckTheImage ( if (AllHeaderSize =3D=3D 0) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): CheckTheImage() - GetAllHeaderSize f= ailed.\n", mImageIdName)); Status =3D EFI_ABORTED; + *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_ALL_HEADER= _SIZE; goto cleanup; } RawSize =3D ImageSize - AllHeaderSize; @@ -969,6 +1013,42 @@ CheckTheImage ( return Status; } =20 +/** + Checks if the firmware image is valid for the device. + + This function allows firmware update application to validate the firmwar= e image without + invoking the SetImage() first. + + @param[in] This A pointer to the EFI_FIRMWARE_MANAGEMENT_= PROTOCOL instance. + @param[in] ImageIndex A unique number identifying the firmware = image(s) within the device. + The number is between 1 and DescriptorCou= nt. + @param[in] Image Points to the new image. + @param[in] ImageSize Size of the new image in bytes. + @param[out] ImageUpdatable Indicates if the new image is valid for u= pdate. It also provides, + if available, additional information if t= he image is invalid. + + @retval EFI_SUCCESS The image was successfully checked. + @retval EFI_ABORTED The operation is aborted. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + @retval EFI_SECURITY_VIOLATION The operation could not be performed due = to an authentication failure. + +**/ +EFI_STATUS +EFIAPI +CheckTheImage ( + IN EFI_FIRMWARE_MANAGEMENT_PROTOCOL *This, + IN UINT8 ImageIndex, + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable + ) +{ + UINT32 LastAttemptStatus; + + return CheckTheImageInternal (This, ImageIndex, Image, ImageSize, ImageU= pdatable, &LastAttemptStatus); +} + /** Updates the firmware image of the device. =20 diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.h b/FmpDevicePkg/FmpDxe/FmpDxe.h index 30754dea495e..b79b4faecee4 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxe.h +++ b/FmpDevicePkg/FmpDxe/FmpDxe.h @@ -36,6 +36,7 @@ #include #include #include +#include =20 #define VERSION_STRING_NOT_SUPPORTED L"VERSION STRING NOT SUPPORTED" #define VERSION_STRING_NOT_AVAILABLE L"VERSION STRING NOT AVAILABLE" diff --git a/FmpDevicePkg/Include/LastAttemptStatus.h b/FmpDevicePkg/Includ= e/LastAttemptStatus.h index d39a06090a65..e177b06c4b58 100644 --- a/FmpDevicePkg/Include/LastAttemptStatus.h +++ b/FmpDevicePkg/Include/LastAttemptStatus.h @@ -28,4 +28,30 @@ =20 #define LAST_ATTEMPT_STATUS_LIBRARY_MAX_ERROR_CODE_VALUE LAST_ATTEMPT_S= TATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX - 1 =20 +// +// Last attempt status codes defined for additional granularity in the FMP= stack. +// +// These codes are defined within the higher-level UEFI specification defi= ned UNSUCCESSFUL_VENDOR_RANGE. +// +// The following last attempt status code ranges are defined for the follo= wing corresponding component: +// * LAST_ATTEMPT_STATUS_DRIVER - FMP driver +// +enum LAST_ATTEMPT_STATUS_EXPANDED_ERROR_LIST +{ + LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER =3D LAST_ATTEM= PT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN, + LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER_SIZE , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_ALL_HEADER_SIZE , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_GET_FMP_HEADER_VERSION , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMAGE_NOT_PROVIDED , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMAGE_NOT_UPDATABLE , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALID_CERTIFICATE , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALID_IMAGE_INDEX , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALID_KEY_LENGTH , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_INVALID_KEY_LENGTH_VALUE , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_VERSION_TOO_LOW , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_IMAGE_AUTH_FAILURE , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_PROTOCOL_ARG_MISSING , + LAST_ATTEMPT_STATUS_DRIVER_ERROR_MAX_ERROR_CODE =3D LAST_ATTEM= PT_STATUS_DRIVER_MAX_ERROR_CODE_VALUE +}; + #endif --=20 2.28.0.windows.1