diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 6113562..1c5149a 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -66,6 +66,7 @@ typedef VOID (*PBL_BOOTMENU_INITIALIZE_OS_LIST)(OUT PXTBL_BOOTMENU_ITEM MenuEntr typedef EFI_STATUS (*PBL_BOOTPROTO_BOOT_SYSTEM)(IN PXTBL_BOOT_PARAMETERS Parameters); typedef EFI_STATUS (*PBL_CLOSE_VOLUME)(IN PEFI_HANDLE VolumeHandle); typedef VOID (*PBL_CLEAR_CONSOLE_LINE)(IN ULONGLONG LineNo); +typedef EFI_STATUS (*PBL_CLOSE_XT_PROTOCOL)(IN PEFI_HANDLE Handle, IN PEFI_GUID ProtocolGuid); typedef VOID (*PBL_CONSOLE_CLEAR_SCREEN)(); typedef VOID (*PBL_CONSOLE_DISABLE_CURSOR)(); typedef VOID (*PBL_CONSOLE_ENABLE_CURSOR)(); @@ -89,12 +90,12 @@ typedef EFI_STATUS (*PBL_FREE_POOL)(IN PVOID Memory); typedef EFI_STATUS (*PBL_GET_MEMORY_MAP)(OUT PEFI_MEMORY_MAP MemoryMap); typedef PLIST_ENTRY (*PBL_GET_MODULES_LIST)(); 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_INVOKE_BOOT_PROTOCOL)(IN PLIST_ENTRY OptionsList); 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 PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); +typedef EFI_STATUS (*PBL_OPEN_XT_PROTOCOL)(OUT PEFI_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_REGISTER_BOOT_PROTOCOL)(IN PWCHAR SystemType, IN PEFI_GUID BootProtocolGuid); -typedef EFI_STATUS (*PBL_REGISTER_XT_PROTOCOL)(IN PEFI_GUID Guid, IN PVOID Interface); typedef VOID (*PBL_REGISTER_XT_BOOT_MENU)(PVOID BootMenuRoutine); typedef VOID (*PBL_SLEEP_EXECUTION)(IN ULONG_PTR Milliseconds); typedef VOID (*PBL_TUI_DISPLAY_ERROR_DIALOG)(IN PWCHAR Caption, IN PWCHAR Message); @@ -258,8 +259,9 @@ typedef struct _XTBL_LOADER_PROTOCOL } Memory; struct { + PBL_CLOSE_XT_PROTOCOL Close; PBL_GET_MODULES_LIST GetModulesList; - PBL_REGISTER_XT_PROTOCOL Install; + PBL_INSTALL_XT_PROTOCOL Install; PBL_OPEN_XT_PROTOCOL Open; } Protocol; struct diff --git a/xtldr/includes/xtldr.h b/xtldr/includes/xtldr.h index 7a3c4a1..bcb9a49 100644 --- a/xtldr/includes/xtldr.h +++ b/xtldr/includes/xtldr.h @@ -174,7 +174,8 @@ BlOpenVolume(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath, XTCDECL EFI_STATUS -BlOpenProtocol(OUT PVOID *ProtocolHandler, +BlOpenProtocol(OUT PEFI_HANDLE Handle, + OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid); XTCDECL @@ -204,8 +205,8 @@ BlRegisterBootProtocol(IN PWCHAR SystemType, XTCDECL EFI_STATUS -BlInstallProtocol(IN PEFI_GUID Guid, - IN PVOID Interface); +BlInstallProtocol(IN PVOID Interface, + IN PEFI_GUID Guid); XTCDECL VOID diff --git a/xtldr/modules/dummy/dummy.c b/xtldr/modules/dummy/dummy.c index b68dbc7..a0af50d 100644 --- a/xtldr/modules/dummy/dummy.c +++ b/xtldr/modules/dummy/dummy.c @@ -56,5 +56,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle, XtLdrProto->Boot.RegisterProtocol(L"XTOS", &DummyGuid); /* Register DUMMY protocol as XTOS boot protocol */ - return XtLdrProto->Protocol.Install(&DummyGuid, &BlpDummyProtocol); + return XtLdrProto->Protocol.Install(&BlpDummyProtocol, &DummyGuid); } diff --git a/xtldr/modules/fb_o/framebuf.c b/xtldr/modules/fb_o/framebuf.c index 769da90..703e56e 100644 --- a/xtldr/modules/fb_o/framebuf.c +++ b/xtldr/modules/fb_o/framebuf.c @@ -88,6 +88,7 @@ FbInitializeDisplay() EFI_GUID GopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; EFI_GUID UgaGuid = EFI_UNIVERSAL_GRAPHICS_ADAPTER_PROTOCOL_GUID; UINT32 Parameter1, Parameter2; + EFI_HANDLE Handle; EFI_STATUS Status; /* Check if framebuffer already initialized */ @@ -99,7 +100,7 @@ FbInitializeDisplay() FrameBufferInfo.Initialized = FALSE; /* Attempt to open GOP protocol */ - Status = XtLdrProtocol->Protocol.Open((PVOID*)&FrameBufferInfo.Adapter.GOP, &GopGuid); + Status = XtLdrProtocol->Protocol.Open(&Handle, (PVOID*)&FrameBufferInfo.Adapter.GOP, &GopGuid); /* Check if Graphics Output Protocol is available */ if(Status == STATUS_EFI_SUCCESS) @@ -119,6 +120,9 @@ FbInitializeDisplay() FrameBufferInfo.FrameBufferSize = FrameBufferInfo.Adapter.GOP->Mode->FrameBufferSize; FrameBufferInfo.Protocol = GOP; FrameBufferInfo.Initialized = TRUE; + + /* Close GOP protocol */ + Status = XtLdrProtocol->Protocol.Close(Handle, &GopGuid); } else { @@ -126,7 +130,7 @@ FbInitializeDisplay() FrameBufferInfo.Adapter.GOP = NULL; /* Attempt to open UGA protocol */ - Status = XtLdrProtocol->Protocol.Open((PVOID*)&FrameBufferInfo.Adapter.UGA, &UgaGuid); + Status = XtLdrProtocol->Protocol.Open(&Handle, (PVOID*)&FrameBufferInfo.Adapter.UGA, &UgaGuid); /* Check if Universal Graphics Adapter is available */ if(Status == STATUS_EFI_SUCCESS) @@ -162,6 +166,9 @@ FbInitializeDisplay() /* Temporarily set this to FALSE, as we don't set FB base and we cannot use it anyway */ FrameBufferInfo.Initialized = FALSE; } + + /* Close UGA protocol */ + XtLdrProtocol->Protocol.Close(Handle, &UgaGuid); } } @@ -251,5 +258,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle, XtFramebufferProtocol.PrintDisplayInformation = FbPrintDisplayInformation; /* Register XTOS boot protocol */ - return XtLdrProtocol->Protocol.Install(&Guid, &XtFramebufferProtocol); + return XtLdrProtocol->Protocol.Install(&XtFramebufferProtocol, &Guid); } diff --git a/xtldr/modules/pecoff_o/pecoff.c b/xtldr/modules/pecoff_o/pecoff.c index 2c48a2e..36ff2f4 100644 --- a/xtldr/modules/pecoff_o/pecoff.c +++ b/xtldr/modules/pecoff_o/pecoff.c @@ -603,5 +603,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle, XtPeCoffProtocol.RelocateImage = PeRelocateImage; /* Register PE/COFF protocol */ - return XtLdrProtocol->Protocol.Install(&Guid, &XtPeCoffProtocol); + return XtLdrProtocol->Protocol.Install(&XtPeCoffProtocol, &Guid); } diff --git a/xtldr/modules/xtos_o/xtos.c b/xtldr/modules/xtos_o/xtos.c index f7248dc..3393367 100644 --- a/xtldr/modules/xtos_o/xtos.c +++ b/xtldr/modules/xtos_o/xtos.c @@ -40,7 +40,7 @@ EFI_STATUS XtBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters) { EFI_GUID PeCoffProtocolGuid = XT_PECOFF_IMAGE_PROTOCOL_GUID; - EFI_HANDLE DiskHandle; + EFI_HANDLE DiskHandle, ProtocolHandle; PEFI_FILE_HANDLE FsHandle, BootDir; PWCHAR SystemPath; EFI_STATUS Status; @@ -49,7 +49,7 @@ XtBootSystem(IN PXTBL_BOOT_PARAMETERS Parameters) XtLdrProtocol->Debug.Print(L"XTOS boot protocol activated\n"); /* Open the XT PE/COFF protocol */ - Status = XtLdrProtocol->Protocol.Open((PVOID *)&XtPeCoffProtocol, &PeCoffProtocolGuid); + Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID *)&XtPeCoffProtocol, &PeCoffProtocolGuid); if(Status != STATUS_EFI_SUCCESS) { /* Failed to open loader protocol */ @@ -183,6 +183,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, PVOID VirtualAddress, VirtualMemoryArea; PXT_ENTRY_POINT KernelEntryPoint; LIST_ENTRY MemoryMappings; + EFI_HANDLE ProtocolHandle; EFI_STATUS Status; /* Initialize XTOS startup sequence */ @@ -250,7 +251,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir, BootDir->Close(BootDir); /* Enable paging */ - XtLdrProtocol->Protocol.Open((PVOID*)&ImageProtocol, &LoadedImageGuid); + XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&ImageProtocol, &LoadedImageGuid); Status = XtEnablePaging(&MemoryMappings, VirtualAddress, ImageProtocol, &XtPageMap); if(Status != STATUS_EFI_SUCCESS) { @@ -333,6 +334,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, EFI_PHYSICAL_ADDRESS Address; // PVOID RuntimeServices; EFI_STATUS Status; + EFI_HANDLE ProtocolHandle; UINT BlockPages, FrameBufferPages; /* Calculate number of pages needed for initialization block */ @@ -359,7 +361,7 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, LoaderBlock->LoaderInformation.DbgPrint = XtLdrProtocol->Debug.Print; /* Load FrameBuffer protocol */ - Status = XtLdrProtocol->Protocol.Open((PVOID*)&FrameBufProtocol, &FrameBufGuid); + Status = XtLdrProtocol->Protocol.Open(&ProtocolHandle, (PVOID*)&FrameBufProtocol, &FrameBufGuid); if(Status == STATUS_EFI_SUCCESS) { /* Make sure FrameBuffer is initialized */ @@ -375,6 +377,9 @@ XtpInitializeLoaderBlock(IN PLIST_ENTRY MemoryMappings, LoaderBlock->LoaderInformation.FrameBuffer.Protocol = NONE; } + /* Close FrameBuffer protocol */ + XtLdrProtocol->Protocol.Close(ProtocolHandle, &FrameBufGuid); + /* Attempt to find virtual address of the EFI Runtime Services */ // Status = XtLdrProtocol->GetVirtualAddress(MemoryMappings, &EfiSystemTable->RuntimeServices->Hdr, &RuntimeServices); // if(Status == STATUS_EFI_SUCCESS) @@ -542,5 +547,5 @@ XtLdrModuleMain(IN EFI_HANDLE ImageHandle, XtLdrProtocol->Boot.RegisterProtocol(L"XTOS", &Guid); /* Install XTOS protocol */ - return XtLdrProtocol->Protocol.Install(&Guid, &XtBootProtocol); + return XtLdrProtocol->Protocol.Install(&XtBootProtocol, &Guid); } diff --git a/xtldr/protocol.c b/xtldr/protocol.c index 7306f25..fc71f1f 100644 --- a/xtldr/protocol.c +++ b/xtldr/protocol.c @@ -9,6 +9,27 @@ #include +/** + * Closes a protocol on a provided handle. + * + * @param Handle + * Supplies a handle for the protocol interface that was previously opened. + * + * @param ProtocolGuid + * Supplies a unique protocol GUID. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlCloseProtocol(IN PEFI_HANDLE Handle, + IN PEFI_GUID ProtocolGuid) +{ + return EfiSystemTable->BootServices->CloseProtocol(Handle, ProtocolGuid, EfiImageHandle, NULL); +} + /** * Finds a boot protocol for specified system type. * @@ -69,6 +90,30 @@ BlGetModulesList() return &BlpLoadedModules; } +/** + * Installs XTLDR protocol interface. + * + * @param Guid + * Specifies a unique protocol GUID. + * + * @param Interface + * Supplies a pointer to the protocol interface, or NULL if there is no structure associated. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlInstallProtocol(IN PVOID Interface, + IN PEFI_GUID Guid) +{ + EFI_HANDLE Handle = NULL; + + /* Install protocol interface */ + return EfiSystemTable->BootServices->InstallProtocolInterface(&Handle, Guid, EFI_NATIVE_INTERFACE, Interface); +} + /** * Loads a specified XTLDR module from disk. * @@ -355,6 +400,9 @@ BlLoadModules(IN PWCHAR ModulesList) /** * This routine locates and opens the requested XT Boot Loader or EFI protocol. * + * @param Handle + * Supplies the address where a pointer to the handle for the protocol interface. + * * @param ProtocolHandler * Supplies the address where a pointer to the opened protocol is returned. * @@ -367,7 +415,8 @@ BlLoadModules(IN PWCHAR ModulesList) */ XTCDECL EFI_STATUS -BlOpenProtocol(OUT PVOID *ProtocolHandler, +BlOpenProtocol(OUT PEFI_HANDLE Handle, + OUT PVOID *ProtocolHandler, IN PEFI_GUID ProtocolGuid) { PEFI_HANDLE Handles = NULL; @@ -398,6 +447,7 @@ BlOpenProtocol(OUT PVOID *ProtocolHandler, if(Status == STATUS_EFI_SUCCESS) { /* Protocol found and successfully opened */ + *Handle = Handles[Index]; break; } } @@ -491,30 +541,6 @@ BlRegisterBootProtocol(IN PWCHAR SystemType, return STATUS_EFI_SUCCESS; } -/** - * Installs XTLDR protocol interface. - * - * @param Guid - * Specifies a unique protocol GUID. - * - * @param Interface - * Supplies a pointer to the protocol interface, or NULL if there is no structure associated. - * - * @return This routine returns a status code. - * - * @since XT 1.0 - */ -XTCDECL -EFI_STATUS -BlInstallProtocol(IN PEFI_GUID Guid, - IN PVOID Interface) -{ - EFI_HANDLE Handle = NULL; - - /* Install protocol interface */ - return EfiSystemTable->BootServices->InstallProtocolInterface(&Handle, Guid, EFI_NATIVE_INTERFACE, Interface); -} - /** * This routine installs XTLDR protocol for further usage by modules. * @@ -554,6 +580,7 @@ BlpInstallXtLoaderProtocol() BlpLdrProtocol.Memory.FreePages = BlMemoryFreePages; BlpLdrProtocol.Memory.FreePool = BlMemoryFreePool; BlpLdrProtocol.Memory.GetMemoryMap = BlGetMemoryMap; + BlpLdrProtocol.Protocol.Close = BlCloseProtocol; BlpLdrProtocol.Protocol.GetModulesList = BlGetModulesList; BlpLdrProtocol.Protocol.Open = BlOpenProtocol; BlpLdrProtocol.Protocol.Install = BlInstallProtocol; @@ -569,5 +596,5 @@ BlpInstallXtLoaderProtocol() /* Register XTLDR loader protocol */ BlDebugPrint(L"Registering XT loader protocol\n"); - return BlInstallProtocol(&Guid, &BlpLdrProtocol); + return BlInstallProtocol(&BlpLdrProtocol, &Guid); } diff --git a/xtldr/xtldr.c b/xtldr/xtldr.c index bc23020..33cd8bf 100644 --- a/xtldr/xtldr.c +++ b/xtldr/xtldr.c @@ -22,6 +22,7 @@ BlInitializeBootLoader() { EFI_GUID LipGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; PEFI_LOADED_IMAGE_PROTOCOL LoadedImage; + EFI_HANDLE Handle; EFI_STATUS Status; /* Set current XTLDR's EFI BootServices status */ @@ -45,7 +46,7 @@ BlInitializeBootLoader() if(DEBUG) { /* Attempt to open EFI LoadedImage protocol */ - Status = BlOpenProtocol((PVOID *)&LoadedImage, &LipGuid); + Status = BlOpenProtocol(&Handle, (PVOID *)&LoadedImage, &LipGuid); if(Status == STATUS_EFI_SUCCESS) { /* Protocol opened successfully, print useful debug information */ @@ -172,6 +173,7 @@ BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList) EFI_GUID BootProtocolGuid; SIZE_T ModuleListLength; PWCHAR ModulesList; + EFI_HANDLE Handle; EFI_STATUS Status; /* Initialize boot parameters and a list of modules */ @@ -262,7 +264,7 @@ BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList) } /* Open boot protocol */ - Status = BlOpenProtocol((PVOID *)&BootProtocol, &BootProtocolGuid); + Status = BlOpenProtocol(&Handle, (PVOID *)&BootProtocol, &BootProtocolGuid); if(Status != STATUS_EFI_SUCCESS) { /* Failed to open boot protocol */