VirtualBox

Changeset 91685 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Oct 12, 2021 9:26:59 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
147413
Message:

Main/UefiVariableStore,FE/VBoxManage: Implement API to delete and change the content of a UEFI variable and hook it up to VBoxManage, bugref:9580

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyNvram.cpp

    r91617 r91685  
    289289
    290290/**
     291 * Handles the 'modifynvram myvm deletevar' sub-command.
     292 * @returns Exit code.
     293 * @param   a               The handler argument package.
     294 * @param   nvram           Reference to the NVRAM store interface.
     295 */
     296static RTEXITCODE handleModifyNvramDeleteUefiVar(HandlerArg *a, ComPtr<INvramStore> &nvramStore)
     297{
     298    static const RTGETOPTDEF s_aOptions[] =
     299    {
     300        /* common options */
     301        { "--name",       'n', RTGETOPT_REQ_STRING },
     302        { "--owner-uuid", 'f', RTGETOPT_REQ_STRING }
     303    };
     304
     305    const char *pszVarName = NULL;
     306    const char *pszOwnerUuid = NULL;
     307
     308    RTGETOPTSTATE GetState;
     309    int vrc = RTGetOptInit(&GetState, a->argc - 2, &a->argv[2], s_aOptions, RT_ELEMENTS(s_aOptions), 0, 0);
     310    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     311
     312    int c;
     313    RTGETOPTUNION ValueUnion;
     314    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
     315    {
     316        switch (c)
     317        {
     318            case 'n':
     319                pszVarName = ValueUnion.psz;
     320                break;
     321            case 'f':
     322                pszOwnerUuid = ValueUnion.psz;
     323                break;
     324            default:
     325                return errorGetOpt(c, &ValueUnion);
     326        }
     327    }
     328
     329    if (!pszVarName)
     330        return errorSyntax("No variable name was given to \"deletevar\"");
     331    if (!pszOwnerUuid)
     332        return errorSyntax("No owner UUID was given to \"deletevar\"");
     333
     334    ComPtr<IUefiVariableStore> uefiVarStore;
     335    CHECK_ERROR2I_RET(nvramStore, COMGETTER(UefiVariableStore)(uefiVarStore.asOutParam()), RTEXITCODE_FAILURE);
     336    CHECK_ERROR2I_RET(uefiVarStore, DeleteVariable(Bstr(pszVarName).raw(), Bstr(pszOwnerUuid).raw()), RTEXITCODE_FAILURE);
     337
     338    return RTEXITCODE_SUCCESS;
     339}
     340
     341
     342/**
     343 * Handles the 'modifynvram myvm changevar' sub-command.
     344 * @returns Exit code.
     345 * @param   a               The handler argument package.
     346 * @param   nvram           Reference to the NVRAM store interface.
     347 */
     348static RTEXITCODE handleModifyNvramChangeUefiVar(HandlerArg *a, ComPtr<INvramStore> &nvramStore)
     349{
     350    static const RTGETOPTDEF s_aOptions[] =
     351    {
     352        /* common options */
     353        { "--name",       'n', RTGETOPT_REQ_STRING },
     354        { "--filename",   'f', RTGETOPT_REQ_STRING }
     355    };
     356
     357    const char *pszVarName = NULL;
     358    const char *pszVarDataFilename = NULL;
     359
     360    RTGETOPTSTATE GetState;
     361    int vrc = RTGetOptInit(&GetState, a->argc - 2, &a->argv[2], s_aOptions, RT_ELEMENTS(s_aOptions), 0, 0);
     362    AssertRCReturn(vrc, RTEXITCODE_FAILURE);
     363
     364    int c;
     365    RTGETOPTUNION ValueUnion;
     366    while ((c = RTGetOpt(&GetState, &ValueUnion)) != 0)
     367    {
     368        switch (c)
     369        {
     370            case 'n':
     371                pszVarName = ValueUnion.psz;
     372                break;
     373            case 'f':
     374                pszVarDataFilename = ValueUnion.psz;
     375                break;
     376            default:
     377                return errorGetOpt(c, &ValueUnion);
     378        }
     379    }
     380
     381    if (!pszVarName)
     382        return errorSyntax("No variable name was given to \"changevar\"");
     383    if (!pszVarDataFilename)
     384        return errorSyntax("No variable data filename was given to \"changevar\"");
     385
     386    RTFILE hFile = NIL_RTFILE;
     387    RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
     388    vrc = RTFileOpen(&hFile, pszVarDataFilename, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_NONE);
     389    if (RT_SUCCESS(vrc))
     390    {
     391        uint64_t cbFile = 0;
     392        vrc = RTFileQuerySize(hFile, &cbFile);
     393        if (RT_SUCCESS(vrc))
     394        {
     395            com::SafeArray<BYTE> aData;
     396            aData.resize(cbFile);
     397
     398            vrc = RTFileRead(hFile, aData.raw(), aData.size(), NULL /*pcbRead*/);
     399            RTFileClose(hFile);
     400
     401            if (RT_SUCCESS(vrc))
     402            {
     403                ComPtr<IUefiVariableStore> uefiVarStore;
     404                CHECK_ERROR2I_RET(nvramStore, COMGETTER(UefiVariableStore)(uefiVarStore.asOutParam()), RTEXITCODE_FAILURE);
     405                CHECK_ERROR2I_RET(uefiVarStore, ChangeVariable(Bstr(pszVarName).raw(), ComSafeArrayAsInParam(aData)), RTEXITCODE_FAILURE);
     406            }
     407            else
     408                rcExit = RTMsgErrorExitFailure("Error reading from '%s': %Rrc", pszVarDataFilename, vrc);
     409        }
     410    }
     411    else
     412       rcExit = RTMsgErrorExitFailure("Error opening '%s': %Rrc", pszVarDataFilename, vrc);
     413
     414    return rcExit;
     415}
     416
     417
     418/**
    291419 * Handles the 'modifynvram' command.
    292420 * @returns Exit code.
     
    344472        rc = handleModifyNvramQueryUefiVar(a, nvramStore) == RTEXITCODE_SUCCESS ? S_OK : E_FAIL;
    345473    }
     474    else if (!strcmp(a->argv[1], "deletevar"))
     475    {
     476        setCurrentSubcommand(HELP_SCOPE_MODIFYNVRAM_DELETEVAR);
     477        rc = handleModifyNvramDeleteUefiVar(a, nvramStore) == RTEXITCODE_SUCCESS ? S_OK : E_FAIL;
     478    }
     479    else if (!strcmp(a->argv[1], "changevar"))
     480    {
     481        setCurrentSubcommand(HELP_SCOPE_MODIFYNVRAM_CHANGEVAR);
     482        rc = handleModifyNvramChangeUefiVar(a, nvramStore) == RTEXITCODE_SUCCESS ? S_OK : E_FAIL;
     483    }
    346484    else
    347485        return errorUnknownSubcommand(a->argv[0]);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette