DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb) { /* * Try a READ_CAPACITY command... */ struct { uint32_t cBlocks; uint32_t cbBlock; } Buf = {0, 0}; uint32_t cbBuf = sizeof(Buf); uint8_t abCmd[16] = { SCSI_READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0 }; int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_FROM_DEVICE, &Buf, &cbBuf, NULL, 0, 0); if (RT_SUCCESS(rc)) { Assert(cbBuf == sizeof(Buf)); Buf.cBlocks = RT_BE2H_U32(Buf.cBlocks); Buf.cbBlock = RT_BE2H_U32(Buf.cbBlock); //if (Buf.cbBlock > 2048) /* everyone else is doing this... check if it needed/right.*/ // Buf.cbBlock = 2048; pThis->Os.cbBlock = Buf.cbBlock; *pcb = (uint64_t)Buf.cBlocks * Buf.cbBlock; } return rc; }
/** * Initializes the auW array from the specfied input block. * * @param pCtx The SHA1 context. * @param pbBlock The block. Must be 32-bit aligned. */ DECLINLINE(void) rtSha1BlockInit(PRTSHA1CONTEXT pCtx, uint8_t const *pbBlock) { #ifdef RTSHA1_UNROLLED uint32_t const *puSrc = (uint32_t const *)pbBlock; uint32_t *puW = &pCtx->AltPrivate.auW[0]; Assert(!((uintptr_t)puSrc & 3)); Assert(!((uintptr_t)puW & 3)); /* Copy and byte-swap the block. Initializing the rest of the Ws are done in the processing loop. */ # ifdef RT_LITTLE_ENDIAN *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); *puW++ = ASMByteSwapU32(*puSrc++); # else memcpy(puW, puSrc, RTSHA1_BLOCK_SIZE); # endif #else /* !RTSHA1_UNROLLED */ uint32_t const *pu32Block = (uint32_t const *)pbBlock; Assert(!((uintptr_t)pu32Block & 3)); unsigned iWord; for (iWord = 0; iWord < 16; iWord++) pCtx->AltPrivate.auW[iWord] = RT_BE2H_U32(pu32Block[iWord]); for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++) { uint32_t u32 = pCtx->AltPrivate.auW[iWord - 16]; u32 ^= pCtx->AltPrivate.auW[iWord - 14]; u32 ^= pCtx->AltPrivate.auW[iWord - 8]; u32 ^= pCtx->AltPrivate.auW[iWord - 3]; pCtx->AltPrivate.auW[iWord] = ASMRotateLeftU32(u32, 1); } #endif /* !RTSHA1_UNROLLED */ }
static int GetKeyCount(uint32_t *pcKeys) { SMCPARAM In; SMCPARAM Out; RT_ZERO(In); RT_ZERO(Out); In.KeyInfo.cbData = sizeof(uint32_t); int rc = CallSmc(kSMCGetKeyCount, &In, &Out); if (RT_SUCCESS(rc)) *pcKeys = RT_BE2H_U32(Out.u32Data); else *pcKeys = 1; return rc; }
static void DisplayKey(SMCPARAM *pKey) { pKey->uKey.u = RT_BE2H_U32(pKey->uKey.u); pKey->KeyInfo.uDataType.u = RT_BE2H_U32(pKey->KeyInfo.uDataType.u); RTPrintf("key=%4.4s type=%4.4s cb=%#04x fAttr=%#04x", pKey->uKey.au8, pKey->KeyInfo.uDataType.au8, pKey->KeyInfo.cbData, pKey->KeyInfo.fAttr); if (pKey->uResult == kSMCSuccess) { bool fPrintable = true; for (uint32_t off = 0; off < pKey->KeyInfo.cbData; off++) if (!RT_C_IS_PRINT(pKey->abValue[off])) { fPrintable = false; break; } if (fPrintable) RTPrintf(" %.*s\n", pKey->KeyInfo.cbData, pKey->abValue); else RTPrintf(" %.*Rhxs\n", pKey->KeyInfo.cbData, pKey->abValue); } else if (pKey->uResult == 0x85) RTPrintf(" <not readable>\n"); }
/** * Initializes the auW array from data buffered in the first part of the array. * * @param pCtx The SHA1 context. */ DECLINLINE(void) rtSha1BlockInitBuffered(PRTSHA1CONTEXT pCtx) { #ifdef RTSHA1_UNROLLED uint32_t *puW = &pCtx->AltPrivate.auW[0]; Assert(!((uintptr_t)puW & 3)); /* Do the byte swap if necessary. Initializing the rest of the Ws are done in the processing loop. */ # ifdef RT_LITTLE_ENDIAN *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; *puW = ASMByteSwapU32(*puW); puW++; # endif #else /* !RTSHA1_UNROLLED_INIT */ unsigned iWord; for (iWord = 0; iWord < 16; iWord++) pCtx->AltPrivate.auW[iWord] = RT_BE2H_U32(pCtx->AltPrivate.auW[iWord]); for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++) { uint32_t u32 = pCtx->AltPrivate.auW[iWord - 16]; u32 ^= pCtx->AltPrivate.auW[iWord - 14]; u32 ^= pCtx->AltPrivate.auW[iWord - 8]; u32 ^= pCtx->AltPrivate.auW[iWord - 3]; pCtx->AltPrivate.auW[iWord] = ASMRotateLeftU32(u32, 1); } #endif /* !RTSHA1_UNROLLED_INIT */ }
/** * Looks up a key by index and copies its name (and attributes) into the CurKey. * * @returns Apple SMC Status Code. * @param pThis The SMC instance data. */ static uint8_t smcKeyGetByIndex(PDEVSMC pThis) { uint8_t bRc; uint32_t iKey = RT_BE2H_U32(pThis->CurKey.Key.u32); if (iKey < RT_ELEMENTS(g_aSmcKeys) - SMC_KEYIDX_FIRST_ENUM) { pThis->CurKey.Key = g_aSmcKeys[iKey].Key; pThis->CurKey.Type = g_aSmcKeys[iKey].Type; pThis->CurKey.fAttr = g_aSmcKeys[iKey].fAttr; pThis->CurKey.cbValue = g_aSmcKeys[iKey].cbValue; RT_ZERO(pThis->CurKey.Value); Log(("smcKeyGetByIndex: %#x -> %c%c%c%c\n", iKey, pThis->CurKey.Key.ab[3], pThis->CurKey.Key.ab[2], pThis->CurKey.Key.ab[1], pThis->CurKey.Key.ab[0])); bRc = SMC_STATUS_CD_SUCCESS; } else { Log(("smcKeyGetByIndex: Key out or range: %#x, max %#x\n", iKey, RT_ELEMENTS(g_aSmcKeys) - SMC_KEYIDX_FIRST_ENUM)); bRc = SMC_STATUS_CD_KEY_NOT_FOUND; } return bRc; }