DBGCCmdHlp.cpp revision 15c081de8126b14fd40aab0c40ae13303ff234a4
199767f8919635c4928607450d9e0abb932109ceToomas Soome * DBGC - Debugger Console, Command Helpers.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Copyright (C) 2006-2007 innotek GmbH
199767f8919635c4928607450d9e0abb932109ceToomas Soome * This file is part of VirtualBox Open Source Edition (OSE), as
199767f8919635c4928607450d9e0abb932109ceToomas Soome * available from http://www.virtualbox.org. This file is free software;
199767f8919635c4928607450d9e0abb932109ceToomas Soome * you can redistribute it and/or modify it under the terms of the GNU
199767f8919635c4928607450d9e0abb932109ceToomas Soome * General Public License as published by the Free Software Foundation,
199767f8919635c4928607450d9e0abb932109ceToomas Soome * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
199767f8919635c4928607450d9e0abb932109ceToomas Soome * distribution. VirtualBox OSE is distributed in the hope that it will
199767f8919635c4928607450d9e0abb932109ceToomas Soome * be useful, but WITHOUT ANY WARRANTY of any kind.
199767f8919635c4928607450d9e0abb932109ceToomas Soome/*******************************************************************************
199767f8919635c4928607450d9e0abb932109ceToomas Soome* Header Files *
199767f8919635c4928607450d9e0abb932109ceToomas Soome*******************************************************************************/
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Command helper for writing text to the debug console.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @returns VBox status.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pCmdHlp Pointer to the command callback structure.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pvBuf What to write.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param cbBuf Number of bytes to write.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pcbWritten Where to store the number of bytes actually written.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * If NULL the entire buffer must be successfully written.
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic DECLCALLBACK(int) dbgcHlpWrite(PDBGCCMDHLP pCmdHlp, const void *pvBuf, size_t cbBuf, size_t *pcbWritten)
199767f8919635c4928607450d9e0abb932109ceToomas Soome return pDbgc->pBack->pfnWrite(pDbgc->pBack, pvBuf, cbBuf, pcbWritten);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Command helper for writing formatted text to the debug console.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @returns VBox status.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pCmdHlp Pointer to the command callback structure.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pcb Where to store the number of bytes written.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pszFormat The format string.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * This is using the log formatter, so it's format extensions can be used.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param ... Arguments specified in the format string.
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic DECLCALLBACK(int) dbgcHlpPrintf(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, ...)
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Do the formatting and output.
199767f8919635c4928607450d9e0abb932109ceToomas Soome int rc = pCmdHlp->pfnPrintfV(pCmdHlp, pcbWritten, pszFormat, args);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Callback to format non-standard format specifiers.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @returns The number of bytes formatted.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pvArg Formatter argument.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pfnOutput Pointer to output function.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pvArgOutput Argument for the output function.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param ppszFormat Pointer to the format string pointer. Advance this till the char
199767f8919635c4928607450d9e0abb932109ceToomas Soome * after the format specifier.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param pArgs Pointer to the argument list. Use this to fetch the arguments.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param cchWidth Format Width. -1 if not specified.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param cchPrecision Format Precision. -1 if not specified.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param fFlags Flags (RTSTR_NTFS_*).
199767f8919635c4928607450d9e0abb932109ceToomas Soome * @param chArgSize The argument size specifier, 'l' or 'L'.
199767f8919635c4928607450d9e0abb932109ceToomas Soomestatic DECLCALLBACK(size_t) dbgcStringFormatter(void *pvArg, PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
199767f8919635c4928607450d9e0abb932109ceToomas Soome const char **ppszFormat, va_list *pArgs, int cchWidth,
199767f8919635c4928607450d9e0abb932109ceToomas Soome int cchPrecision, unsigned fFlags, char chArgSize)
199767f8919635c4928607450d9e0abb932109ceToomas Soome NOREF(cchWidth); NOREF(cchPrecision); NOREF(fFlags); NOREF(chArgSize); NOREF(pvArg);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Print variable without range.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * The argument is a const pointer to the variable.
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%%VGv", pVar->u.GCFlat);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%04x:%08x", pVar->u.GCFar.sel, pVar->u.GCFar.off);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%%%%VGp", pVar->u.GCPhys);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%#%VHv", (uintptr_t)pVar->u.pvHCFlat);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "#%04x:%08x", pVar->u.HCFar.sel, pVar->u.HCFar.off);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "#%%%%%VHp", pVar->u.HCPhys);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return pfnOutput(pvArgOutput, pVar->u.pszString, (size_t)pVar->u64Range);
199767f8919635c4928607450d9e0abb932109ceToomas Soome return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%llx", pVar->u.u64Number);
199767f8919635c4928607450d9e0abb932109ceToomas Soome * Print variable with range.
199767f8919635c4928607450d9e0abb932109ceToomas Soome * The argument is a const pointer to the variable.
case DBGCVAR_RANGE_ELEMENTS:
case DBGCVAR_RANGE_BYTES:
case DBGCVAR_TYPE_GC_FLAT:
case DBGCVAR_TYPE_GC_FAR:
return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%04x:%08x%s", pVar->u.GCFar.sel, pVar->u.GCFar.off, szRange);
case DBGCVAR_TYPE_GC_PHYS:
case DBGCVAR_TYPE_HC_FLAT:
return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%%#%VHv%s", (uintptr_t)pVar->u.pvHCFlat, szRange);
case DBGCVAR_TYPE_HC_FAR:
return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "#%04x:%08x%s", pVar->u.HCFar.sel, pVar->u.HCFar.off, szRange);
case DBGCVAR_TYPE_HC_PHYS:
case DBGCVAR_TYPE_STRING:
case DBGCVAR_TYPE_NUMBER:
case DBGCVAR_TYPE_UNKNOWN:
if (cbChars)
cbChars = 0;
return cbChars;
static DECLCALLBACK(int) dbgcHlpPrintfV(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, va_list args)
if (pcbWritten)
static DECLCALLBACK(int) dbgcHlpVBoxErrorV(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, va_list args)
switch (rc)
case VINF_SUCCESS:
return rc;
return rcRet;
static DECLCALLBACK(int) dbgcHlpMemRead(PDBGCCMDHLP pCmdHlp, PVM pVM, void *pvBuffer, size_t cbRead, PCDBGCVAR pVarPointer, size_t *pcbRead)
if (cbRead == 0)
if (*pcbRead)
*pcbRead = 0;
return VINF_SUCCESS;
case DBGCVAR_TYPE_GC_FAR:
return rc;
return VERR_OUT_OF_SELECTOR_BOUNDS;
return VERR_OUT_OF_SELECTOR_BOUNDS;
return VERR_OUT_OF_SELECTOR_BOUNDS;
if (!pcbRead)
return VERR_OUT_OF_SELECTOR_BOUNDS;
case DBGCVAR_TYPE_GC_FLAT:
case DBGCVAR_TYPE_GC_PHYS:
case DBGCVAR_TYPE_HC_FLAT:
case DBGCVAR_TYPE_HC_PHYS:
return VERR_NOT_IMPLEMENTED;
case DBGCVAR_TYPE_HC_FLAT: cb = RT_MIN(cb, PAGE_SIZE - ((uintptr_t)Var.u.pvHCFlat & PAGE_OFFSET_MASK)); break;
case DBGCVAR_TYPE_HC_PHYS: cb = RT_MIN(cb, PAGE_SIZE - ((size_t)Var.u.HCPhys & PAGE_OFFSET_MASK)); break; /* size_t: MSC has braindead loss of data warnings! */
int rc;
case DBGCVAR_TYPE_GC_FLAT:
case DBGCVAR_TYPE_GC_PHYS:
case DBGCVAR_TYPE_HC_PHYS:
case DBGCVAR_TYPE_HC_FLAT:
case DBGCVAR_TYPE_HC_FAR:
rc = 0;
return VINF_SUCCESS;
return rc;
if (!cbLeft)
return VINF_SUCCESS;
return rc;
if (pcbRead)
static DECLCALLBACK(int) dbgcHlpMemWrite(PDBGCCMDHLP pCmdHlp, PVM pVM, const void *pvBuffer, size_t cbWrite, PCDBGCVAR pVarPointer, size_t *pcbWritten)
return VERR_NOT_IMPLEMENTED;
static DECLCALLBACK(int) dbgcHlpEval(PDBGCCMDHLP pCmdHlp, PDBGCVAR pResult, const char *pszExpr, ...)
size_t cb = RTStrPrintfExV(dbgcStringFormatter, pDbgc, szExprFormatted, sizeof(szExprFormatted), pszExpr, args);
size_t cb = RTStrPrintfExV(dbgcStringFormatter, pDbgc, pDbgc->pszScratch, cbScratch, pszExpr, args);
return VERR_BUFFER_OVERFLOW;
return rc;
static DECLCALLBACK(int) dbgcHlpVarToDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PDBGFADDRESS pAddress)
case DBGCVAR_TYPE_STRING:
*pf = true;
return VINF_SUCCESS;
*pf = false;
return VINF_SUCCESS;
case DBGCVAR_TYPE_GC_FLAT:
case DBGCVAR_TYPE_GC_PHYS:
case DBGCVAR_TYPE_HC_FLAT:
case DBGCVAR_TYPE_HC_PHYS:
case DBGCVAR_TYPE_NUMBER:
return VINF_SUCCESS;
case DBGCVAR_TYPE_HC_FAR:
case DBGCVAR_TYPE_GC_FAR:
case DBGCVAR_TYPE_SYMBOL:
return VERR_PARSE_INCORRECT_ARG_TYPE;