Improvements to protocol support
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 31s
Builds / ExectOS (i686) (push) Successful in 30s

This commit is contained in:
Rafal Kupiec 2024-01-12 15:10:27 +01:00
parent c9b843c60f
commit 9501d3da36
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
4 changed files with 77 additions and 11 deletions

View File

@ -94,8 +94,10 @@ typedef PLIST_ENTRY (*PBL_GET_MODULES_LIST)();
typedef INT_PTR (*PBL_GET_SECURE_BOOT_STATUS)(); typedef INT_PTR (*PBL_GET_SECURE_BOOT_STATUS)();
typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid); typedef EFI_STATUS (*PBL_INSTALL_XT_PROTOCOL)(IN PVOID Interface, IN PEFI_GUID Guid);
typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PLIST_ENTRY OptionsList); typedef EFI_STATUS (*PBL_INVOKE_BOOT_PROTOCOL)(IN PLIST_ENTRY OptionsList);
typedef EFI_STATUS (*PBL_LOCATE_PROTOCOL_HANDLES)(OUT PEFI_HANDLE *Handles, OUT PUINT_PTR Count, IN PEFI_GUID ProtocolGuid);
typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle); typedef EFI_STATUS (*PBL_OPEN_VOLUME)(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, OUT PEFI_HANDLE DiskHandle, OUT PEFI_FILE_HANDLE *FsHandle);
typedef EFI_STATUS (*PBL_OPEN_XT_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); typedef EFI_STATUS (*PBL_OPEN_PROTOCOL)(OUT PEFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
typedef EFI_STATUS (*PBL_OPEN_PROTOCOL_HANDLE)(IN EFI_HANDLE Handle, OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid);
typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize); typedef EFI_STATUS (*PBL_READ_FILE)(IN PEFI_FILE_HANDLE DirHandle, IN CONST PWCHAR FileName, OUT PVOID *FileData, OUT PSIZE_T FileSize);
typedef EFI_STATUS (*PBL_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_GUID BootProtocolGuid); typedef EFI_STATUS (*PBL_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_GUID BootProtocolGuid);
typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine); typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine);
@ -273,7 +275,9 @@ typedef struct _XTBL_LOADER_PROTOCOL
PBL_CLOSE_XT_PROTOCOL Close; PBL_CLOSE_XT_PROTOCOL Close;
PBL_GET_MODULES_LIST GetModulesList; PBL_GET_MODULES_LIST GetModulesList;
PBL_INSTALL_XT_PROTOCOL Install; PBL_INSTALL_XT_PROTOCOL Install;
PBL_OPEN_XT_PROTOCOL Open; PBL_LOCATE_PROTOCOL_HANDLES LocateHandles;
PBL_OPEN_PROTOCOL Open;
PBL_OPEN_PROTOCOL_HANDLE OpenHandle;
} Protocol; } Protocol;
struct struct
{ {

View File

@ -147,6 +147,12 @@ XTCDECL
EFI_STATUS EFI_STATUS
BlLoadModules(IN PWCHAR ModulesList); BlLoadModules(IN PWCHAR ModulesList);
XTCDECL
EFI_STATUS
BlLocateProtocolHandles(OUT PEFI_HANDLE *Handles,
OUT PUINT_PTR Count,
IN PEFI_GUID ProtocolGuid);
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlMemoryAllocatePages(IN UINT64 Pages, BlMemoryAllocatePages(IN UINT64 Pages,
@ -178,6 +184,12 @@ BlOpenProtocol(OUT PEFI_HANDLE Handle,
OUT PVOID *ProtocolHandler, OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid); IN PEFI_GUID ProtocolGuid);
XTCDECL
EFI_STATUS
BlOpenProtocolHandle(IN EFI_HANDLE Handle,
OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid);
XTCDECL XTCDECL
VOID VOID
BlQueryConsoleMode(OUT PUINT_PTR ResX, BlQueryConsoleMode(OUT PUINT_PTR ResX,

View File

@ -398,7 +398,32 @@ BlLoadModules(IN PWCHAR ModulesList)
} }
/** /**
* This routine locates and opens the requested XT Boot Loader or EFI protocol. * Returns an array of handles that support the requested protocol.
*
* @param Handles
* Supplies the address where a pointer to all handles found for the protocol interface.
*
* @param Count
* Provides a number of the returned handles.
*
* @param ProtocolGuid
* Supplies a pointer to the unique protocol GUID.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlLocateProtocolHandles(OUT PEFI_HANDLE *Handles,
OUT PUINT_PTR Count,
IN PEFI_GUID ProtocolGuid)
{
return EfiSystemTable->BootServices->LocateHandleBuffer(ByProtocol, ProtocolGuid, NULL, Count, Handles);
}
/**
* Locates and opens the requested XT Boot Loader or EFI protocol.
* *
* @param Handle * @param Handle
* Supplies the address where a pointer to the handle for the protocol interface. * Supplies the address where a pointer to the handle for the protocol interface.
@ -425,7 +450,7 @@ BlOpenProtocol(OUT PEFI_HANDLE Handle,
UINT Index; UINT Index;
/* Try to locate the handles */ /* Try to locate the handles */
Status = EfiSystemTable->BootServices->LocateHandleBuffer(ByProtocol, ProtocolGuid, NULL, &Count, &Handles); Status = BlLocateProtocolHandles(&Handles, &Count, ProtocolGuid);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Unable to get handles */ /* Unable to get handles */
@ -439,9 +464,7 @@ BlOpenProtocol(OUT PEFI_HANDLE Handle,
for(Index = 0; Index < Count; Index++) for(Index = 0; Index < Count; Index++)
{ {
/* Try to open protocol */ /* Try to open protocol */
Status = EfiSystemTable->BootServices->OpenProtocol(Handles[Index], ProtocolGuid, Status = BlOpenProtocolHandle(Handles[Index], ProtocolHandler, ProtocolGuid);
ProtocolHandler, EfiImageHandle, NULL,
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
/* Check if successfully opened the loader protocol */ /* Check if successfully opened the loader protocol */
if(Status == STATUS_EFI_SUCCESS) if(Status == STATUS_EFI_SUCCESS)
@ -467,6 +490,32 @@ BlOpenProtocol(OUT PEFI_HANDLE Handle,
return STATUS_EFI_SUCCESS; return STATUS_EFI_SUCCESS;
} }
/**
* Opens the requested XT Boot Loader or EFI protocol, if it is supported by the handle.
*
* @param Handle
* Supplies a handle for the protocol interface that is being opened.
*
* @param ProtocolHandler
* Supplies the address where a pointer to the opened protocol is returned.
*
* @param ProtocolGuid
* Supplies a pointer to the unique protocol GUID.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlOpenProtocolHandle(IN EFI_HANDLE Handle,
OUT PVOID *ProtocolHandler,
IN PEFI_GUID ProtocolGuid)
{
return EfiSystemTable->BootServices->OpenProtocol(Handle, ProtocolGuid, ProtocolHandler, EfiImageHandle,
NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
}
/** /**
* Registers a boot menu callback routine, that will be used to display alternative boot menu. * Registers a boot menu callback routine, that will be used to display alternative boot menu.
* *
@ -586,8 +635,10 @@ BlpInstallXtLoaderProtocol()
BlpLdrProtocol.Memory.ZeroMemory = RtlZeroMemory; BlpLdrProtocol.Memory.ZeroMemory = RtlZeroMemory;
BlpLdrProtocol.Protocol.Close = BlCloseProtocol; BlpLdrProtocol.Protocol.Close = BlCloseProtocol;
BlpLdrProtocol.Protocol.GetModulesList = BlGetModulesList; BlpLdrProtocol.Protocol.GetModulesList = BlGetModulesList;
BlpLdrProtocol.Protocol.Open = BlOpenProtocol;
BlpLdrProtocol.Protocol.Install = BlInstallProtocol; BlpLdrProtocol.Protocol.Install = BlInstallProtocol;
BlpLdrProtocol.Protocol.LocateHandles = BlLocateProtocolHandles;
BlpLdrProtocol.Protocol.Open = BlOpenProtocol;
BlpLdrProtocol.Protocol.OpenHandle = BlOpenProtocolHandle;
BlpLdrProtocol.Tui.DisplayErrorDialog = BlDisplayErrorDialog; BlpLdrProtocol.Tui.DisplayErrorDialog = BlDisplayErrorDialog;
BlpLdrProtocol.Tui.DisplayInfoDialog = BlDisplayInfoDialog; BlpLdrProtocol.Tui.DisplayInfoDialog = BlDisplayInfoDialog;
BlpLdrProtocol.Tui.DisplayInputDialog = BlDisplayInputDialog; BlpLdrProtocol.Tui.DisplayInputDialog = BlDisplayInputDialog;

View File

@ -613,7 +613,7 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
EFI_STATUS Status; EFI_STATUS Status;
/* Locate handles which support the disk I/O interface */ /* Locate handles which support the disk I/O interface */
Status = EfiSystemTable->BootServices->LocateHandleBuffer(ByProtocol, &IoGuid, NULL, &HandlesCount, &Handles); Status = BlLocateProtocolHandles(&Handles, &HandlesCount, &IoGuid);
if(Status != STATUS_EFI_SUCCESS) if(Status != STATUS_EFI_SUCCESS)
{ {
/* Failed to locate handles */ /* Failed to locate handles */
@ -629,8 +629,7 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
/* Open I/O protocol for given handle */ /* Open I/O protocol for given handle */
Io = NULL; Io = NULL;
Status = EfiSystemTable->BootServices->OpenProtocol(Handles[Index], &IoGuid, (PVOID *)&Io, EfiImageHandle, Status = BlOpenProtocolHandle(Handles[Index], (PVOID *)&Io, &IoGuid);
NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
if(Status != STATUS_EFI_SUCCESS || Io == NULL) if(Status != STATUS_EFI_SUCCESS || Io == NULL)
{ {
/* Failed to open I/O protocol, skip it */ /* Failed to open I/O protocol, skip it */