/** * @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; }
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. */ }