175 lines
4.6 KiB
C
175 lines
4.6 KiB
C
/** @file
|
|
Try to issue the LegacyBios->GetBbsInfo() first and then modify the BbsTable
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2014, Insyde Software Corp. All Rights Reserved.
|
|
;*
|
|
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
|
|
;* transmit, broadcast, present, recite, release, license or otherwise exploit
|
|
;* any part of this publication in any form, by any means, without the prior
|
|
;* written permission of Insyde Software Corporation.
|
|
;*
|
|
;******************************************************************************
|
|
*/
|
|
|
|
#include <Uefi.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/DebugLib.h>
|
|
|
|
#include <Protocol/LegacyBios.h>
|
|
|
|
VOID *mLegacyBiosSearchKey;
|
|
EFI_LEGACY_BIOS_GET_BBS_INFO mLegacyBiosGetBbsInfo;
|
|
|
|
|
|
VOID
|
|
EFIAPI
|
|
HookForGetBbsInfo (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
BbsTableHook (
|
|
IN EFI_LEGACY_BIOS_PROTOCOL * This,
|
|
OUT UINT16 *HddCount,
|
|
OUT HDD_INFO **HddInfo,
|
|
OUT UINT16 *BbsCount,
|
|
IN OUT BBS_TABLE **BbsTable
|
|
);
|
|
|
|
/**
|
|
|
|
Install callback when EFI_LEGACY_BIOS_PROTOCOL installed.
|
|
|
|
@param ImageHandle EFI_HANDLE
|
|
@param SystemTable EFI_SYSTEM_TABLE pointer
|
|
|
|
@retval EFI_SUCCESS Driver Dispatch success
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
BbsTableHookEntry (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_EVENT OemModifyBbsEvent;
|
|
|
|
Status = gBS->CreateEvent (
|
|
EVT_NOTIFY_SIGNAL,
|
|
TPL_CALLBACK,
|
|
HookForGetBbsInfo,
|
|
NULL, // Notification Context
|
|
&OemModifyBbsEvent
|
|
);
|
|
if (EFI_ERROR(Status)) {
|
|
return EFI_ABORTED;
|
|
}
|
|
|
|
Status = gBS->RegisterProtocolNotify (
|
|
&gEfiLegacyBiosProtocolGuid,
|
|
OemModifyBbsEvent,
|
|
&mLegacyBiosSearchKey
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
if (EFI_ERROR(Status)) {
|
|
return EFI_ABORTED;
|
|
}
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
VOID
|
|
EFIAPI
|
|
HookForGetBbsInfo (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
|
|
|
|
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
|
|
|
|
mLegacyBiosGetBbsInfo = LegacyBios->GetBbsInfo;
|
|
LegacyBios->GetBbsInfo = BbsTableHook;
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EFI_LEGACY_BIOS_GET_BBS_INFO) (
|
|
IN EFI_LEGACY_BIOS_PROTOCOL * This,
|
|
OUT UINT16 *HddCount,
|
|
OUT HDD_INFO **HddInfo,
|
|
OUT UINT16 *BbsCount,
|
|
IN OUT BBS_TABLE **BbsTable
|
|
);
|
|
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
BbsTableHook (
|
|
IN EFI_LEGACY_BIOS_PROTOCOL * This,
|
|
OUT UINT16 *HddCount,
|
|
OUT HDD_INFO **HddInfo,
|
|
OUT UINT16 *BbsCount,
|
|
IN OUT BBS_TABLE **BbsTable
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
UINT16 LocalHddCount;
|
|
UINT16 LocalBbsCount;
|
|
HDD_INFO *LocalHddInfo;
|
|
BBS_TABLE *LocalBbsTable;
|
|
|
|
UINTN HddIndex;
|
|
UINTN Index;
|
|
UINTN BbsIndex;
|
|
|
|
Status = mLegacyBiosGetBbsInfo (
|
|
This,
|
|
&LocalHddCount,
|
|
&LocalHddInfo,
|
|
&LocalBbsCount,
|
|
&LocalBbsTable
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
for (HddIndex = 0; HddIndex < MAX_IDE_CONTROLLER; HddIndex++) {
|
|
BbsIndex = HddIndex * 2 + 1;
|
|
for (Index = 0; Index < 2; ++Index) {
|
|
if (LocalHddInfo[HddIndex].CommandBaseAddress == 0) {
|
|
LocalBbsTable[BbsIndex + Index].BootPriority = BBS_IGNORE_ENTRY;
|
|
} else {
|
|
if (Index == 0) {
|
|
if (LocalHddInfo[HddIndex].Status & HDD_MASTER_ATAPI_ZIPDISK) {
|
|
LocalBbsTable[BbsIndex + Index].DeviceType = BBS_CDROM;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// *BbsTable = LocalBbsTable;
|
|
// *BbsCount = LocalBbsCount;
|
|
// *HddInfo = LocalHddInfo;
|
|
// *HddCount = LocalHddCount;
|
|
if (BbsTable != NULL) *BbsTable = LocalBbsTable;
|
|
if (BbsCount != NULL) *BbsCount = LocalBbsCount;
|
|
if (HddInfo != NULL) *HddInfo = LocalHddInfo;
|
|
if (HddCount != NULL) *HddCount = LocalHddCount;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
|