;\r
; Input:\r
; EAX - Start of FFS file\r
+; ECX - End of FFS file\r
;\r
; Output:\r
; EAX - Entry point of PE32 (or 0 if not found)\r
GetEntryPointOfFfsFileReturnEdx:\r
test eax, eax\r
jz getEntryPointOfFfsFileErrorReturn\r
+ add eax, 0x18 ; EAX = Start of section\r
\r
- cmp byte [eax + 0x1b], EFI_SECTION_PE32\r
- jne getEntryPointOfFfsFileErrorReturn\r
+getEntryPointOfFfsFileLoopForSections:\r
+ cmp eax, ecx\r
+ jae getEntryPointOfFfsFileErrorReturn\r
+\r
+ cmp byte [eax + 3], EFI_SECTION_PE32\r
+ je getEntryPointOfFfsFileFoundPe32Section\r
+\r
+ ;\r
+ ; The section type was not PE32, so move to next section\r
+ ;\r
+ mov ebx, dword [eax]\r
+ and ebx, 0x00ffffff\r
+ add eax, ebx\r
+ jc getEntryPointOfFfsFileErrorReturn\r
+\r
+ ;\r
+ ; Ensure that FFS section is 32-bit aligned\r
+ ;\r
+ add eax, 3\r
+ jc getEntryPointOfFfsFileErrorReturn\r
+ and al, 0xfc\r
+ jmp getEntryPointOfFfsFileLoopForSections\r
\r
- add eax, 0x1c ; EAX = Start of PE32 image\r
+getEntryPointOfFfsFileFoundPe32Section:\r
+ add eax, 4 ; EAX = Start of PE32 image\r
\r
mov ebx, eax\r
cmp word [eax], 'MZ'\r