15c08e1173703234cc2913757f237ee916087498aklu/** @file
25c08e1173703234cc2913757f237ee916087498aklu  Head file for BDS Architectural Protocol implementation
35c08e1173703234cc2913757f237ee916087498aklu
469fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu NiCopyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
5180a5a35cb49699bd249dee19e41cee34c856a58hhtianThis program and the accompanying materials
65c08e1173703234cc2913757f237ee916087498akluare licensed and made available under the terms and conditions of the BSD License
75c08e1173703234cc2913757f237ee916087498akluwhich accompanies this distribution.  The full text of the license may be found at
85c08e1173703234cc2913757f237ee916087498akluhttp://opensource.org/licenses/bsd-license.php
95c08e1173703234cc2913757f237ee916087498aklu
105c08e1173703234cc2913757f237ee916087498akluTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
115c08e1173703234cc2913757f237ee916087498akluWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
125c08e1173703234cc2913757f237ee916087498aklu
135c08e1173703234cc2913757f237ee916087498aklu**/
145c08e1173703234cc2913757f237ee916087498aklu
155c08e1173703234cc2913757f237ee916087498aklu#ifndef _BDS_MODULE_H_
165c08e1173703234cc2913757f237ee916087498aklu#define _BDS_MODULE_H_
175c08e1173703234cc2913757f237ee916087498aklu
1879bc7a89f7da2c5c17332a55e514dd69e849ce87mdkinney#include <FrameworkDxe.h>
1967d632277d0650197002996fb98cb3cb41dce9e8lgao#include <IndustryStandard/PeImage.h>
20a2ded1d652cef1f2aaf85e73fc8f5bc5626723beqhuang#include <Guid/MdeModuleHii.h>
215c08e1173703234cc2913757f237ee916087498aklu#include <Guid/FileSystemVolumeLabelInfo.h>
22ab4da12626934cf13fa3f7265cb220eb7f3f31fcgikidy#include <Guid/HiiPlatformSetupFormset.h>
2369fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni#include <Guid/StatusCodeDataTypeVariable.h>
245c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/DevicePath.h>
256cfbf7adff681490789ce9c20bf9344aee6a225edavidhuang#include <IndustryStandard/SmBios.h>
265c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/LoadFile.h>
275c08e1173703234cc2913757f237ee916087498aklu#include <Guid/FileInfo.h>
285c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/HiiConfigRouting.h>
295c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/Bds.h>
306cfbf7adff681490789ce9c20bf9344aee6a225edavidhuang#include <Protocol/Smbios.h>
315c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/UgaDraw.h>
325c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/BlockIo.h>
335c08e1173703234cc2913757f237ee916087498aklu#include <Guid/GlobalVariable.h>
345c08e1173703234cc2913757f237ee916087498aklu#include <Guid/CapsuleVendor.h>
3555e1864e6bff2fb719e0745b35ed386aa74065c3lgao#include <Guid/StatusCodeDataTypeId.h>
36e24fc1032db5d5d2395260f6d7af94aa5a2a0802lgao#include <Guid/LegacyDevOrder.h>
37e24fc1032db5d5d2395260f6d7af94aa5a2a0802lgao#include <Guid/BdsHii.h>
385676ccca070b261ff70e93bc32b5f7496c1b8c83czhang#include <Guid/ConnectConInEvent.h>
39f6c07313d1f7317c328e9ef80cfb272beec0a249lzeng#include <Guid/Performance.h>
40566771b0a70a4ec637420c4b96a1415348bf2f12czhang#include <Guid/FmpCapsule.h>
415c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/GenericMemoryTest.h>
425c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/FormBrowser2.h>
435c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/HiiConfigAccess.h>
445c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/GraphicsOutput.h>
455c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/SimpleFileSystem.h>
465c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/HiiDatabase.h>
475c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/HiiString.h>
485c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/SerialIo.h>
495c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/LegacyBios.h>
505c08e1173703234cc2913757f237ee916087498aklu#include <Protocol/SimpleTextInEx.h>
51ab4da12626934cf13fa3f7265cb220eb7f3f31fcgikidy#include <Protocol/DriverHealth.h>
52a637802c2f8765549cf41a5694f53860b24601c9xdu#include <Protocol/BootLogo.h>
53ff8438477f2dcea28149514de25368ac0b2c02eeniruiyu#include <Protocol/VariableLock.h>
545c08e1173703234cc2913757f237ee916087498aklu
555c08e1173703234cc2913757f237ee916087498aklu#include <Library/UefiDriverEntryPoint.h>
565c08e1173703234cc2913757f237ee916087498aklu#include <Library/PrintLib.h>
575c08e1173703234cc2913757f237ee916087498aklu#include <Library/DebugLib.h>
585c08e1173703234cc2913757f237ee916087498aklu#include <Library/BaseMemoryLib.h>
595c08e1173703234cc2913757f237ee916087498aklu#include <Library/UefiBootServicesTableLib.h>
605c08e1173703234cc2913757f237ee916087498aklu#include <Library/UefiLib.h>
615c08e1173703234cc2913757f237ee916087498aklu#include <Library/MemoryAllocationLib.h>
625c08e1173703234cc2913757f237ee916087498aklu#include <Library/PerformanceLib.h>
635c08e1173703234cc2913757f237ee916087498aklu#include <Library/ReportStatusCodeLib.h>
645c08e1173703234cc2913757f237ee916087498aklu#include <Library/UefiRuntimeServicesTableLib.h>
655c08e1173703234cc2913757f237ee916087498aklu#include <Library/HobLib.h>
665c08e1173703234cc2913757f237ee916087498aklu#include <Library/BaseLib.h>
675c08e1173703234cc2913757f237ee916087498aklu#include <Library/DevicePathLib.h>
685c08e1173703234cc2913757f237ee916087498aklu#include <Library/PcdLib.h>
695c08e1173703234cc2913757f237ee916087498aklu#include <Library/CapsuleLib.h>
705c08e1173703234cc2913757f237ee916087498aklu#include <Library/HiiLib.h>
71f6f910dd125144707e3516bbb517b8ec7a388c06rsun#include <Library/DevicePathLib.h>
7233bb6326576a3f4f722b60d8a8d996af882009d1qhuang#include <Library/UefiHiiServicesLib.h>
735c08e1173703234cc2913757f237ee916087498aklu
745c08e1173703234cc2913757f237ee916087498aklu#include <Library/GenericBdsLib.h>
755c08e1173703234cc2913757f237ee916087498aklu#include <Library/PlatformBdsLib.h>
765c08e1173703234cc2913757f237ee916087498aklu
77f6f910dd125144707e3516bbb517b8ec7a388c06rsun#pragma pack(1)
78f6f910dd125144707e3516bbb517b8ec7a388c06rsun
79f6f910dd125144707e3516bbb517b8ec7a388c06rsun///
80f6f910dd125144707e3516bbb517b8ec7a388c06rsun/// HII specific Vendor Device Path definition.
81f6f910dd125144707e3516bbb517b8ec7a388c06rsun///
82f6f910dd125144707e3516bbb517b8ec7a388c06rsuntypedef struct {
83f6f910dd125144707e3516bbb517b8ec7a388c06rsun  VENDOR_DEVICE_PATH             VendorDevicePath;
84f6f910dd125144707e3516bbb517b8ec7a388c06rsun  EFI_DEVICE_PATH_PROTOCOL       End;
85f6f910dd125144707e3516bbb517b8ec7a388c06rsun} HII_VENDOR_DEVICE_PATH;
86f6f910dd125144707e3516bbb517b8ec7a388c06rsun
87f6f910dd125144707e3516bbb517b8ec7a388c06rsun#pragma pack()
88f6f910dd125144707e3516bbb517b8ec7a388c06rsun
895c08e1173703234cc2913757f237ee916087498aklu/**
905c08e1173703234cc2913757f237ee916087498aklu
915c08e1173703234cc2913757f237ee916087498aklu  Show progress bar with title above it. It only works in Graphics mode.
925c08e1173703234cc2913757f237ee916087498aklu
935c08e1173703234cc2913757f237ee916087498aklu  @param TitleForeground Foreground color for Title.
945c08e1173703234cc2913757f237ee916087498aklu  @param TitleBackground Background color for Title.
955c08e1173703234cc2913757f237ee916087498aklu  @param Title           Title above progress bar.
965c08e1173703234cc2913757f237ee916087498aklu  @param ProgressColor   Progress bar color.
975c08e1173703234cc2913757f237ee916087498aklu  @param Progress        Progress (0-100)
985c08e1173703234cc2913757f237ee916087498aklu  @param PreviousValue   The previous value of the progress.
995c08e1173703234cc2913757f237ee916087498aklu
1005c08e1173703234cc2913757f237ee916087498aklu  @retval  EFI_STATUS       Success update the progress bar
1015c08e1173703234cc2913757f237ee916087498aklu
1025c08e1173703234cc2913757f237ee916087498aklu**/
1035c08e1173703234cc2913757f237ee916087498akluEFI_STATUS
1045c08e1173703234cc2913757f237ee916087498akluPlatformBdsShowProgress (
1055c08e1173703234cc2913757f237ee916087498aklu  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,
1065c08e1173703234cc2913757f237ee916087498aklu  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,
1075c08e1173703234cc2913757f237ee916087498aklu  IN CHAR16                        *Title,
1085c08e1173703234cc2913757f237ee916087498aklu  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,
1095c08e1173703234cc2913757f237ee916087498aklu  IN UINTN                         Progress,
1105c08e1173703234cc2913757f237ee916087498aklu  IN UINTN                         PreviousValue
1115c08e1173703234cc2913757f237ee916087498aklu  );
1125c08e1173703234cc2913757f237ee916087498aklu
1135c08e1173703234cc2913757f237ee916087498aklu//
1145c08e1173703234cc2913757f237ee916087498aklu// Prototypes
1155c08e1173703234cc2913757f237ee916087498aklu//
1165c08e1173703234cc2913757f237ee916087498aklu
1175c08e1173703234cc2913757f237ee916087498aklu/**
1185c08e1173703234cc2913757f237ee916087498aklu
1195c08e1173703234cc2913757f237ee916087498aklu  Install Boot Device Selection Protocol
1205c08e1173703234cc2913757f237ee916087498aklu
1215c08e1173703234cc2913757f237ee916087498aklu  @param ImageHandle     The image handle.
1225c08e1173703234cc2913757f237ee916087498aklu  @param SystemTable     The system table.
1235c08e1173703234cc2913757f237ee916087498aklu
1245c08e1173703234cc2913757f237ee916087498aklu  @retval  EFI_SUCEESS  BDS has finished initializing.
1255c08e1173703234cc2913757f237ee916087498aklu                        Return the dispatcher and recall BDS.Entry
1265c08e1173703234cc2913757f237ee916087498aklu  @retval  Other        Return status from AllocatePool() or gBS->InstallProtocolInterface
1275c08e1173703234cc2913757f237ee916087498aklu
1285c08e1173703234cc2913757f237ee916087498aklu**/
1295c08e1173703234cc2913757f237ee916087498akluEFI_STATUS
1305c08e1173703234cc2913757f237ee916087498akluEFIAPI
1315c08e1173703234cc2913757f237ee916087498akluBdsInitialize (
1325c08e1173703234cc2913757f237ee916087498aklu  IN EFI_HANDLE                     ImageHandle,
1335c08e1173703234cc2913757f237ee916087498aklu  IN EFI_SYSTEM_TABLE               *SystemTable
1345c08e1173703234cc2913757f237ee916087498aklu  );
1355c08e1173703234cc2913757f237ee916087498aklu
1365c08e1173703234cc2913757f237ee916087498aklu/**
1375c08e1173703234cc2913757f237ee916087498aklu
1385c08e1173703234cc2913757f237ee916087498aklu  Service routine for BdsInstance->Entry(). Devices are connected, the
1395c08e1173703234cc2913757f237ee916087498aklu  consoles are initialized, and the boot options are tried.
1405c08e1173703234cc2913757f237ee916087498aklu
1415c08e1173703234cc2913757f237ee916087498aklu  @param This            Protocol Instance structure.
1425c08e1173703234cc2913757f237ee916087498aklu
1435c08e1173703234cc2913757f237ee916087498aklu**/
1445c08e1173703234cc2913757f237ee916087498akluVOID
1455c08e1173703234cc2913757f237ee916087498akluEFIAPI
1465c08e1173703234cc2913757f237ee916087498akluBdsEntry (
1475c08e1173703234cc2913757f237ee916087498aklu  IN  EFI_BDS_ARCH_PROTOCOL *This
1485c08e1173703234cc2913757f237ee916087498aklu  );
1495c08e1173703234cc2913757f237ee916087498aklu
15019bf20e11acd88a02922201f97e6d64edcd16390lgao
15119bf20e11acd88a02922201f97e6d64edcd16390lgao/**
15219bf20e11acd88a02922201f97e6d64edcd16390lgao  Perform the memory test base on the memory test intensive level,
15319bf20e11acd88a02922201f97e6d64edcd16390lgao  and update the memory resource.
15419bf20e11acd88a02922201f97e6d64edcd16390lgao
15519bf20e11acd88a02922201f97e6d64edcd16390lgao  @param  Level         The memory test intensive level.
15619bf20e11acd88a02922201f97e6d64edcd16390lgao
15719bf20e11acd88a02922201f97e6d64edcd16390lgao  @retval EFI_STATUS    Success test all the system memory and update
15819bf20e11acd88a02922201f97e6d64edcd16390lgao                        the memory resource
15919bf20e11acd88a02922201f97e6d64edcd16390lgao
16019bf20e11acd88a02922201f97e6d64edcd16390lgao**/
16119bf20e11acd88a02922201f97e6d64edcd16390lgaoEFI_STATUS
1628861fc792ce90cb7ab18a91bd3d6596d77ee0170jljustenEFIAPI
16319bf20e11acd88a02922201f97e6d64edcd16390lgaoBdsMemoryTest (
16419bf20e11acd88a02922201f97e6d64edcd16390lgao  IN EXTENDMEM_COVERAGE_LEVEL Level
16519bf20e11acd88a02922201f97e6d64edcd16390lgao  );
16619bf20e11acd88a02922201f97e6d64edcd16390lgao
16719bf20e11acd88a02922201f97e6d64edcd16390lgao/**
16819bf20e11acd88a02922201f97e6d64edcd16390lgao
16919bf20e11acd88a02922201f97e6d64edcd16390lgao  This routine is called to see if there are any capsules we need to process.
17019bf20e11acd88a02922201f97e6d64edcd16390lgao  If the boot mode is not UPDATE, then we do nothing. Otherwise find the
17119bf20e11acd88a02922201f97e6d64edcd16390lgao  capsule HOBS and produce firmware volumes for them via the DXE service.
17219bf20e11acd88a02922201f97e6d64edcd16390lgao  Then call the dispatcher to dispatch drivers from them. Finally, check
17319bf20e11acd88a02922201f97e6d64edcd16390lgao  the status of the updates.
17419bf20e11acd88a02922201f97e6d64edcd16390lgao
17519bf20e11acd88a02922201f97e6d64edcd16390lgao  This function should be called by BDS in case we need to do some
17619bf20e11acd88a02922201f97e6d64edcd16390lgao  sort of processing even if there is no capsule to process. We
17719bf20e11acd88a02922201f97e6d64edcd16390lgao  need to do this if an earlier update went away and we need to
17819bf20e11acd88a02922201f97e6d64edcd16390lgao  clear the capsule variable so on the next reset PEI does not see it and
17919bf20e11acd88a02922201f97e6d64edcd16390lgao  think there is a capsule available.
18019bf20e11acd88a02922201f97e6d64edcd16390lgao
18119bf20e11acd88a02922201f97e6d64edcd16390lgao  @param BootMode                 the current boot mode
18219bf20e11acd88a02922201f97e6d64edcd16390lgao
18319bf20e11acd88a02922201f97e6d64edcd16390lgao  @retval EFI_INVALID_PARAMETER   boot mode is not correct for an update
18419bf20e11acd88a02922201f97e6d64edcd16390lgao  @retval EFI_SUCCESS             There is no error when processing capsule
18519bf20e11acd88a02922201f97e6d64edcd16390lgao
18619bf20e11acd88a02922201f97e6d64edcd16390lgao**/
18719bf20e11acd88a02922201f97e6d64edcd16390lgaoEFI_STATUS
1888861fc792ce90cb7ab18a91bd3d6596d77ee0170jljustenEFIAPI
18919bf20e11acd88a02922201f97e6d64edcd16390lgaoBdsProcessCapsules (
19019bf20e11acd88a02922201f97e6d64edcd16390lgao  EFI_BOOT_MODE BootMode
19119bf20e11acd88a02922201f97e6d64edcd16390lgao  );
19219bf20e11acd88a02922201f97e6d64edcd16390lgao
19369fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni/**
19469fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  Set the variable and report the error through status code upon failure.
19569fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni
19669fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @param  VariableName           A Null-terminated string that is the name of the vendor's variable.
19769fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 Each VariableName is unique for each VendorGuid. VariableName must
19869fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 contain 1 or more characters. If VariableName is an empty string,
19969fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 then EFI_INVALID_PARAMETER is returned.
20069fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @param  VendorGuid             A unique identifier for the vendor.
20169fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @param  Attributes             Attributes bitmask to set for the variable.
20269fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @param  DataSize               The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE,
20369fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or
20469fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero
20569fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is
20669fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 set, then a SetVariable() call with a DataSize of zero will not cause any change to
20769fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 the variable value (the timestamp associated with the variable may be updated however
20869fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 even if no new data value is provided,see the description of the
20969fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 EFI_VARIABLE_AUTHENTICATION_2 descriptor below. In this case the DataSize will not
21069fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 be zero since the EFI_VARIABLE_AUTHENTICATION_2 descriptor will be populated).
21169fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @param  Data                   The contents for the variable.
21269fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni
21369fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_SUCCESS            The firmware has successfully stored the variable and its data as
21469fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 defined by the Attributes.
21569fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_INVALID_PARAMETER  An invalid combination of attribute bits, name, and GUID was supplied, or the
21669fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 DataSize exceeds the maximum allowed.
21769fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_INVALID_PARAMETER  VariableName is an empty string.
21869fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
21969fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
22069fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_WRITE_PROTECTED    The variable in question is read-only.
22169fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
22269fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
22369fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, but the AuthInfo
22469fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni                                 does NOT pass the validation check carried out by the firmware.
22569fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni
22669fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
22769fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni**/
22869fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu NiEFI_STATUS
22969fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu NiBdsDxeSetVariableAndReportStatusCodeOnError (
23069fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  IN CHAR16     *VariableName,
23169fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  IN EFI_GUID   *VendorGuid,
23269fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  IN UINT32     Attributes,
23369fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  IN UINTN      DataSize,
23469fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  IN VOID       *Data
23569fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni  );
23669fc8f080e07ea026e8fbb8610cfb89c099d6db2Ruiyu Ni
2375c08e1173703234cc2913757f237ee916087498aklu#endif
238