Ejemplo n.º 1
0
/**
 * @interface_method_impl(PDMINVRAM,pfnStoreNvramValue)
 */
DECLCALLBACK(int) drvNvram_pfnLoadNvramValue(PPDMINVRAM pInterface,
                                             int idxVariable,
                                             RTUUID *pVendorUuid,
                                             char *pcszVariableName,
                                             size_t *pcbVariableName,
                                             uint8_t *pu8Value,
                                             size_t *pcbValue)
{
    int rc = VINF_SUCCESS;
    char szExtraDataKey[256];
    Bstr bstrValue;
    HRESULT hrc;
    LogFlowFunc(("ENTER: idxVariable:%d, *pcbVariableName:%d, *pcbValue:%d\n",
                        idxVariable,
                        *pcbVariableName,
                        *pcbValue));
    PNVRAM pThis = RT_FROM_MEMBER(pInterface, NVRAM, INvram);
    if (!pThis->fPermanentSave)
    {
        rc = VERR_NOT_FOUND;
        LogFlowFuncLeaveRC(rc);
        return rc;
    }


    RT_ZERO(szExtraDataKey);
    RTStrPrintf(szExtraDataKey, 256, "VBoxInternal/Devices/efi/0/LUN#0/Config/NVRAM/%d/VariableName", idxVariable);
    hrc = pThis->pNvram->getParent()->machine()->GetExtraData(Bstr(szExtraDataKey).raw(), bstrValue.asOutParam());
    if (!SUCCEEDED(hrc))
        return VERR_NOT_FOUND;
    *pcbVariableName = RTStrCopy(pcszVariableName, 1024, Utf8Str(bstrValue).c_str());

    RT_ZERO(szExtraDataKey);
    RTStrPrintf(szExtraDataKey, 256, "VBoxInternal/Devices/efi/0/LUN#0/Config/NVRAM/%d/VendorGuid", idxVariable);
    hrc = pThis->pNvram->getParent()->machine()->GetExtraData(Bstr(szExtraDataKey).raw(), bstrValue.asOutParam());
    RTUuidFromStr(pVendorUuid, Utf8Str(bstrValue).c_str());

#if 0
    RT_ZERO(szExtraDataKey);
    RTStrPrintf(szExtraDataKey, 256, "VBoxInternal/Devices/efi/0/LUN#0/Config/NVRAM/%d/VariableValueLength", idxVariable);
    hrc = pThis->pNvram->getParent()->machine()->GetExtraData(Bstr(szExtraDataKey).raw(), bstrValue.asOutParam());
    *pcbValue = Utf8Str(bstrValue).toUInt32();
#endif

    RT_ZERO(szExtraDataKey);
    RTStrPrintf(szExtraDataKey, 256, "VBoxInternal/Devices/efi/0/LUN#0/Config/NVRAM/%d/VariableValue", idxVariable);
    hrc = pThis->pNvram->getParent()->machine()->GetExtraData(Bstr(szExtraDataKey).raw(), bstrValue.asOutParam());
    rc = RTBase64Decode(Utf8Str(bstrValue).c_str(), pu8Value, 1024, pcbValue, NULL);
    AssertRCReturn(rc, rc);

    pThis->cLoadedVariables++;
    LogFlowFuncLeaveRC(rc);
    return rc;
}
Ejemplo n.º 2
0
static void tstBase64(const void *pvData, size_t cbData,
                      const char *pszEnc, size_t cchEnc,
                      int fTextData, int fNormalEnc)
{
    char    szOut[0x10000];
    size_t  cchOut = 0;

    /*
     * Test decoding.
     */
    int rc = RTBase64Decode(pszEnc, szOut, cbData, &cchOut, NULL);
    if (RT_FAILURE(rc))
        RTTestIFailed("RTBase64Decode -> %Rrc", rc);
    else if (cchOut != cbData)
        RTTestIFailed("RTBase64Decode returned %zu bytes, expected %zu.",
                      cchOut, cbData);
    else if (memcmp(szOut, pvData, cchOut))
    {
        if (fTextData)
            RTTestIFailed("RTBase64Decode returned:\n%.*s\nexpected:\n%s\n",
                          (int)cchOut, szOut, pvData);
        else
            RTTestIFailed("RTBase64Decode return mismatching output\n");
    }

    cchOut = RTBase64DecodedSize(pszEnc, NULL);
    if (cchOut != cbData)
        RTTestIFailed("RTBase64DecodedSize returned %zu bytes, expected %zu.\n",
                      cchOut, cbData);

    /*
     * Test encoding.
     */
    rc = RTBase64Encode(pvData, cbData, szOut, cchEnc + 1, &cchOut);
    if (RT_FAILURE(rc))
        RTTestIFailed("RTBase64Encode -> %Rrc\n", rc);
    else if (fNormalEnc && cchOut != cchEnc)
        RTTestIFailed("RTBase64Encode returned %zu bytes, expected %zu.\n",
                      cchOut, cchEnc);
    else if (fNormalEnc && memcmp(szOut, pszEnc, cchOut + 1))
        RTTestIFailed("RTBase64Encode returned:\n%*s\nexpected:\n%s\n",
                      szOut, pszEnc);

    size_t cchOut2 = RTBase64EncodedLength(cbData);
    if (cchOut != cchOut2)
        RTTestIFailed("RTBase64EncodedLength returned %zu bytes, expected %zu.\n",
                      cchOut2, cchOut);

    /** @todo negative testing. */
}