#include <Protocol/DevicePath.h>\r
#include <Protocol/Runtime.h>\r
#include <Protocol/LoadFile.h>\r
+#include <Protocol/LoadFile2.h>\r
#include <Protocol/DriverBinding.h>\r
#include <Protocol/VariableWrite.h>\r
#include <Protocol/PlatformDriverOverride.h>\r
gEfiLoadPeImageProtocolGuid ## PRODUCES\r
gEfiSimpleFileSystemProtocolGuid ## CONSUMES\r
gEfiLoadFileProtocolGuid ## CONSUMES\r
+ gEfiLoadFile2ProtocolGuid ## CONSUMES\r
gEfiResetArchProtocolGuid ## CONSUMES\r
gEfiRealTimeClockArchProtocolGuid ## CONSUMES\r
gEfiRuntimeArchProtocolGuid ## CONSUMES\r
EFI_FILE_HANDLE FileHandle;\r
EFI_FILE_HANDLE LastHandle;\r
EFI_LOAD_FILE_PROTOCOL *LoadFile;\r
+ EFI_LOAD_FILE2_PROTOCOL *LoadFile2;\r
EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;\r
EFI_SECTION_TYPE SectionType;\r
UINT8 *Pe32Buffer;\r
}\r
}\r
\r
+ //\r
+ // Try LoadFile2 style\r
+ //\r
+ if (!BootPolicy) {\r
+ TempFilePath = *FilePath;\r
+ Status = CoreDevicePathToInterface (\r
+ &gEfiLoadFile2ProtocolGuid,\r
+ &TempFilePath,\r
+ (VOID*)&LoadFile2,\r
+ DeviceHandle\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Call LoadFile2 with the correct buffer size\r
+ // \r
+ ASSERT (ImageFileHandle->SourceSize == 0);\r
+ ASSERT (ImageFileHandle->Source == NULL);\r
+ \r
+ Status = LoadFile2->LoadFile (\r
+ LoadFile2,\r
+ TempFilePath,\r
+ BootPolicy,\r
+ &ImageFileHandle->SourceSize,\r
+ ImageFileHandle->Source\r
+ );\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ ImageFileHandle->Source = AllocatePool (ImageFileHandle->SourceSize);\r
+ if (ImageFileHandle->Source == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ } else {\r
+ Status = LoadFile2->LoadFile (\r
+ LoadFile2,\r
+ TempFilePath,\r
+ BootPolicy,\r
+ &ImageFileHandle->SourceSize,\r
+ ImageFileHandle->Source\r
+ );\r
+ }\r
+ }\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ ImageFileHandle->FreeBuffer = TRUE;\r
+ goto Done;\r
+ }\r
+ }\r
+ }\r
\r
//\r
// Try LoadFile style\r