/** Install PxeBaseCodeCallbackProtocol if not installed before. @param[in, out] Private Pointer to PxeBc private data. @param[out] NewMakeCallback If TRUE, it is a new callback. Otherwise, it is not new callback. @retval EFI_SUCCESS PxeBaseCodeCallbackProtocol installed succesfully. @retval Others Failed to install PxeBaseCodeCallbackProtocol. **/ EFI_STATUS PxeBcInstallCallback ( IN OUT PXEBC_PRIVATE_DATA *Private, OUT BOOLEAN *NewMakeCallback ) { EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; EFI_STATUS Status; // // Check whether PxeBaseCodeCallbackProtocol already installed. // PxeBc = &Private->PxeBc; Status = gBS->HandleProtocol ( Private->Controller, &gEfiPxeBaseCodeCallbackProtocolGuid, (VOID **) &Private->PxeBcCallback ); if (Status == EFI_UNSUPPORTED) { CopyMem ( &Private->LoadFileCallback, &gPxeBcCallBackTemplate, sizeof (EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL) ); // // Install a default callback if user didn't offer one. // Status = gBS->InstallProtocolInterface ( &Private->Controller, &gEfiPxeBaseCodeCallbackProtocolGuid, EFI_NATIVE_INTERFACE, &Private->LoadFileCallback ); (*NewMakeCallback) = (BOOLEAN) (Status == EFI_SUCCESS); Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, NewMakeCallback); if (EFI_ERROR (Status)) { PxeBc->Stop (PxeBc); return Status; } } return EFI_SUCCESS; }
/** Uninstall PxeBaseCodeCallbackProtocol. @param[in] Private Pointer to PxeBc private data. @param[in] NewMakeCallback If TRUE, it is a new callback. Otherwise, it is not new callback. **/ VOID PxeBcUninstallCallback ( IN PXEBC_PRIVATE_DATA *Private, IN BOOLEAN NewMakeCallback ) { EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; PxeBc = &Private->PxeBc; if (NewMakeCallback) { NewMakeCallback = FALSE; PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback); gBS->UninstallProtocolInterface ( Private->Controller, &gEfiPxeBaseCodeCallbackProtocolGuid, &Private->LoadFileCallback ); } }