static int initialize_gpt(struct drive *drive, const char *guid) { GptHeader *h = (GptHeader *)drive->gpt.primary_header; memcpy(h->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE); h->revision = GPT_HEADER_REVISION; h->size = sizeof(GptHeader); h->my_lba = 1; h->alternate_lba = drive->gpt.drive_sectors - 1; h->first_usable_lba = 1 + 1 + GPT_ENTRIES_SECTORS; h->last_usable_lba = drive->gpt.drive_sectors - 1 - GPT_ENTRIES_SECTORS - 1; if (guid) { if (StrToGuid(guid, &h->disk_uuid) != CGPT_OK) { Error("Provided GUID is invalid: \"%s\"\n", guid); return CGPT_FAILED; } } else { if (!uuid_generator) { Error("Unable to generate new GUID. uuid_generator not set.\n"); return CGPT_FAILED; } (*uuid_generator)((uint8_t *)&h->disk_uuid); } h->entries_lba = 2; h->number_of_entries = 128; h->size_of_entry = sizeof(GptEntry); // Copy to secondary RepairHeader(&drive->gpt, MASK_PRIMARY); UpdateCrc(&drive->gpt); return CGPT_OK; }
bool Plugin::LoadFromCache(const os::FAR_FIND_DATA &FindData) { const auto& PlCache = *ConfigProvider().PlCacheCfg(); if (const auto id = PlCache.GetCacheID(m_strCacheName)) { if (PlCache.IsPreload(id)) //PF_PRELOAD plugin, skip cache { WorkFlags.Set(PIWF_PRELOADED); return false; } { string strCurPluginID = str_printf( L"%I64x%x%x", FindData.nFileSize, FindData.ftCreationTime.dwLowDateTime, FindData.ftLastWriteTime.dwLowDateTime ); string strPluginID = PlCache.GetSignature(id); if (strPluginID != strCurPluginID) //одинаковые ли бинарники? return false; } if (!PlCache.GetMinFarVersion(id, &MinFarVersion)) { MinFarVersion = FAR_VERSION; } if (!PlCache.GetVersion(id, &PluginVersion)) { ClearStruct(PluginVersion); } VersionString = VersionToString(PluginVersion); m_strGuid = PlCache.GetGuid(id); SetGuid(StrToGuid(m_strGuid,m_Guid)?m_Guid:FarGuid); strTitle = PlCache.GetTitle(id); strDescription = PlCache.GetDescription(id); strAuthor = PlCache.GetAuthor(id); m_model->LoadExportsFromCache(PlCache, id, Exports); WorkFlags.Set(PIWF_CACHED); //too much "cached" flags return true; } return false; }
Shortcuts::Shortcuts() { Changed = false; auto cfg = Global->Db->CreateShortcutsConfig(); auto root = cfg->GetKeyID(0,FolderShortcutsKey); if (root) { for_each_cnt(RANGE(Items, i, size_t index) { i.clear(); unsigned __int64 key = cfg->GetKeyID(root, std::to_wstring(index)); if (key) { for(size_t j=0; ; j++) { const auto sIndex = std::to_wstring(j); ShortcutItem Item; if (!cfg->GetValue(key, RecTypeName[PSCR_RT_SHORTCUT] + sIndex, Item.strFolder)) break; cfg->GetValue(key, RecTypeName[PSCR_RT_NAME] + sIndex, Item.strName); string strPluginGuid; cfg->GetValue(key, RecTypeName[PSCR_RT_PLUGINGUID] + sIndex, strPluginGuid); if(!StrToGuid(strPluginGuid, Item.PluginGuid)) Item.PluginGuid=FarGuid; cfg->GetValue(key, RecTypeName[PSCR_RT_PLUGINFILE] + sIndex, Item.strPluginFile); cfg->GetValue(key, RecTypeName[PSCR_RT_PLUGINDATA] + sIndex, Item.strPluginData); i.emplace_back(std::move(Item)); } } });
/** Function for 'setvar' command. @param[in] ImageHandle Handle to the Image (NULL if Internal). @param[in] SystemTable Pointer to the System Table (NULL if Internal). **/ SHELL_STATUS EFIAPI ShellCommandRunSetVar ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; RETURN_STATUS RStatus; LIST_ENTRY *Package; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CONST CHAR16 *VariableName; EFI_GUID Guid; CONST CHAR16 *StringGuid; UINT32 Attributes; VOID *Buffer; UINTN Size; UINTN LoopVar; ShellStatus = SHELL_SUCCESS; Status = EFI_SUCCESS; Buffer = NULL; Size = 0; Attributes = 0; // // initialize the shell lib (we must be in non-auto-init...) // Status = ShellInitialize(); // ASSERT_EFI_ERROR(Status); Status = CommandInit(); // ASSERT_EFI_ERROR(Status); if (EFI_ERROR(Status)) { return SHELL_UNSUPPORTED; } // // parse the command line // Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status)) { if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"setvar", ProblemParam); FreePool(ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } /* else { ASSERT(FALSE); } */ } else if (ShellCommandLineCheckDuplicate (Package,&ProblemParam) != EFI_SUCCESS) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_DUPLICATE), gShellDebug1HiiHandle, L"setvar", ProblemParam); FreePool(ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetCount(Package) < 2) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setvar"); ShellStatus = SHELL_INVALID_PARAMETER; } else { VariableName = ShellCommandLineGetRawValue(Package, 1); if (!ShellCommandLineGetFlag(Package, L"-guid")){ CopyGuid(&Guid, &gEfiGlobalVariableGuid); } else { StringGuid = ShellCommandLineGetValue(Package, L"-guid"); RStatus = StrToGuid (StringGuid, &Guid); if (RETURN_ERROR (RStatus) || (StringGuid[GUID_STRING_LENGTH] != L'\0')) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", StringGuid); ShellStatus = SHELL_INVALID_PARAMETER; } } if (ShellCommandLineGetCount(Package) == 2) { // // Display // Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool(Size); Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); } if (!EFI_ERROR(Status) && Buffer != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size); for (LoopVar = 0; LoopVar < Size; LoopVar++) { ShellPrintEx(-1, -1, L"%02x ", ((UINT8*)Buffer)[LoopVar]); } ShellPrintEx(-1, -1, L"\r\n"); } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); ShellStatus = SHELL_ACCESS_DENIED; } } else { // // Create, Delete or Modify. // Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool(Size); Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); } if (EFI_ERROR(Status) || Buffer == NULL) { // // Creating a new variable. determine attributes from command line. // Attributes = 0; if (ShellCommandLineGetFlag(Package, L"-bs")) { Attributes |= EFI_VARIABLE_BOOTSERVICE_ACCESS; } if (ShellCommandLineGetFlag(Package, L"-rt")) { Attributes |= EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS; } if (ShellCommandLineGetFlag(Package, L"-nv")) { Attributes |= EFI_VARIABLE_NON_VOLATILE; } } SHELL_FREE_NON_NULL(Buffer); Size = 0; Status = GetVariableDataFromParameter(Package, (UINT8 **)&Buffer, &Size); if (!EFI_ERROR(Status)) { Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, Size, Buffer); } if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT(ShellStatus == SHELL_SUCCESS); } } } ShellCommandLineFreeVarList (Package); } if (Buffer != NULL) { FreePool(Buffer); } return (ShellStatus); }
history_return_type History::ProcessMenu(string &strStr, GUID* Guid, string *pstrFile, string *pstrData, const wchar_t *Title, VMenu2 &HistoryMenu, int Height, history_record_type &Type, Dialog *Dlg) { unsigned __int64 SelectedRecord = 0; string strSelectedRecordName,strSelectedRecordGuid,strSelectedRecordFile,strSelectedRecordData; history_record_type SelectedRecordType = HR_DEFAULT; FarListPos Pos={sizeof(FarListPos)}; int MenuExitCode=-1; history_return_type RetCode = HRT_ENTER; bool Done=false; bool SetUpMenuPos=false; if (m_TypeHistory == HISTORYTYPE_DIALOG && !HistoryCfgRef()->Count(m_TypeHistory,m_HistoryName)) return HRT_CANCEL; while (!Done) { bool IsUpdate=false; HistoryMenu.DeleteItems(); { bool bSelected=false; DWORD index=0; string strHName,strHGuid,strHFile,strHData; history_record_type HType; bool HLock; unsigned __int64 id; unsigned __int64 Time; SYSTEMTIME st; GetLocalTime(&st); int LastDay=0, LastMonth = 0, LastYear = 0; const auto GetTitle = [](history_record_type Type) -> const wchar_t* { switch (Type) { case HR_VIEWER: return MSG(MHistoryView); case HR_EDITOR: case HR_EDITOR_RO: return MSG(MHistoryEdit); case HR_EXTERNAL: case HR_EXTERNAL_WAIT: return MSG(MHistoryExt); } return L""; }; while (HistoryCfgRef()->Enum(index++,m_TypeHistory,m_HistoryName,&id,strHName,&HType,&HLock,&Time,strHGuid,strHFile,strHData,m_TypeHistory==HISTORYTYPE_DIALOG)) { string strRecord; if (m_TypeHistory == HISTORYTYPE_VIEW) strRecord = GetTitle(HType) + string(L":") + (HType == HR_EDITOR_RO ? L"-" : L" "); else if (m_TypeHistory == HISTORYTYPE_FOLDER) { GUID HGuid; if(StrToGuid(strHGuid,HGuid) && HGuid != FarGuid) { Plugin *pPlugin = Global->CtrlObject->Plugins->FindPlugin(HGuid); strRecord = (pPlugin ? pPlugin->GetTitle() : L"{" + strHGuid + L"}") + L":"; if(!strHFile.empty()) strRecord += strHFile + L":"; } } auto FTTime = UI64ToFileTime(Time); SYSTEMTIME SavedTime; Utc2Local(FTTime, SavedTime); if(LastDay != SavedTime.wDay || LastMonth != SavedTime.wMonth || LastYear != SavedTime.wYear) { LastDay = SavedTime.wDay; LastMonth = SavedTime.wMonth; LastYear = SavedTime.wYear; MenuItemEx Separator; Separator.Flags = LIF_SEPARATOR; string strTime; ConvertDate(FTTime, Separator.strName, strTime, 5, FALSE, FALSE, TRUE); HistoryMenu.AddItem(Separator); } strRecord += strHName; if (m_TypeHistory != HISTORYTYPE_DIALOG) ReplaceStrings(strRecord, L"&", L"&&"); MenuItemEx MenuItem(strRecord); MenuItem.SetCheck(HLock?1:0); if (!SetUpMenuPos && m_CurrentItem==id) { MenuItem.SetSelect(TRUE); bSelected=true; } HistoryMenu.SetUserData(&id,sizeof(id),HistoryMenu.AddItem(MenuItem)); } if (!SetUpMenuPos && !bSelected && m_TypeHistory!=HISTORYTYPE_DIALOG) { FarListPos p={sizeof(FarListPos)}; p.SelectPos = HistoryMenu.GetItemCount()-1; p.TopPos = 0; HistoryMenu.SetSelectPos(&p); } } if (m_TypeHistory == HISTORYTYPE_DIALOG) { int X1,Y1,X2,Y2; Dlg->CalcComboBoxPos(nullptr, HistoryMenu.GetItemCount(), X1, Y1, X2, Y2); HistoryMenu.SetPosition(X1, Y1, X2, Y2); } else HistoryMenu.SetPosition(-1,-1,0,0); if (SetUpMenuPos) { Pos.SelectPos=Pos.SelectPos < HistoryMenu.GetItemCount() ? Pos.SelectPos : HistoryMenu.GetItemCount()-1; Pos.TopPos=std::min(Pos.TopPos,HistoryMenu.GetItemCount()-Height); HistoryMenu.SetSelectPos(&Pos); SetUpMenuPos=false; } if(m_TypeHistory == HISTORYTYPE_DIALOG && !HistoryMenu.GetItemCount()) return HRT_CANCEL; MenuExitCode=HistoryMenu.Run([&](const Manager::Key& RawKey)->int { const auto Key=RawKey.FarKey(); if (m_TypeHistory == HISTORYTYPE_DIALOG && Key==KEY_TAB) // Tab в списке хистори диалогов - аналог Enter { HistoryMenu.Close(); return 1; } HistoryMenu.GetSelectPos(&Pos); void* Data = HistoryMenu.GetUserData(nullptr, 0,Pos.SelectPos); unsigned __int64 CurrentRecord = Data? *static_cast<unsigned __int64*>(Data) : 0; int KeyProcessed = 1; switch (Key) { case KEY_CTRLR: // обновить с удалением недоступных case KEY_RCTRLR: { if (m_TypeHistory == HISTORYTYPE_FOLDER || m_TypeHistory == HISTORYTYPE_VIEW) { bool ModifiedHistory=false; SCOPED_ACTION(auto) = HistoryCfgRef()->ScopedTransaction(); DWORD index=0; string strHName,strHGuid,strHFile,strHData; history_record_type HType; bool HLock; unsigned __int64 id; unsigned __int64 Time; while (HistoryCfgRef()->Enum(index++,m_TypeHistory,m_HistoryName,&id,strHName,&HType,&HLock,&Time,strHGuid,strHFile,strHData)) { if (HLock) // залоченные не трогаем continue; // убить запись из истории bool kill=false; GUID HGuid; if(StrToGuid(strHGuid,HGuid) && HGuid != FarGuid) { if (!Global->CtrlObject->Plugins->FindPlugin(HGuid)) kill=true; else if (!strHFile.empty() && !os::fs::exists(strHFile)) kill=true; } else if (!os::fs::exists(strHName)) kill=true; if(kill) { HistoryCfgRef()->Delete(id); ModifiedHistory=true; } } if (ModifiedHistory) // избавляемся от лишних телодвижений { IsUpdate=true; HistoryMenu.Close(Pos.SelectPos); } ResetPosition(); } break; } case KEY_CTRLSHIFTNUMENTER: case KEY_RCTRLSHIFTNUMENTER: case KEY_CTRLNUMENTER: case KEY_RCTRLNUMENTER: case KEY_SHIFTNUMENTER: case KEY_CTRLSHIFTENTER: case KEY_RCTRLSHIFTENTER: case KEY_CTRLENTER: case KEY_RCTRLENTER: case KEY_SHIFTENTER: case KEY_CTRLALTENTER: case KEY_RCTRLRALTENTER: case KEY_CTRLRALTENTER: case KEY_RCTRLALTENTER: case KEY_CTRLALTNUMENTER: case KEY_RCTRLRALTNUMENTER: case KEY_CTRLRALTNUMENTER: case KEY_RCTRLALTNUMENTER: { if (m_TypeHistory == HISTORYTYPE_DIALOG) break; HistoryMenu.Close(Pos.SelectPos); Done=true; RetCode = (Key==KEY_CTRLALTENTER||Key==KEY_RCTRLRALTENTER||Key==KEY_CTRLRALTENTER||Key==KEY_RCTRLALTENTER|| Key==KEY_CTRLALTNUMENTER||Key==KEY_RCTRLRALTNUMENTER||Key==KEY_CTRLRALTNUMENTER||Key==KEY_RCTRLALTNUMENTER)? HRT_CTRLALTENTER :((Key==KEY_CTRLSHIFTENTER||Key==KEY_RCTRLSHIFTENTER||Key==KEY_CTRLSHIFTNUMENTER||Key==KEY_RCTRLSHIFTNUMENTER)? HRT_CTRLSHIFTENTER :((Key==KEY_SHIFTENTER||Key==KEY_SHIFTNUMENTER)? HRT_SHIFTETNER :HRT_CTRLENTER)); break; } case KEY_F3: case KEY_F4: case KEY_NUMPAD5: case KEY_SHIFTNUMPAD5: { if (m_TypeHistory != HISTORYTYPE_VIEW) break; HistoryMenu.Close(Pos.SelectPos); Done=true; RetCode=(Key==KEY_F4? HRT_F4 : HRT_F3); break; } // $ 09.04.2001 SVS - Фича - копирование из истории строки в Clipboard case KEY_CTRLC: case KEY_RCTRLC: case KEY_CTRLINS: case KEY_CTRLNUMPAD0: case KEY_RCTRLINS: case KEY_RCTRLNUMPAD0: { if (CurrentRecord) { string strName; if (HistoryCfgRef()->Get(CurrentRecord, strName)) SetClipboard(strName); } break; } // Lock/Unlock case KEY_INS: case KEY_NUMPAD0: { if (CurrentRecord) { HistoryCfgRef()->FlipLock(CurrentRecord); ResetPosition(); HistoryMenu.Close(Pos.SelectPos); IsUpdate=true; SetUpMenuPos=true; } break; } case KEY_SHIFTNUMDEL: case KEY_SHIFTDEL: { if (CurrentRecord && !HistoryCfgRef()->IsLocked(CurrentRecord)) { HistoryCfgRef()->Delete(CurrentRecord); ResetPosition(); HistoryMenu.Close(Pos.SelectPos); IsUpdate=true; SetUpMenuPos=true; } break; } case KEY_NUMDEL: case KEY_DEL: { if (HistoryMenu.GetItemCount() && (!Global->Opt->Confirm.HistoryClear || (Global->Opt->Confirm.HistoryClear && !Message(MSG_WARNING,2, MSG((m_TypeHistory==HISTORYTYPE_CMD || m_TypeHistory==HISTORYTYPE_DIALOG?MHistoryTitle: (m_TypeHistory==HISTORYTYPE_FOLDER?MFolderHistoryTitle:MViewHistoryTitle))), MSG(MHistoryClear), MSG(MClear),MSG(MCancel))))) { HistoryCfgRef()->DeleteAllUnlocked(m_TypeHistory,m_HistoryName); ResetPosition(); HistoryMenu.Close(Pos.SelectPos); IsUpdate=true; } break; } default: KeyProcessed = 0; } return KeyProcessed; }); if (IsUpdate) continue; Done=true; if (MenuExitCode >= 0) { SelectedRecord = *static_cast<unsigned __int64*>(HistoryMenu.GetUserData(nullptr, 0, MenuExitCode)); if (!SelectedRecord) return HRT_CANCEL; if (!HistoryCfgRef()->Get(SelectedRecord, strSelectedRecordName, &SelectedRecordType, strSelectedRecordGuid, strSelectedRecordFile, strSelectedRecordData)) return HRT_CANCEL; #if 1 //Maximus: для сетевых ресурсов - танцы с бубном if (Global->Opt->RemoteAutoLogin && SelectedRecordType != HR_EXTERNAL && SelectedRecordType != HR_EXTERNAL_WAIT // ignore external && RetCode != HRT_CTRLENTER && ((m_TypeHistory == HISTORYTYPE_FOLDER && strSelectedRecordGuid.empty()) || m_TypeHistory == HISTORYTYPE_VIEW)) { size_t DirOffset = 0; PATH_TYPE Type = ParsePath(strSelectedRecordName, &DirOffset); string strCopy = DirOffset ? strSelectedRecordName.substr(0, DirOffset) : strSelectedRecordName.data(); if (Type == PATH_REMOTE /*|| Type == PATH_REMOTEUNC*/) { auto DE = std::make_unique<elevation::suppress>(); if (os::GetFileAttributes(strSelectedRecordName) == INVALID_FILE_ATTRIBUTES) { FarMacroValue vParams[2]={L"connect",strCopy.data()}; OpenMacroInfo info={sizeof(OpenMacroInfo),2,vParams}; void* CallResult = nullptr; //we must pass (&CallResult) to avoid memory leak Global->CtrlObject->Plugins->CallPlugin(Global->Opt->KnownIDs.Network.Id, OPEN_FROMMACRO, &info, &CallResult); //CallResult==1 on succeess? } } } //Maximus: поплясали - теперь как обычно if (SelectedRecordType != HR_EXTERNAL && SelectedRecordType != HR_EXTERNAL_WAIT && RetCode != HRT_CTRLENTER && ((m_TypeHistory == HISTORYTYPE_FOLDER && strSelectedRecordGuid.empty()) || m_TypeHistory == HISTORYTYPE_VIEW) && !os::fs::exists(strSelectedRecordName)) #else if (SelectedRecordType != HR_EXTERNAL && SelectedRecordType != HR_EXTERNAL_WAIT && RetCode != HRT_CTRLENTER && ((m_TypeHistory == HISTORYTYPE_FOLDER && strSelectedRecordGuid.empty()) || m_TypeHistory == HISTORYTYPE_VIEW) && !os::fs::exists(strSelectedRecordName)) #endif { SetLastError(ERROR_FILE_NOT_FOUND); Global->CatchError(); if (SelectedRecordType == HR_EDITOR && m_TypeHistory == HISTORYTYPE_VIEW) // Edit? тогда спросим и если надо создадим { if (!Message(MSG_WARNING|MSG_ERRORTYPE,2,Title,strSelectedRecordName.data(),MSG(MViewHistoryIsCreate),MSG(MHYes),MSG(MHNo))) break; } else { Message(MSG_WARNING|MSG_ERRORTYPE,1,Title,strSelectedRecordName.data(),MSG(MOk)); } Done=false; SetUpMenuPos=true; continue; } } } if (MenuExitCode < 0 || !SelectedRecord) return HRT_CANCEL; if (m_KeepSelectedPos) { m_CurrentItem = SelectedRecord; } strStr = strSelectedRecordName; if(Guid) { if(!StrToGuid(strSelectedRecordGuid,*Guid)) *Guid = FarGuid; } if(pstrFile) *pstrFile = strSelectedRecordFile; if(pstrData) *pstrData = strSelectedRecordData; switch(RetCode) { case HRT_CANCEL: break; case HRT_ENTER: case HRT_SHIFTETNER: case HRT_CTRLENTER: case HRT_CTRLSHIFTENTER: case HRT_CTRLALTENTER: Type = SelectedRecordType; break; case HRT_F3: Type = HR_VIEWER; RetCode = HRT_ENTER; break; case HRT_F4: Type = HR_EDITOR; if (SelectedRecordType == HR_EDITOR_RO) Type = HR_EDITOR_RO; RetCode = HRT_ENTER; break; } return RetCode; }
/** Update Capsule image. @param[in] ImageHandle The image handle. @param[in] SystemTable The system table. @retval EFI_SUCCESS Command completed successfully. @retval EFI_UNSUPPORTED Command usage unsupported. @retval EFI_INVALID_PARAMETER Command usage invalid. @retval EFI_NOT_FOUND The input file can't be found. **/ EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; RETURN_STATUS RStatus; UINTN FileSize[MAX_CAPSULE_NUM]; VOID *CapsuleBuffer[MAX_CAPSULE_NUM]; EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors; EFI_CAPSULE_HEADER *CapsuleHeaderArray[MAX_CAPSULE_NUM + 1]; UINT64 MaxCapsuleSize; EFI_RESET_TYPE ResetType; BOOLEAN NeedReset; BOOLEAN NoReset; CHAR16 *CapsuleName; UINTN CapsuleNum; UINTN Index; Status = GetArg(); if (EFI_ERROR(Status)) { Print(L"Please use UEFI SHELL to run this application!\n", Status); return Status; } if (Argc < 2) { PrintUsage(); return EFI_UNSUPPORTED; } if (StrCmp(Argv[1], L"-D") == 0) { if (Argc != 3) { Print(L"CapsuleApp: Incorrect parameter count.\n"); return EFI_UNSUPPORTED; } Status = DumpCapsule(Argv[2]); return Status; } if (StrCmp(Argv[1], L"-G") == 0) { Status = CreateBmpFmp(); return Status; } if (StrCmp(Argv[1], L"-N") == 0) { Status = CreateNestedFmp(); return Status; } if (StrCmp(Argv[1], L"-S") == 0) { Status = DmpCapsuleStatusVariable(); return EFI_SUCCESS; } if (StrCmp(Argv[1], L"-C") == 0) { Status = ClearCapsuleStatusVariable(); return Status; } if (StrCmp(Argv[1], L"-P") == 0) { if (Argc == 2) { DumpFmpData(); } if (Argc >= 3) { if (StrCmp(Argv[2], L"GET") != 0) { Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]); return EFI_UNSUPPORTED; } else { if (Argc != 7) { Print(L"CapsuleApp: Incorrect parameter count.\n"); return EFI_UNSUPPORTED; } EFI_GUID ImageTypeId; UINTN ImageIndex; // // FMP->GetImage() // RStatus = StrToGuid (Argv[3], &ImageTypeId); if (RETURN_ERROR (RStatus) || (Argv[3][GUID_STRING_LENGTH] != L'\0')) { Print (L"Invalid ImageTypeId - %s\n", Argv[3]); return EFI_INVALID_PARAMETER; } ImageIndex = StrDecimalToUintn(Argv[4]); if (StrCmp(Argv[5], L"-O") != 0) { Print(L"CapsuleApp: NO output file name.\n"); return EFI_UNSUPPORTED; } DumpFmpImage(&ImageTypeId, ImageIndex, Argv[6]); } } return EFI_SUCCESS; } if (StrCmp(Argv[1], L"-E") == 0) { DumpEsrtData(); return EFI_SUCCESS; } if (Argv[1][0] == L'-') { Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[1]); return EFI_UNSUPPORTED; } CapsuleFirstIndex = 1; NoReset = FALSE; if ((Argc > 1) && (StrCmp(Argv[Argc - 1], L"-NR") == 0)) { NoReset = TRUE; CapsuleLastIndex = Argc - 2; } else { CapsuleLastIndex = Argc - 1; } CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1; if (CapsuleFirstIndex > CapsuleLastIndex) { Print(L"CapsuleApp: NO capsule image.\n"); return EFI_UNSUPPORTED; } if (CapsuleNum > MAX_CAPSULE_NUM) { Print(L"CapsuleApp: Too many capsule images.\n"); return EFI_UNSUPPORTED; } ZeroMem(&CapsuleBuffer, sizeof(CapsuleBuffer)); ZeroMem(&FileSize, sizeof(FileSize)); BlockDescriptors = NULL; for (Index = 0; Index < CapsuleNum; Index++) { CapsuleName = Argv[CapsuleFirstIndex + Index]; Status = ReadFileToBuffer(CapsuleName, &FileSize[Index], &CapsuleBuffer[Index]); if (EFI_ERROR(Status)) { Print(L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName); goto Done; } if (!IsValidCapsuleHeader (CapsuleBuffer[Index], FileSize[Index])) { Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName); return EFI_INVALID_PARAMETER; } } // // Every capsule use 2 descriptor 1 for data 1 for end // Status = BuildGatherList(CapsuleBuffer, FileSize, CapsuleNum, &BlockDescriptors); if (EFI_ERROR(Status)) { goto Done; } // // Call the runtime service capsule. // NeedReset = FALSE; for (Index = 0; Index < CapsuleNum; Index++) { CapsuleHeaderArray[Index] = (EFI_CAPSULE_HEADER *) CapsuleBuffer[Index]; if ((CapsuleHeaderArray[Index]->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) { NeedReset = TRUE; } } CapsuleHeaderArray[CapsuleNum] = NULL; // // Inquire platform capability of UpdateCapsule. // Status = gRT->QueryCapsuleCapabilities (CapsuleHeaderArray, CapsuleNum, &MaxCapsuleSize, &ResetType); if (EFI_ERROR(Status)) { Print (L"CapsuleApp: failed to query capsule capability - %r\n", Status); goto Done; } for (Index = 0; Index < CapsuleNum; Index++) { if (FileSize[Index] > MaxCapsuleSize) { Print (L"CapsuleApp: capsule is too large to update, %ld is allowed\n", MaxCapsuleSize); Status = EFI_UNSUPPORTED; goto Done; } } // // Check whether the input capsule image has the flag of persist across system reset. // if (NeedReset) { Status = gRT->UpdateCapsule(CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors); if (Status != EFI_SUCCESS) { Print (L"CapsuleApp: failed to update capsule - %r\n", Status); goto Done; } // // For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET + CAPSULE_FLAGS_INITIATE_RESET, // a system reset should have been triggered by gRT->UpdateCapsule() calling above. // // For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET, // check if -NR (no-reset) has been specified or not. // if (!NoReset) { // // For capsule who has reset flag and no -NR (no-reset) has been specified, after calling UpdateCapsule service, // trigger a system reset to process capsule persist across a system reset. // gRT->ResetSystem (ResetType, EFI_SUCCESS, 0, NULL); } } else { // // For capsule who has no reset flag, only call UpdateCapsule Service without a // system reset. The service will process the capsule immediately. // Status = gRT->UpdateCapsule (CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors); if (Status != EFI_SUCCESS) { Print (L"CapsuleApp: failed to update capsule - %r\n", Status); } } Status = EFI_SUCCESS; Done: for (Index = 0; Index < CapsuleNum; Index++) { if (CapsuleBuffer[Index] != NULL) { FreePool (CapsuleBuffer[Index]); } } CleanGatherList(BlockDescriptors, CapsuleNum); return Status; }
int cmd_add(int argc, char *argv[]) { CgptAddParams params; memset(¶ms, 0, sizeof(params)); int c; int errorcnt = 0; char *e = 0; unsigned long long lba_end; opterr = 0; // quiet, you while ((c=getopt(argc, argv, ":hi:b:s:t:u:l:S:T:P:A:")) != -1) { switch (c) { case 'i': params.partition = (uint32_t)strtoul(optarg, &e, 0); if (!*optarg || (e && *e)) { Error("invalid argument to -%c: \"%s\"\n", c, optarg); errorcnt++; } break; case 'b': params.set_begin = 1; params.begin = strtoull(optarg, &e, 0); if (!*optarg || (e && *e)) { Error("invalid argument to -%c: \"%s\"\n", c, optarg); errorcnt++; } break; case 's': params.set_size = 1; if (!parse_lba_end(optarg, &lba_end)) { params.size = ( _lba_count(argv[argc-1] ) - params.begin) - lba_end ; } else params.size = strtoull(optarg, &e, 0); if (!*optarg || (e && *e)) { Error("invalid argument to -%c: \"%s\"\n", c, optarg); errorcnt++; } break; case 't': params.set_type = 1; if (CGPT_OK != SupportedType(optarg, ¶ms.type_guid) && CGPT_OK != StrToGuid(optarg, ¶ms.type_guid)) { Error("invalid argument to -%c: %s\n", c, optarg); errorcnt++; } break; case 'u': params.set_unique = 1; if (CGPT_OK != StrToGuid(optarg, ¶ms.unique_guid)) { Error("invalid argument to -%c: %s\n", c, optarg); errorcnt++; } break; case 'l': params.label = optarg; break; case 'S': params.set_successful = 1; params.successful = (uint32_t)strtoul(optarg, &e, 0); if (!*optarg || (e && *e)) { Error("invalid argument to -%c: \"%s\"\n", c, optarg); errorcnt++; } if (params.successful < 0 || params.successful > 1) { Error("value for -%c must be between 0 and 1", c); errorcnt++; } break; case 'T': params.set_tries = 1; params.tries = (uint32_t)strtoul(optarg, &e, 0); if (!*optarg || (e && *e)) { fprintf(stderr, "%s: invalid argument to -%c: \"%s\"\n", progname, c, optarg); errorcnt++; } if (params.tries < 0 || params.tries > 15) { Error("value for -%c must be between 0 and 15", c); errorcnt++; } break; case 'P': params.set_priority = 1; params.priority = (uint32_t)strtoul(optarg, &e, 0); if (!*optarg || (e && *e)) { Error("invalid argument to -%c: \"%s\"\n", c, optarg); errorcnt++; } if (params.priority < 0 || params.priority > 15) { Error("value for -%c must be between 0 and 15", c); errorcnt++; } break; case 'A': params.set_raw = 1; params.raw_value = strtoull(optarg, &e, 0); if (!*optarg || (e && *e)) { Error("invalid argument to -%c: \"%s\"\n", c, optarg); errorcnt++; } break; case 'h': Usage(); return CGPT_OK; case '?': Error("unrecognized option: -%c\n", optopt); errorcnt++; break; case ':': Error("missing argument to -%c\n", optopt); errorcnt++; break; default: errorcnt++; break; } } if (errorcnt) { Usage(); return CGPT_FAILED; } if (optind >= argc) { Error("missing drive argument\n"); return CGPT_FAILED; } params.drive_name = argv[optind]; return cgpt_add(¶ms); }
HANDLE WINAPI OpenW(const struct OpenInfo *OInfo) { if (OInfo->OpenFrom == OPEN_EDITOR || OInfo->OpenFrom==OPEN_FROMMACRO) { HANDLE MacroResult=nullptr; // в редакторе проверяем файл на принадлежность к системе помощи Far Manager if (IsHlf()) { if (ShowCurrentHelpTopic()) MacroResult=INVALID_HANDLE_VALUE; } else if (OInfo->OpenFrom!=OPEN_FROMMACRO) { const wchar_t *Items[] = { GetMsg(MTitle), GetMsg(MNotAnHLF), GetMsg(MOk) }; Info.Message(&MainGuid, nullptr, 0, NULL, Items, ARRAYSIZE(Items), 1); } return (OInfo->OpenFrom==OPEN_FROMMACRO)?MacroResult:nullptr; } if (OInfo->OpenFrom==OPEN_COMMANDLINE) { static wchar_t cmdbuf[1024], FileName[MAX_PATH], *ptrTopic, *ptrName; // разбор "параметров ком.строки" lstrcpyn(cmdbuf,((OpenCommandLineInfo*)OInfo->Data)->CommandLine,ARRAYSIZE(cmdbuf)); if (cmdbuf[0]) { FSF.Trim(cmdbuf); ptrName=ptrTopic=cmdbuf; if (*cmdbuf==L'\"') { ptrName++; ptrTopic++; while (*ptrTopic!=L'\"' && *ptrTopic) ptrTopic++; } else { while (*ptrTopic!=L' ' && *ptrTopic) ptrTopic++; } int hasTopic = (*ptrTopic == L' '); *ptrTopic=0; if (hasTopic) { ptrTopic++; if (*ptrTopic == L'@') ptrTopic++; if (lstrlen(ptrTopic)) FSF.Trim(ptrTopic); else ptrTopic=NULL; } else { if (*ptrName == L'@') { ptrTopic=ptrName+1; FSF.Trim(ptrTopic); ptrName=NULL; } else ptrTopic = NULL; } wchar_t *ptrCurDir=NULL; // Здесь: ptrName - тмя файла/GUID, ptrTopic - имя темы // показ темы помощи по GUID`у GUID FindGuid; bool guidMode=StrToGuid(ptrName,&FindGuid); if (!guidMode && *ptrName == L'{') { ptrName++; wchar_t *ptrNameEnd=ptrName+lstrlen(ptrName)-1; if (*ptrNameEnd == L'}') *ptrNameEnd=0; guidMode=StrToGuid(ptrName,&FindGuid); } if (guidMode) Info.ShowHelp((const wchar_t*)&FindGuid,ptrTopic,FHELP_GUID); // по GUID`у не найдено, пробуем имя файла if (!guidMode) { wchar_t TempFileName[MAX_PATH*2]; wchar_t ExpFileName[MAX_PATH*2]; lstrcpyn(TempFileName,ptrName,ARRAYSIZE(TempFileName)); // Если имя файла без пути... if (FSF.PointToName(ptrName) == ptrName) { // ...смотрим в текущем каталоге size_t Size=FSF.GetCurrentDirectory(0,NULL); if (Size) { ptrCurDir=new WCHAR[Size+lstrlen(ptrName)+8]; FSF.GetCurrentDirectory(Size,ptrCurDir); lstrcat(ptrCurDir,L"\\"); lstrcat(ptrCurDir,ptrName); if (FileExists(ptrCurDir)) ptrName=(wchar_t *)ptrCurDir; } // ...в текущем нет... if (FSF.PointToName(ptrName) == ptrName) { // ...смотрим в %FARHOME% ExpandEnvironmentStrings(L"%FARHOME%",ExpFileName,ARRAYSIZE(ExpFileName)); FSF.AddEndSlash(ExpFileName); lstrcat(ExpFileName,ptrName); if (!FileExists(ExpFileName)) { // ...в %FARHOME% нет, поищем по путям плагинов. if (FindPluginHelp(ptrName,ExpFileName)) ptrName=ExpFileName; } else ptrName=ExpFileName; } } else { // ptrName указан с путём. ExpandEnvironmentStrings(ptrName,ExpFileName,ARRAYSIZE(ExpFileName)); ptrName=ExpFileName; } GetFullPathName(ptrName,MAX_PATH,FileName,&ptrName); if (ptrCurDir) delete[] ptrCurDir; if (!ShowHelp(FileName,ptrTopic,true,(!ptrTopic || !*ptrTopic?false:true))) { // синтаксис hlf:topic_из_ФАР_хелпа ==> TempFileName Info.ShowHelp(nullptr,TempFileName,FHELP_FARHELP); } } } else { // параметры не указаны, выводим подсказку по использованию плагина. Info.ShowHelp(Info.ModuleName,L"cmd",FHELP_SELFHELP); } } return nullptr; }