- if (SmmCommData->BootRecordData == NULL || SmmCommData->BootRecordSize < mBootRecordSize) {\r
- Status = EFI_INVALID_PARAMETER;\r
- break;\r
- } \r
- \r
- //\r
- // Sanity check\r
- //\r
- SmmCommData->BootRecordSize = mBootRecordSize;\r
- if (InternalIsAddressInSmram ((EFI_PHYSICAL_ADDRESS)(UINTN)SmmCommData->BootRecordData, mBootRecordSize)) {\r
- DEBUG ((EFI_D_ERROR, "Smm Data buffer is in SMRAM!\n"));\r
- Status = EFI_ACCESS_DENIED;\r
- break;\r
- }\r
-\r
- CopyMem (\r
- (UINT8*)SmmCommData->BootRecordData, \r
- mBootRecordBuffer, \r
- mBootRecordSize\r
- );\r
- break;\r
+ Status = EFI_UNSUPPORTED;\r
+ break;\r
+\r
+ case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA_BY_OFFSET :\r
+ BootRecordOffset = SmmCommData->BootRecordOffset;\r
+ BootRecordData = SmmCommData->BootRecordData;\r
+ BootRecordSize = SmmCommData->BootRecordSize;\r
+ if (BootRecordData == NULL || BootRecordOffset >= mBootRecordSize) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ break;\r
+ }\r
+ \r
+ //\r
+ // Sanity check\r
+ //\r
+ if (BootRecordSize > mBootRecordSize - BootRecordOffset) {\r
+ BootRecordSize = mBootRecordSize - BootRecordOffset;\r
+ }\r
+ SmmCommData->BootRecordSize = BootRecordSize;\r
+ if (!SmmIsBufferOutsideSmmValid ((UINTN)BootRecordData, BootRecordSize)) {\r
+ DEBUG ((EFI_D_ERROR, "FpdtSmiHandler: SMM Data buffer in SMRAM or overflow!\n"));\r
+ Status = EFI_ACCESS_DENIED;\r
+ break;\r
+ }\r
+ \r
+ CopyMem (\r
+ (UINT8*)BootRecordData, \r
+ mBootRecordBuffer + BootRecordOffset, \r
+ BootRecordSize\r
+ );\r
+ break;\r